Приложение QWidget с QML и зарегистрированными типами

У меня есть приложение QWidget, которое использует QML. У меня есть класс, который я использую для раскрытия некоторых служебных функций наших организаций.

Я свел проблему к следующему коду (я объясню свою проблему ниже кода):

Во-первых, вот 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 конструктор.

Может кто-нибудь сказать мне, что я делаю неправильно, и как я могу заставить это работать?

Спасибо!

3

Решение

Имена компонентов QML должны начинаться с заглавных букв:

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

и поэтому

text: Myutils.doSomething()
4

Другие решения


По вопросам рекламы [email protected]