0

我刚刚开始学习 Qml。Altought 我读了太多的 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
   }

酒吧.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 
}

我在 GlWindow.qml 上绘制了产品的内容,然后关闭了这个 qml 并显示了 GlWindow2.qml。我的问题从这里开始,如何将产品内容传输到product2?

4

1 回答 1

0

对于您的第一个问题,您可以创建一个“主模型”,其中包含每个模型的属性,否则您将添加到 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(); 
});

但是您可能尝试了该路线,因为您没有看到“主要模型”的想法。

此外,您关于模型之间传递信息的最后一个问题可能很容易通过拥有一个很好的“主模型”来解决,其中类相互了解,或者可以发出信号并且“主模型”连接信号和插槽。

于 2020-07-16T18:10:58.290 回答