带有QML和注册类型的QWidget应用程序

时间:2015-07-22 18:29:52

标签: c++ qt qml qt5.5

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

有人可以告诉我我做错了什么以及如何让它发挥作用?

谢谢!

1 个答案:

答案 0 :(得分:4)

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

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

因此

text: Myutils.doSomething()