我有一个使用 QML 的 QWidget 应用程序。我有一个类用于公开我们的一些组织实用功能。
我将问题归结为以下代码(我将在代码下方解释我的问题):
首先,这是main.cpp
文件(为简洁起见,我排除了大部分文件includes
):
#include "main.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow window;
window.show();
return app.exec();
}
这是包括的main.h
:
class MyUtils : public QObject
{
Q_OBJECT
public:
MyUtils(QObject* parent = nullptr)
: QObject(parent)
{
}
virtual ~MyUtils() = default;
Q_INVOKABLE QString doSomething()
{
return QString("I did something!");
}
static QObject* MyUtilsProvider(QQmlEngine *engine, QJSEngine *scriptEngine)
{
Q_UNUSED(engine)
Q_UNUSED(scriptEngine)
qDebug() << "MyUtils Invoked!";
return new MyUtils();
}
};
class MyView : public QQuickWidget
{
Q_OBJECT
public:
MyView(QWidget* parent = nullptr)
: QQuickWidget(parent)
{
setResizeMode(QQuickWidget::SizeRootObjectToView);
setSource(QUrl("qrc:/main.qml"));
}
virtual ~MyView() = default;
};
class MainWindow : public QMainWindow
{
Q_OBJECT
QTabWidget _tabView;
public:
MainWindow(QWidget * parent = 0)
: QMainWindow(parent)
{
qmlRegisterSingletonType<MyUtils>("MyUtilities", 1, 0, "myutils", &MyUtils::MyUtilsProvider);
setCentralWidget(&_tabView);
_tabView.addTab(new MyView(), "Tab 1");
}
};
最后,这是我的 QML 文件:
import QtQuick 2.1
import MyUtilities 1.0
Rectangle
{
Text
{
text: myutils.doSomething()
anchors.centerIn: parent
}
}
我想要做的是将MyUtils
类注册为单例,然后我可以将其包含在我的 QML 中并使用。问题是当我运行它时,我从应用程序的输出中得到以下消息:
QML 调试已启用。仅在安全的环境中使用。
Qml 调试已启用。只能在安全的环境中使用!
qrc:/main.qml:8: ReferenceError: myutils 未定义
我已经尝试在对象实例化之前放入 , qmlRegisterSingletonType
(以及在其他各种地方进行咯咯笑),但到目前为止我还无法让它工作。main()
QApplication
我注意到,如果我qDebug()
在方法中放置断点或消息MyUtils::MyUtilsProvider
,它永远不会被调用。这使我认为,也许我的MyView
班级使用的QQmlEngine
对象与qmlRegisterSingletonType
注册单例的对象不同。但如果是这样的话,那么我不知道如何让那个引擎传递给MyView
构造函数。
有人可以告诉我我做错了什么以及如何让它工作吗?
谢谢!