QWidget应用程序w/QML和注册类型
QWidget Application w/QML and Registered Types
我有一个使用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调试开关。请在安全的环境下使用!
独有:/主要。qml:8: ReferenceError: myutils is not defined
我试过把qmlRegisterSingletonType
在main()
中,在QApplication
对象的实例化之前(以及在其他各种地方咯咯笑),但到目前为止,我还不能让这个工作。
我注意到,如果我在MyUtils::MyUtilsProvider
方法中放置一个断点或qDebug()
消息,它永远不会被调用。这让我认为,也许我的MyView
类使用不同的QQmlEngine
对象,而不是qmlRegisterSingletonType
注册单例的对象。但如果是这种情况,那么我不知道如何将该引擎传递给MyView
构造函数。
有人能告诉我我做错了什么,我怎么能得到这个工作?
谢谢!
QML组件名称必须以大写字母开头:
qmlRegisterSingletonType<MyUtils>("MyUtilities", 1, 0, "Myutils",
&MyUtils::MyUtilsProvider);
和
text: Myutils.doSomething()
相关文章:
- 使用QJsEngine在Qt中注册自定义类型
- 在Qt中注册自定义元类型的别名类型
- 如何注册枚举类型到QJSEngine,以便在脚本环境中使用?
- 在编译时生成某种子类/类型注册表?
- 将 const 类型引用对象注册为类成员对象C++
- 如何在QTScript中将QLIST内部的QMAP注册为元素类型
- 如何恢复注册表项的所有元素?(上次写入时间,类型,值,名称...这是正确的方法吗?
- UWP,加载窗口运行时组件 == 请求的窗口运行时类型 "..." 未注册
- 注册类型与容器
- 在多个DLL中注册常见的Qt元类型
- 读取 Qt 中的REG_MULTI_SZ类型注册表项
- 从C (例如Main.CPP)访问注册类型实例
- 在Qt中注册元类型的模式
- C++ 注册类型上的信号 QML 插槽
- 是否可以从对象而不是类注册 QML 类型
- 在 Angelscript 中为 glm::vec3 的基于 vic3 的值类型注册赋值运算符
- c++派生类型的自动工厂注册
- QWidget应用程序w/QML和注册类型
- 如何在编译时注册类型的键值对
- 从boost mpl向量注册类型