Сигнал C ++ в QML-слот в Qt - PullRequest
       42

Сигнал C ++ в QML-слот в Qt

48 голосов
/ 12 января 2012

Я хочу отправить сигнал из C ++ в слот в моем файле QML.Я уже получил его без параметров примитивного типа, хотя, если я хочу отправить QString в мой слот QML, я получаю ошибку при подключении.

Я подключаюсь в main.cpp

QObject *contentView = rootObject->findChild<QObject*>(QString("contentView"));
QObject::connect(&myObj,      SIGNAL(finishedGatheringDataForItem(QString)), 
                 contentView, SLOT(updateViewWithItem(QString)));

соответствующая часть моего файла qml

Rectangle {
        objectName: "contentView"
        function updateViewWithItem(string) { console.log('got some Items'); }  // slot
}

Ошибка:

Object::connect: No such slot QDeclarativeRectangle_QML_2::updateViewWithItem(QString)

Ответы [ 2 ]

34 голосов
/ 12 января 2012

Я думаю, что было бы лучше, если вы посмотрите этот урок:

http://doc.qt.io/qt-4.8/qtbinding.html

особенно этот раздел:

http://doc.qt.io/qt-4.8/qtbinding.html#receiving-signals

Я думаю, что ваша ошибка в этом случае может заключаться в том, что вы не объявили его как слот или не сделали его доступным для вызова. Обе опции описаны в учебнике по Qt.

Кроме того, вам нужно использовать QVariant для обмена данными между C ++ и QML. Вы также можете зарегистрировать типы, например, Виджеты и прочее, так что вы можете использовать их в QML как «родной» тип, например, прямоугольник. В большинстве случаев это не рекомендуется, за исключением случаев, когда вам нужен какой-то определенный внешний класс или некоторые данные, которые вы не можете иначе отобразить в своем интерфейсе QML.

Причиной использования QVariant является основанный на сценариях подход QML. QVariant в основном содержит ваши данные и описание типа данных, так что QML знает, как правильно с ним обращаться. Вот почему вы должны указать параметр в QML с помощью String, int и т. Д. Но исходный обмен данными с C ++ остается QVariant

Я уже использовал qmlRegisterType, но это очень неудобное решение для простых типов данных. Скорее, он используется для более сложных данных, таких как пользовательские виджеты, элементы Canvas или Video, которые QML не поддерживает или расширяет QStandardItemModels. Это более удобный способ обмена данными между QML и C ++ и не требует сигналов или слотов в первую очередь, потому что QStandardItemModel обновляет графический интерфейс автоматически. Для использования QStandardItemModel вам необходимо зарегистрировать тип с помощью qmlRegisterType ... Модель затем может быть использована в основанных на модели представлениях, таких как ListView и т.д.

Я приложил учебник для этой темы, он описывает, как использовать QListModel.

http://doc.qt.io/qt-4.8/qdeclarativemodels.html

33 голосов
/ 23 марта 2015

Вы должны использовать Соединения в этом случае (возможно, это единственный способ подключения).

  1. Поместите ваш объект myObj в файл QML с помощью setContextProperty

    qmlVectorForm->rootContext()->setContextProperty("YourObject", myOb);
    
  2. Ваш сигнал

    finishedGatheringDataForItem(QString signalString)
    
  3. В QML-файл добавьте следующие ссылки на Connectios:

    Connections {
        target: YourObject 
        onFinishedGatheringDataForItem: {
            qmlString = signalString
        }
    }
    
...