Я хочу сделать приложение на 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, поэтому любая помощь будет высоко оценена. Спасибо.
Наткнулся на этот вопрос, пока сам искал ресурсы. Я думаю, что могу пролить свет на ваши проблемы, но я только начинаю разбираться с 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
Других решений пока нет …