Вопрос

Я хочу отправить сигнал из 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.

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

Другие советы

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

  1. Поместите свой объект myobj в QML -файл setContextProperty

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

    finishedGatheringDataForItem(QString signalString)
    
  3. В файле QML добавьте Connectios Likes ниже:

    Connections {
        target: YourObject 
        onFinishedGatheringDataForItem: {
            qmlString = signalString
        }
    }
    
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top