記得在初學qml時,就被大佬告知Qml的實現有兩種方式「view+item」和「engine+widow」,那麼能不能將QWidget嵌入到QML中來呢,我收到的答案是不能夠,緣由是QML的窗口句柄獲取不到,可是,要想用原來的win32解碼時就須要用到窗口句柄,可是我辛辛苦苦學的qml又不想放棄,因而就絞盡腦汁的找尋辦法,終於,黃天不付有心人,在Google某個問題的時候,偶然間看到一個獲取到qml窗口句柄的方法,因而就感受本身找到了通向新世界的大門同樣。html
整個窗口是qml的窗口,左邊是我插入的QWidget,右邊是我在Qml window上繪的Rectangle。app
main.cppui
int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QApplication app(argc, argv);//由於要建立widget,只能使用QApplication QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()) return -1; QObject *QmlObj=engine.rootObjects().first();//獲取QMl的源對象 QWindow *QmlWindow=qobject_cast<QWindow *>(QmlObj);//獲取qml在的源窗口 QmlWindow->setTitle("聞天語");//設置一個窗口標籤,確認本身拿到的窗口句柄就是本身想要的 WId parent_HWND = QmlWindow->winId(); //Qml窗口的句柄 QWidget Widget; //新建一個Widget Widget.setGeometry(0,0,180,180);//設置widget的大小 Widget.setStyleSheet("background-color: lightgray; color: naviy;");//設置風格,方便辨識 Widget.setProperty("_q_embedded_native_parent_handle",QVariant(parent_HWND));//給widget父對象句柄賦值 QLabel Label("this is Widget",&Widget); //在widget中添加一個標籤 Label.setGeometry(0,0,140,40); //標籤屬性設置 QLineEdit Edit("",&Widget); //添加輸入框 Edit.setGeometry(0,50,100,20); QPushButton Btn("send",&Widget); //添加按鈕 Btn.setGeometry(100,100,60,20); Widget.winId();//必須調用,才能爲widget建立句柄,不然將會失敗 Widget.windowHandle()->setParent(QmlWindow);//一樣是設置父窗口 Widget.show(); if(Widget.isModal())//判斷是不是模態對話框 { qDebug()<<"model"<<endl; }else{ qDebug()<<"not model"<<endl; } return app.exec(); }
main.qmlthis
import QtQuick 2.10 import QtQuick.Window 2.10 import QtQuick.Controls 2.3 Window { visible: true width: 640 height: 480 title: qsTr("Hello World") Rectangle{ id:qmlRec height: 180 width: 180 x:180 color: "dimgray" Text { id: label height: 40 width: 140 y:10 text: qsTr("this is qmlRec") } Rectangle{ id:inputText height:20 width: 100 x:2 border.color: "white" y:50 color: "lightgray" TextInput{ height: parent.height width: parent.width x:2 y:4 } } Rectangle{ id:sendeBtn height: 20 width: 60 x:100 y:100 border.color: "lightgray" border.width: 1 color: sendeBtnMosue.containsMouse?"#008792":"darkgray" Text { id: sendeBtnLabel text: qsTr("send") anchors.centerIn: parent } MouseArea{ id:sendeBtnMosue hoverEnabled: true anchors.fill: parent onClicked: { console.log("sendBtn Clicked") } } } } }
原本是打算等本身研究透了再發出來,可是激動的心情慾以言表呀,因此這個只是提供給你們一個可使用的方式,具體的使用過程當中確定會遇到不少的問題,比我我如今就遇到了QWidget與QML的焦點優先的問題,以及QWidget隱藏後QML界面刷新阻塞等問題,因此若是你有什麼好的解決辦法,或者有什麼問題,均可以在下面留言,也能夠聯繫個人QQ:995187021,若是本博客對你有一點幫助的話,請點個贊讓更多的人看到,謝謝spa
CSDN下載:https://download.csdn.net/download/weixin_40912639/10876647.net