gpt4 book ai didi

c++ - 无法在 QML ListView 中调用 Qt c++ 方法

转载 作者:行者123 更新时间:2023-11-30 03:19:04 25 4
gpt4 key购买 nike

我有一个 QObject 列表作为 ListView 的 qml 模型。我可以很好地更改它们的属性,但不能调用任何插槽或 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++ 方法的委托(delegate)。
    // 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 entries()。我得到的错误是“undefined is not a function”,这也很酷。我尝试在 QML 中注册 Qt 类型,但这也没有做任何事情。

我使用的是 Qt 库版本 5.9.4,但 QtCreator 中的“所需的最低 qt 版本”框设置为“Qt 5.6”。

最佳答案

您需要使用modelData。我不完全确定为什么,很可能是因为 QVariantList。您可以在 this page 上阅读更多内容.

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 更能说明问题,但我认为仍然没有完全描述。

关于c++ - 无法在 QML ListView 中调用 Qt c++ 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54123635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com