我刚开始学习Qml。尽管我读了太多qt教程,但仍在为一些问题而挣扎。我想使用OpenGL制作多页桌面应用程序。首先,在程序的主要功能中,我正在传输类实例,以便使用下面的代码片段在qml中访问它们。
QQmlApplicationEngine engine;
Foo foo;
engine.rooContext()->setContextProperty(QStringLiteral("foo"),&foo);
但如果我必须实例化我想在qml中使用的所有类,这意味着在main函数中将有一百个实例。我认为必须有更合适的方法来做这件事。
其次,如果我们使用qmlRegisterType注册对象并在qml文件中导入,那么在活动qml更改后,我是否可以访问bar类的属性?因为据我所知,bar类的对象是在加载相应的qml时创建的。
项目.cpp
int main(int argc, char **argv)
{
QGuiApplication app(argc, argv);
qmlRegisterType<bar>("MyLib", 1, 0, "Comp");
qmlRegisterType<bar2>("MyLib2", 1, 0, "Comp2");
QQmlApplicationEngine engine;
Foo foo;
engine.rooContext()->setContextProperty(QStringLiteral("foo"),&foo);
.
.
.
}
GlWindow.qml
import QtQuick 2.0
import MyLib 1.0
Comp
{
id:sample
}
GlWindow2.qml
import QtQuick 2.0
import MyLib2 1.0
Comp2
{
id:sample2
}
bar.h
class bar: public QObject
{
Q_OBJECT
public:
Product* product;
void initialize();//Initialize Gl
void render(); //paint product's context
}
bar2.h
class bar2: public QObject
{
Q_OBJECT
public:
Product* product2;
void initialize();//Initialize Gl
void render(); //paint product's context
}
在关闭这个qml之后,我在GlWindow.qml上绘制了产品的内容,并显示了GlWindow2.qml。我的问题从这里开始,如何将产品的内容传输到product2?
对于您的第一个问题,您可以创建一个;主模型";具有每个模型的属性,否则您将添加到rootContext:
Class MainModel : public QObject
{
Q_OBJECT
Q_PROPERTY(Foo1 *foo1 READ foo1 CONSTANT)
Q_PROPERTY(Foo2 *foo2 READ foo2 CONSTANT)
....
Q_PROPERTY(FooN *fooN READ fooN CONSTANT)
}
如果你喜欢一些设计模式,你也可以采用某种依赖注入方法:
Class Injector : public QObject
{
public:
Q_INVOKABLE QObject* getFoo(const QString& fooName);
}
这有丢失强类型返回值的缺点,但从好的方面来说,您可以使用缓存等
关于你的第二个问题:你是对的,这样编程很难从C++端获得访问权限(假设这就是你的意思(,除非你把它变成一个单例:
class bar : public QObject
{
public:
bar *instance()
{
static bar theInstance;
return &theInstance;
}
};
//main.cpp
qmlRegisterSingleton<bar>("MyLib", 1, 0, "Comp", [](QQmlEngine *eng, QJSEngine *js) -> QObject*
{
return bar::instance();
});
但你可能尝试了这条路线,因为你没有看到";主模型";主意
此外,你关于在模型之间传递信息的最后一个问题可能可以通过一个漂亮的";主模型";其中类相互了解或者可以发出信号;主模型";连接信号和插槽。