Работа со страницами в qml

Я только начал изучать Qml. Хотя я прочитал слишком много руководств по qt, все еще борюсь с некоторыми проблемами. Я хочу создать многостраничное настольное приложение с использованием OpenGL. Прежде всего, в основной функции программы я передаю экземпляр класса, чтобы я мог получить к ним доступ в qml, используя приведенный ниже фрагмент кода.

QQmlApplicationEngine engine;
Foo foo;
engine.rooContext()->setContextProperty(QStringLiteral("foo"),&foo);

Но если мне нужно создать экземпляры всех классов, которые я хочу использовать в qml, это означает, что в основной функции будет сто экземпляров. Я думаю, что должен быть более правильный способ сделать это.

Во-вторых, если мы зарегистрируем объект с помощью qmlRegisterType и импортируем его в файл qml, смогу ли я достичь свойства класса bar после изменения активного qml? Потому что, насколько мне известно, объект класса bar создается при загрузке соответствующего qml.

Project.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 
}

Я нарисовал содержимое продукта на GlWindow.qml, после этого закрыл этот qml и показал GlWindow2.qml. Моя проблема начинается здесь, как передать содержимое продукта в продукт2?

1 ответ

В первую очередь вы можете создать "основную модель" со свойствами для каждой из ваших моделей, которые в противном случае вы бы добавили в 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(); 
});

Но вы, вероятно, пробовали этот путь, потому что не видели идеи "основной модели".

Также ваш последний вопрос о передаче информации между моделями, вероятно, можно легко решить, имея хорошую "основную модель", где классы знают друг о друге или могут сигнализировать, а "основная модель" соединяет сигналы и слоты.

Другие вопросы по тегам