QWidget应用程序w/QML和注册类型

QWidget Application w/QML and Registered Types

本文关键字:注册 类型 QML 应用程序 QWidget      更新时间:2023-10-16

我有一个使用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

我试过把qmlRegisterSingletonTypemain()中,在QApplication对象的实例化之前(以及在其他各种地方咯咯笑),但到目前为止,我还不能让这个工作。

我注意到,如果我在MyUtils::MyUtilsProvider方法中放置一个断点或qDebug()消息,它永远不会被调用。这让我认为,也许我的MyView类使用不同的QQmlEngine对象,而不是qmlRegisterSingletonType注册单例的对象。但如果是这种情况,那么我不知道如何将该引擎传递给MyView构造函数。

有人能告诉我我做错了什么,我怎么能得到这个工作?

谢谢!

QML组件名称必须以大写字母开头:

qmlRegisterSingletonType<MyUtils>("MyUtilities", 1, 0, "Myutils",
                                  &MyUtils::MyUtilsProvider);

text: Myutils.doSomething()