Не удается вызвать метод Qt c ++ в QML ListView - PullRequest
0 голосов
/ 10 января 2019

У меня есть список объектов 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».

1 Ответ

0 голосов
/ 10 января 2019

Вам нужно использовать modelData. Я не совсем уверен, почему, скорее всего, из-за QVariantList. Вы можете прочитать немного больше на этой странице .

Window {
    visible: true

    ListView {
        anchors.fill: parent
        model: dataModel
        delegate: Component {
            Text {
                text: modelData.dummy

                MouseArea {
                    anchors.fill: parent
                    onClicked: modelData.notifyStuff();
                }
            }
        }
    }
}

Интересный факт: это ошибка, которую я получаю на Qt 5.11.3:

TypeError: Property 'notifyStuff' of object QQmlDMObjectData(0x5585fe567650) is not a function

По крайней мере, немного более красноречиво, чем undefined, но все же не совсем описательно, я бы сказал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...