2013-04-17 47 views
1

我想製作一個使用QML作爲對話框UI的C++應用程序。在main.cpp之外使用QtQuick2ApplicationViewer來創建類的正確方法是什麼?

我試圖把我的UI代碼之外main.cpp中,這樣我以後可以分開它在一個線程中運行。

我編譯&運行:沒有編譯錯誤,應用程序輸出沒有錯誤。

但是,沒有在屏幕上顯示出來。但是,如果寫在main.cpp中,這個塊的代碼正確顯示QML對話框:

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

viewer.showExpanded(); 

我做什麼:

新建項目 - >應用程序 - > Qt Quick的2應用程序(內置in Elements)

我離開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並用QDeclarativeView替換的代碼,使用QtQuick2ApplicationViewer塊:

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組件一起顯示。最後一次 - 你不會在任何線程中運行UI,而是在主線程中運行。 – 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 
相關問題