记得在初学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