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