Сигнал C ++ в слот QML в QT
-
27-10-2019 - |
Вопрос
Я хочу отправить сигнал из 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)
Решение
Я думаю, было бы лучше, если бы вы проверили этот урок:
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 со строкой, int и т. Д., но исходный обмен данными с C ++ остается Qvariant
Я использовал QMLGisterType раньше, но это очень неудобное решение для простых типов данных. Он скорее используется для более сложных данных, таких как пользовательские виджеты, холст или видео -элементы, которые QML не поддерживает или расширяется QStandardItemModels
Анкет Это более удобный способ обмена данными между QML и C ++ и не нуждается в сигналах или слотах в первом случае, поскольку QstandarditemModel автоматически обновляет графический интерфейс. Для использования qstandarditemmodel вам необходимо зарегистрировать тип с помощью qmlgistertype .... Затем модель можно использовать в модельных представлениях, таких как ListView и т. Д.
Я приложил учебник для этой темы, в нем описывается, как использовать Qlistmodel.
Другие советы
Вы должны использовать Соединения В этом случае (возможно, это единственный способ подключиться).
Поместите свой объект myobj в QML -файл
setContextProperty
qmlVectorForm->rootContext()->setContextProperty("YourObject", myOb);
Ваш сигнал есть
finishedGatheringDataForItem(QString signalString)
В файле QML добавьте Connectios Likes ниже:
Connections { target: YourObject onFinishedGatheringDataForItem: { qmlString = signalString } }