所以,我已经做了一些搜索,我读过的类似问题都没有提出有效的建议.
我正在使用Qt Creator(而且我对Qt不太熟悉)所以我不确定它在后台做了什么伏都教.但是,我正在使用标准的Qt Quick Application项目.
本质上,我想从QML调用一个C++函数,它返回一个字符串,定期替换布局中的一些文本.
这是main.cpp:
#include <QtGui/QApplication>
#include "qmlapplicationviewer.h"
#include <QDeclarativeContext>
class testClass : public QObject
{
Q_OBJECT
public:
Q_INVOKABLE QString gimmeText() {
return QString("new text");
}
};
Q_DECL_EXPORT int main(int argc, char *argv[])
{
QScopedPointer<QApplication> app(createApplication(argc, argv));
QmlApplicationViewer viewer;
viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
viewer.setMainQmlFile(QLatin1String("qml/Picenter2/main.qml"));
testClass t;
viewer.rootContext()->setContextProperty("testOb", &t);
viewer.showFullScreen();
return app->exec();
}
Run Code Online (Sandbox Code Playgroud)
这里有一个布局片段(因为大部分内容显然无关紧要):
Text {
id: text1
x: 105
y: 156
color: "#ffffff"
text: qsTr("text")
font.pixelSize: 12
Timer {
interval: 1000; running: true; repeat: false
onTriggered: text1.text = testOb.gimmeText();
}
Run Code Online (Sandbox Code Playgroud)
给出的错误是:
invalid use of incomplete type 'struct QDeclarativeContext' main.cpp (28)
forward declaration of 'struct QDeclarativeContext' qdeclarativeview.h (60)
Run Code Online (Sandbox Code Playgroud)
编辑:包含QDeclarativeContext,上面消失了,给出了这些错误:
(.text.startup+0x3e):-1: error: undefined reference to `vtable for testClass'
(.text.startup+0xcf):-1: error: undefined reference to `vtable for testClass'
(.text.startup+0x12b):-1: error: undefined reference to `vtable for testClass'
:-1: error: collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我没有做太多的C++编程,所以我并不完全熟悉这意味着什么.以下针对基本相同问题的建议只给了我错误或更难以理解的事情.
让我感到困惑的是,查看头文件,QmlApplicationViewer派生自QDeclarativeView,这正是Qt文档在这里使用的几乎完全符合我的要求.感谢任何人的建议.
您必须注册您的课程才能将其与QML一起使用.您可以在main函数中执行此操作.您还必须在QML代码中导入它.您的代码应如下所示:
main.cpp:
#include <QtGui/QApplication>
#include "qmlapplicationviewer.h"
#include <QDeclarativeContext>
#include <QtDeclarative> // Required for registration
class testClass : public QObject
{
Q_OBJECT
public:
Q_INVOKABLE QString gimmeText() {
return QString("new text");
}
};
Q_DECL_EXPORT int main(int argc, char *argv[])
{
QScopedPointer<QApplication> app(createApplication(argc, argv));
qmlRegisterType<testClass>("MyCustomQMLObjects", 2, 35, "testClassNameInQML");
QmlApplicationViewer viewer;
viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
viewer.setMainQmlFile(QLatin1String("qml/Picenter2/main.qml"));
testClass t;
viewer.rootContext()->setContextProperty("testOb", &t);
viewer.showFullScreen();
return app->exec();
}
Run Code Online (Sandbox Code Playgroud)
QML代码:
// ...
import MyCustomQMLObjects 2.35
// ...
property testClassNameInQML testOb
// ...
Text {
id: text1
x: 105
y: 156
color: "#ffffff"
text: qsTr("text")
font.pixelSize: 12
Timer {
interval: 1000; running: true; repeat: false
onTriggered: text1.text = testOb.gimmeText();
}
// ...
Run Code Online (Sandbox Code Playgroud)
我没有经验qt,也看不到代码中的内容触发了错误。然而,当发生此类错误时,这是因为类(struct QDeclarativeContext)已被前向声明,但使用时就好像整个定义已知(访问成员、声明此类型的变量等)。要解决此问题,您需要包含具有此类型定义的标头。