gpt4 book ai didi

c++ - 无法从 QQmlPropertyMap 的子类中的 QML 调用插槽或 Q_INVOKABLE

转载 作者:可可西里 更新时间:2023-11-01 17:59:39 28 4
gpt4 key购买 nike

我正在尝试测试 QQmlPropertyMap 类。如果我可以将它子类化,它似乎可以很好地满足我的需求。文档 here甚至给出了一些关于如何对其进行子类化的基本说明。所述文档还指出此类派生自 QObject

为了它的值(value),我在带有 QtQuick 2.0 的 Qt 5.0.0 上使用 QtCreator 2.6.1。

我的 main.qml:

import QtQuick 2.0

Rectangle {
width: 360
height: 360
Text {
text: owner.field
anchors.centerIn: parent
}
MouseArea {
anchors.fill: parent
onClicked: {
owner.testFunc();
}
}
}

我的 main.cpp:

#include <QtGui/QGuiApplication>
#include "qtquick2applicationviewer.h"
#include "TestMap.h"
#include <QQmlContext>

int main(int argc, char *argv[])
{
TestMap* map = new TestMap();
QGuiApplication app(argc, argv);
QtQuick2ApplicationViewer viewer;
QQmlContext* ctxt = viewer.rootContext();
ctxt->setContextProperty("owner", map);
viewer.setMainQmlFile(QStringLiteral("qml/TestMap/main.qml"));
viewer.showExpanded();
return app.exec();
}

我的TestMap.h

#ifndef TESTMAP_H
#define TESTMAP_H

#include <QObject>
#include <QQmlPropertyMap>
#include <QDebug>

class TestMap: public QQmlPropertyMap // QObject
{
Q_OBJECT

public:
TestMap(QObject* parent = 0): QQmlPropertyMap(this, parent) // QObject(parent)
{
insert("field", "value"); // Comment this out
}
TestMap(const TestMap& value) { }
virtual ~TestMap() {}

public slots:
void testFunc()
{
qDebug() << "Success!";
}
};

Q_DECLARE_METATYPE(TestMap)
#endif

当我运行时,如我所料,我会看到一个显示“值”的窗口。但是当我点击窗口时,我得到一个控制台输出说

TypeError: Property 'testFunc' of object TestMap(0xaaa0b8) is not a function

我寻找过类似的问题,但所有搜索结果都是关于忘记包含 Q_OBJECT 宏的人。这一定是我在代码中做错了什么,因为如果我进行了 TestMap 文件注释中指示的所有更改(并保持 main.cpp 和 main.qml 原样不变),我会得到 我期望的 qDebug 消息。

我不确定我是否应该 Q_DECLARE_METATYPE 或不(我认为 2-arg 保护构造函数应该为我做),但无论哪种方式都不起作用.

郑重声明,要使其正常工作,我唯一需要更改的是:

1) 派生自 QObject 而不是 QQmlPropertyMap

2) 将构造函数更改为:

TestMap(QObject* parent = 0): QObject(parent) {}

就是这样。因为当我不更改 main.cpp、main.qml 或插槽本身时它会起作用,所以我不得不得出结论,这些都没有问题。谁能告诉我我做错了什么?

最佳答案

此问题现已在 Qt 5.1.0 及更高版本中修复。有关详细信息,请参阅以下代码审查网址:

https://codereview.qt-project.org/#change,57418

关于c++ - 无法从 QQmlPropertyMap 的子类中的 QML 调用插槽或 Q_INVOKABLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15016258/

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