2012-12-22 52 views
4

Qt5和QtQuick2的組合有幾個問題。無論何時您想要使用許多基於QWidget的類中的一些,您首先會遇到以下問題:Qt5在QtQuick2中使用QWidget

您應該使用QApplication而不是Qt5的QGuiApplication。那麼可以輕易改變,對吧?

所以現在我使用QApplication但每當我嘗試使用基於QWidget的類時,我的程序崩潰或導致一些無意義的錯誤消息。

那麼我應該如何使用舊的QWidgets和Qt5呢?我知道它們並不是Qt5的最佳解決方案,但它們非常有用......

P.S.我正在Linux中開發我的應用程序,適用於所有平臺。
我也使用自動生成的QtQuick2ApplicationViewer類來呈現基於QtQuick 2.0的應用程序。

回答

4

在Qt 5.1中(大概從現在開始),你應該使用QWidget :: createWindowContainer。 您的應用程序應該是基於QWidget的應用程序,並將QML放入QWidgets中。將QWidgets放入QML應用程序不受支持。請參閱blog entry

如果您有一個表單類,並且想要將qml放入容器小部件中。

如果你有這樣的QML:

import QtQuick 2.0 

Rectangle { 
    property alias text: textItem.text 
    width: 156 
    height: 35 
    Text { 
     width: 150 
     height: 20 
     text: qsTr("Hello World") 
     id: textItem 
    } 
} 

在一個名爲myqml.qml,然後把它的路徑中的資源文件的QML前綴。

然後把形式的構造函數:

ui->setupUi(this); // as normal 
QQuickView* view = new QQuickView(); 
QWidget* widget = QWidget::createWindowContainer(view, ui->container); 
view->setSource(QUrl("qrc:/qml/myqml.qml")); 
if(view->status()!=QQuickView::Ready) 
    qDebug("can't initialise view"); 
widget->setMinimumSize(500,100); 
QQuickItem* container = view->rootObject(); 

然後,當你要與QML互動:

container->setProperty("text", "Hello alternate universe"); 
3

看來這是一個已知的bug: https://bugreports.qt.io/browse/QTBUG-25643

這似乎也指向可能的解決方案/解決方法,但我沒有檢查他們。首先,直到未來的Qt 5.1(或者它將會是哪個版本)與完整的桌面Qt Quick組件,它們是常規桌面的唯一明智的選擇應用程序,唯一的選擇是定義最好的選擇;)

但即使在未來QWidgets是Qt5應用程序的100%有效的選擇。只有與他們有關的事情是,他們不太可能發展,所以你現在擁有的是你將會擁有的最好的東西。如果這沒關係,那麼他們是選擇的解決方案。