Ответ 1
Я думаю, было бы лучше, если вы проверите этот учебник:
http://doc.qt.io/qt-4.8/qtbinding.html
особенно этот раздел:
http://doc.qt.io/qt-4.8/qtbinding.html#receiving-signals
Я думаю, что ваша ошибка в этом случае может заключаться в том, что вы не объявили ее слотом или вы не сделали его invocable. Оба варианта описаны в учебнике Qt.
Кроме того, вам необходимо использовать QVariant для обмена данными между С++ и QML. Вы также можете регистрировать типы, например. Виджеты и прочее, так что вы можете использовать их в QML как "родной" тип, например прямоугольник. В большинстве случаев это не рекомендуется, за исключением случаев, когда вам нужен какой-то определенный extern-класс или некоторые данные, которые вы не можете отобразить иначе в вашем QML-интерфейсе.
Причиной для QVariant является подход QML, основанный на Script. QVariant в основном содержит ваши данные и описание типа данных, поэтому QML знает, как правильно его обрабатывать. Вот почему вам нужно указать параметр в QML с String, int и т.д. Но исходный обмен данными с С++ остается QVariant
Ранее я использовал qmlRegisterType, но это очень неудобное решение для простых типов данных. Он скорее используется для более сложных данных, таких как пользовательские элементы Widgets, Canvas или Video, которые QML не поддерживает или не поддерживает QStandardItemModels
. Это более удобный способ обмена данными между QML и С++ и не требует сигналов или слотов в первом экземпляре, потому что QStandardItemModel автоматически обновляет графический интерфейс. Для использования QStandardItemModel вам необходимо зарегистрировать Type с qmlRegisterType... Затем модель может использоваться в представлениях на основе моделей, таких как ListView и т.д.
Я приложил учебник для этого раздела, он описывает, как использовать QListModel.