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

 
  • 背景

    记得在初学qml时,就被大佬告知Qml的实现有两种方式“view+item”和“engine+widow”,那么能不能将QWidget嵌入到QML中来呢,我收到的答案是不可以,原因是QML的窗口句柄获取不到,但是,要想用原来的win32解码时就需要用到窗口句柄,但是我辛辛苦苦学的qml又不想放弃,于是就绞尽脑汁的找寻办法,终于,黄天不付有心人,在Google某个问题的时候,偶然间看到一个获取到qml窗口句柄的方法,于是就感觉自己找到了通向新世界的大门一样。

  • 效果

  

整个窗口是qml的窗口,左边是我插入的QWidget,右边是我在Qml window上绘的Rectangle。

  • 代码

main.cpp

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.qml

import QtQuick 2.10
import QtQuick.Window 2.10
import QtQuick.Controls 2.3
Window {
    visible: true
     640
    height: 480
    title: qsTr("Hello World")
    Rectangle{
        id:qmlRec
        height: 180
         180
        x:180
        color: "dimgray"
        Text {
            id: label
            height: 40
             140
            y:10
            text: qsTr("this is qmlRec")
        }
        Rectangle{
            id:inputText
            height:20
             100
            x:2
            border.color: "white"
            y:50
            color: "lightgray"
            TextInput{
                height: parent.height
                 parent.width
                x:2
                y:4
            }
        }
        Rectangle{
            id:sendeBtn
            height: 20
             60
            x:100
            y:100
            border.color: "lightgray"
            border. 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,如果本博客对你有一点帮助的话,请点个赞让更多的人看到,谢谢

CSDN下载:https://download.csdn.net/download/weixin_40912639/10876647

原文地址:https://www.cnblogs.com/h2zZhou/p/10531283.html