Как правильно сделать класс вне main.cpp для использования QtQuick2ApplicationViewer?

Я хочу сделать приложение на C ++, которое использует QML для диалогового интерфейса.

Я пытаюсь поставить свой код UI за пределами main.cpp, так что я могу позже отделить его для запуска в потоке.

я строю & run: нет ошибок при компиляции, нет ошибок при выводе приложения.

Однако на экране ничего не отображается. Но если написано в main.cpp, этот кусок кода правильно показывает диалог QML:

QtQuick2ApplicationViewer viewer;
viewer.setMainQmlFile(QStringLiteral("qml/Kiosk/main.qml"));

viewer.showExpanded();

Что я делаю:

Новый проект -> Приложения -> Приложение Qt Quick 2 (встроенные элементы)

я ухожу main.qml как есть.

Я добавляю новый класс «Диалог»

dialog.h код:

#ifndef DIALOG_H
#define DIALOG_H

#include <QObject>

#include "qtquick2applicationviewer.h"
class Dialog : public QObject
{
Q_OBJECT
public:
explicit Dialog(QObject *parent = 0);

void show();

signals:

public slots:

};

#endif // DIALOG_H

dialog.cpp код:

#include "dialog.h"
Dialog::Dialog(QObject *parent) :
QObject(parent)
{
}

void Dialog::show()
{
QtQuick2ApplicationViewer viewer;
viewer.setMainQmlFile(QStringLiteral("qml/Kiosk/main.qml"));

viewer.showExpanded();
}

main.cpp код:

#include <QtGui/QGuiApplication>
#include "dialog.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);

Dialog *dia = new Dialog();
dia->show();

return app.exec();
}

Когда я вернусь к QtQuick 1.0 и заменить кусок кода, который использует QtQuick2ApplicationViewer с QDeclarativeView :

view = new QDeclarativeView();
view->rootContext()->setContextProperty("Dialog", this);    //this
view->setSource(QUrl("qml/Kiosk/main.qml"));
view->setResizeMode(QDeclarativeView::SizeRootObjectToView);

мое приложение QML отображается правильно. Но я хочу использовать QtQuick 2.0. Я новичок в программировании на Qt, поэтому любая помощь будет высоко оценена. Спасибо.

1

Решение

Наткнулся на этот вопрос, пока сам искал ресурсы. Я думаю, что могу пролить свет на ваши проблемы, но я только начинаю разбираться с QtQuick.

в вашем Dialog::Show() Метод вы создаете локальный QtQuick2ApplicationViewer который будет уничтожен, когда вызов функции завершится, и, следовательно, вы ничего не увидите, поскольку он немедленно вернется.

Также самый простой способ получения отображения в формате qml — это непосредственное использование QQuickView.
например

int main(int argc, char** argv)
{
QApplication app(argc, argv);

QQuickView qtQuickApp;
qtQuickApp.setSource(QUrl("test.qml"));
qtQuickApp.show();app.connect( &app, SIGNAL( lastWindowClosed() ), &app, SLOT( quit() ) );
app.exec();

return 0;

} // main
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]