3

我有一个使用 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构造函数。

有人可以告诉我我做错了什么以及如何让它工作吗?

谢谢!

4

1 回答 1

4

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

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

因此

text: Myutils.doSomething()
于 2015-07-22T19:56:01.963 回答