[转载]震惊!QWidget居然能够嵌入到QML中,QMl窗口句柄居然是这样获取

 
  • 背景

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