1. 程式人生 > >qml中註冊和使用C++物件,以及在qml中實現窗體最大最小化

qml中註冊和使用C++物件,以及在qml中實現窗體最大最小化

在main函式中相關程式碼如下:

    QApplicationapp(argc,argv);
QDeclarativeViewview;
//將app註冊到qml中,方便對主程式的退出,最大最小化等相關操作
view.rootContext()->setContextProperty("WindowQuitControl",&app);
view.rootContext()->setContextProperty("WindowControl",&view);

同時需要匯入的檔案頭:

#include <QDeclarativeContext>

這裡將app和QDeclarativeView物件註冊到QML中,在QML中通過引用"WindowQuitControl"

"WindowControl"(接下來的qml檔案中都會使用這兩個名字),就可以像在C++中使用app和view一樣!

這裡的view可以是QDeclarativeView,也可以是QmlApplicationViewer。如果用系統自動生成的QtQuick應用程式是後面這個物件,因為程式碼有特殊需求所以用了前面那個!

1、之所以將app註冊到qml中,是因為QDeclarativeView沒有quit()方法,所以如果在qml中使用Qt.quit()會提示signal quit沒有接受者,我的一個解決辦法就是將app註冊到qml中,通過在qml中使用:

//***.qml
……
MouseArea{
    onClicked
:WindowQuitControl.quit(); } ……
這樣就可以同樣退出程式。

當如如果想在退出程式之前做一些操作,可以講相關的類註冊到qml中,然後再相應的(類似quit方法)的方法裡寫入相關操作,然後再qml中呼叫就行!!

ps: 如果這裡的view宣告為:

QmlApplicationViewerview;
在qml中使用Qt.quit(),就不會有說quit方法沒有接收者,然後就無法退出的問題了!

2、關於窗體最大、最小化的問題,

如果想在qml中實現某個按鈕單擊之後可以最大或最小化,可以像上述那樣把view註冊到qml中,然後再qml中呼叫:

onClicked
:WindowControl.showFullScreen();
onClicked:WindowControl.showMinimized();
來實現最小化,全屏展示。

而通過下面這個句子

WindowControl.lower();

可以將窗體置於最底層,而不是最小化。但如果寫到手機應用程式中就可以在效果上實現最小化(類似於後臺執行)

補充一句,由於特殊需要,當實現的應用程式沒有外框的時候,必須自己實現最大最小化效果,所以才會有上述的函式的呼叫。如果用windows自己的介面邊框風格,滑鼠點選(或螢幕觸控)就可以實現最大最小化。

3、在去了邊框(如何去邊框,參考我之前的blog)之後,單純呼叫showMaximized等方法是沒有效果的。

這是因為,在view的更改大小的模式預設被設定成SizeViewToRootObject,需要自己修改ResizeMode。程式碼片段如下:

         //設定模式Mode為可以調整qml大小,預設:QDeclarativeView::SizeViewToRootObject

view.setResizeMode(QDeclarativeView::SizeRootObjectToView);
view.showMaximized();
如果view是QmlApplicationViewer,那麼引數就是:

 QmlApplicationViewer::SizeRootObjectToView