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

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

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

Я собираю и запускаю: никаких ошибок при компиляции, никаких ошибок в выводе приложения.

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


person iviv    schedule 17.04.2013    source источник
comment
Вы делаете это неправильно. Вы не просто открываете разные программы просмотра qml как разные виджеты. Ваш диалог должен быть просто элементом QML, который вы показываете вместе с другими компонентами QML в единственном основном средстве просмотра. И в ПОСЛЕДНИЙ раз - вы не запускаете пользовательский интерфейс ни в каком потоке, кроме основного потока.   -  person dtech    schedule 26.04.2013


Ответы (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
person radman    schedule 26.04.2013