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"
這裡的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