У меня есть приложение 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
конструктор.
Может кто-нибудь сказать мне, что я делаю неправильно, и как я могу заставить это работать?
Спасибо!
Имена компонентов QML должны начинаться с заглавных букв:
qmlRegisterSingletonType<MyUtils>("MyUtilities", 1, 0, "Myutils",
&MyUtils::MyUtilsProvider);
и поэтому
text: Myutils.doSomething()