我正在尝试测试驱动
我的main.qml:
当我运行时,我得到一个显示“value”的窗口,这是我预期的。但当我点击窗口时,我会在控制台输出:
QQmlPropertyMap
类。如果我可以对它进行子类化,它似乎非常适合我想要的功能。 这里的文档甚至提供了一些初步说明以进行子类化。该文档还指出,此类派生自QObject
。
值得一提的是,我正在使用QtCreator 2.6.1在Qt 5.0.0和QtQuick 2.0上运行。我的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
当我运行时,我得到一个显示“value”的窗口,这是我预期的。但当我点击窗口时,我会在控制台输出:
TypeError: Property 'testFunc' of object TestMap(0xaaa0b8) is not a function
我搜索了类似的问题,但是所有的搜索结果都是关于忘记包含 Q_OBJECT
宏定义的人。这说明问题可能是我在代码中做错了什么,因为如果按照 TestMap 文件中的注释所示做出所有更改(并且完全保留 main.cpp 和 main.qml),我会得到我期望的 qDebug
信息。
我不确定是否应该使用 Q_DECLARE_METATYPE
(我认为两个参数的受保护构造函数应该已经替我完成了这个工作),但无论哪种方式都不起作用。
记录一下,我必须更改的唯一内容是:
1)从 QQmlPropertyMap
派生为 QObject
。
2)将构造函数更改为:
TestMap(QObject* parent = 0): QObject(parent) {}
就是这样。既然在不更改main.cpp、main.qml或插槽本身的任何内容时它能工作,我必须得出结论:这些都没有问题。有谁能告诉我我做错了什么吗?