У меня есть список объектов QObject, действующих в качестве модели qml для ListView. Я могу изменить их свойства, но не могу вызывать слоты или методы Q_INVOKABLE. Это минимальный пример для моей проблемы (грустно, что он все еще довольно большой).
Определите действительно простой класс со свойством и вызываемым методом
// DummyObject.h
class DummyElem : public QObject
{
Q_OBJECT
Q_PROPERTY(QString dummy READ getDummy CONSTANT)
public:
explicit DummyElem(QObject *parent = nullptr);
QString getDummy();
Q_INVOKABLE void notifyStuff();
};
Реализуйте тривиальные методы этого простого класса
// DummyObject.cpp
#include "DummyElem.h"
#include <QDebug>
DummyElem::DummyElem(QObject *parent) : QObject(parent) {}
QString DummyElem::getDummy() {return "lorem";}
void DummyElem::notifyStuff() {qDebug() << "ipsum";}
Запустите приложение qml со списком в качестве корневого свойства. Точно скопировано из учебника, в котором они назвали методы q_incokable.
// main.cpp
#include "DummyElem.h"
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QList<QObject*> dataList;
dataList.append(new DummyElem);
dataList.append(new DummyElem);
QQmlApplicationEngine engine;
QQmlContext* context = engine.rootContext();
context->setContextProperty("dataModel", QVariant::fromValue(dataList));
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
Опишите макет qml с ListView и делегатом, который при нажатии вызывает метод c ++.
// main.qml
import QtQuick 2.7
import QtQuick.Window 2.2
Window {
visible: true
ListView {
anchors.fill: parent
model: dataModel
delegate: Component {
Text {
text: model.dummy
MouseArea {
anchors.fill: parent
onClicked: {model.notifyStuff()}
}
}
}
}
}
Проблема трудна для отладки, так как модель класса c ++ не может быть json-strigified, и при этом я не могу получить ее записи javascript (). Ошибка, которую я получаю: «undefined - это не функция», что тоже круто.
Я попытался зарегистрировать тип Qt в QML, но это тоже ничего не дало.
Я использую библиотеки Qt версии 5.9.4, но в поле «Требуется минимальная версия Qt» в QtCreator установлено значение «Qt 5.6».