Сигнал C ++ для слота QML в Qt
Я хочу отправить сигнал из C ++ в слот в моем файле QML. Я уже работал без параметров примитивного типа, хотя, если я хочу отправить QString
в свой QML-слот, я получаю сообщение об ошибке при подключении.
Я подключаюсь в main.cpp
QObject *contentView = rootObject->findChild(QString("contentView")); QObject::connect(&myObj, SIGNAL(finishedGatheringDataForItem(QString)), contentView, SLOT(updateViewWithItem(QString)));
relavant часть моего файла qml
- Объявлять абстрактный сигнал в classе интерфейса
- Как создать полосу прокрутки в QtQuick 2.0?
- Может ли Qt-сигналы вернуть значение?
- Как сообщить QWebPage не загружать определенные типы ресурсов?
- Возможно ли подключить сигнал к статическому слоту без экземпляра приемника?
Rectangle { objectName: "contentView" function updateViewWithItem(string) { console.log('got some Items'); } // slot }
Ошибка:
Object::connect: No such slot QDeclarativeRectangle_QML_2::updateViewWithItem(QString)
- Qt сигнализирует по streamам, один - stream GUI?
- Как создать универсальную модель объекта для использования в QML?
- Обнаруживать, является ли stdin терминалом или трубой?
- Каков наиболее эффективный способ отображения декодированных видеокадров в Qt?
- QListView / QListWidget с настраиваемыми элементами и пользовательскими виджетами элементов
- Как указать разные каталоги вывода отладки / выпуска в файле QMake .pro
- Неблокирующий рабочий - копия файла прерывания
- Совместимость Ncurses и Qt
Я думаю, было бы лучше, если вы проверите этот учебник:
http://doc.qt.io/qt-4.8/qtbinding.html
особенно этот раздел:
http://doc.qt.io/qt-4.8/qtbinding.html#receiving-signals
Я думаю, что ваша ошибка в этом случае может заключаться в том, что вы не объявили ее слотом или вы не сделали его invocable. Оба варианта описаны в учебнике Qt.
Кроме того, вам необходимо использовать QVariant для обмена данными между C ++ и QML. Вы также можете регистрировать типы, например, виджеты и прочее, чтобы их можно использовать в QML как «родной» тип, например прямоугольник. В большинстве случаев это не рекомендуется, за исключением случаев, когда вам нужен какой-то определенный extern-class или некоторые данные, которые вы не можете отобразить иначе в вашем QML-интерфейсе.
Причиной для QVariant является подход QML, основанный на сценарии. QVariant в основном содержит ваши данные и описание типа данных, поэтому QML знает, как правильно его обрабатывать. Вот почему вы должны указать параметр в QML с помощью String, int и т. Д. Но исходный обмен данными с C ++ остается QVariant
Раньше я использовал qmlRegisterType, но это очень неудобное решение для простых типов данных. Он скорее используется для более сложных данных, таких как пользовательские элементы Widgets, Canvas или Video, которые QML не поддерживает или не расширяет QStandardItemModels
. Это более удобный способ обмена данными между QML и C ++ и не требует сигналов или слотов в первом экземпляре, потому что QStandardItemModel автоматически обновляет графический интерфейс. Для использования QStandardItemModel вам необходимо зарегистрировать Type с qmlRegisterType … Затем модель может использоваться в представлениях на основе моделей, таких как ListView и т. Д.
Я приложил учебник для этой темы, в котором описано, как использовать QListModel.
Вы должны использовать Connections в этом случае (возможно, это единственный способ подключения).
-
Поместите свой объект myObj в QML-файл с помощью “ setContextProperty
qmlVectorForm->rootContext()->setContextProperty("YourObject", myOb);
-
Ваш сигнал
finishedGatheringDataForItem(QString signalString)
-
В файле QML добавьте Connections ниже:
Connections { target: YourObject onFinishedGatheringDataForItem: { qmlString = signalString } }