我有一个使用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
对象实例化之前(以及其他各种地方为giggles),我已经尝试将main()
放在QApplication
中但是到目前为止我还没有得到这个上班。
我注意到如果我在qDebug()
方法中放置了断点或MyUtils::MyUtilsProvider
消息,它就永远不会被调用。这让我想到,我的MyView
类可能正在使用与QQmlEngine
注册单例的对象不同的qmlRegisterSingletonType
对象。但如果情况确实如此,那么我就不知道如何将该引擎传递给MyView
构造函数。
有人可以告诉我我做错了什么以及如何让它发挥作用?
谢谢!
答案 0 :(得分:4)
QML组件名称必须以大写字母开头:
qmlRegisterSingletonType<MyUtils>("MyUtilities", 1, 0, "Myutils",
&MyUtils::MyUtilsProvider);
因此
text: Myutils.doSomething()