2013-04-17 2 views
1

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

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

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

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

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

viewer.showExpanded(); 

Что я делаю:

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

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

+0

Вы делаете это неправильно. Вы не просто открываете разные qml-зрители как разные виджеты.Ваш диалог должен быть просто элементом QML, который вы показываете рядом с другими компонентами QML в одном основном средстве просмотра. И для LAST time - вы не запускаете пользовательский интерфейс в любом потоке, кроме основного потока. – dtech

ответ

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 

 Смежные вопросы

  • Нет связанных вопросов^_^