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

摘要:
背景我记得当我第一次了解QML时,老板告诉我有两种方法可以实现QML:“视图+项目”和“引擎+窗口”。我可以将QWidget嵌入QML吗?我收到的答案是“否”,因为无法获得QML的窗口句柄。然而,要使用原始的win32进行解码,需要窗口句柄。但我不想放弃我努力学习的QML,所以我绞尽脑汁想办法,最后,黄天不给想付钱的人。当谷歌遇到问题时,他无意中看到了
 
  • 背景

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

  • 效果

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

整个窗口是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

免责声明:文章转载自《[转载]震惊!QWidget竟然可以嵌入到QML中,QMl窗口句柄竟然是这样获取》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇RabbitMQ用户角色及权限控制 -2sumo快速运行简单仿真实例详细教程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

QML 解决button中添加了MouseArea,点击事件就不响应了的问题

ToolBar { RowLayout { anchors.fill: parent ToolButton { id: toolbutton text: qsTr("‹") onClicked: c...

【QML 动态对象】Loader动态加载组件

Loader 元素用来动态加载可见的 QML 组件,它可以加载一个 QML 文件(使用 source 属性)或者一个组件对象(使用 sourceComponent 属性)。 对于拖延组件的创建很是有用的:例如,当一个组件需要在要求的时候被创建,或者由于性能原因一个组件不应该被创建时。 Item { 200; height: 200...

为什么我要学习qt quick

2020年,是迷茫的一年 没有很清楚的目标,自学了k8s,但是工作中并不会用得到 所以后知后觉,已经没有别的路可以走了,唯一的选择就是在客户端开发上继续前行 作为一个wpf开发,注定只能在windows上玩耍 想将客户端开发进行到底,可惜 几乎可以肯定wpf已经不会考虑跨平台了,因为和windows硬件(显卡)绑定太严重 虽然有个xamarin(maui)...

QML 学习(三)

经过前面两个教程,文字也能显示,也能处理鼠标事件了,来点动画吧。 这个教程实现了当鼠标按住的时候,Hello,World从顶部到底部的一个旋转过程,并带有颜色渐变的效果。 完整的源代码main.qml import Qt 4.7Rectangle {id: page500; height: 200color: "lightgray"Text {id:...

Qt加载qml的方式

1、QQmlApplicationEngined搭配 Window示例: #include <QGuiApplication>#include <QQmlApplicationEngine> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv)...

初识 QML 和 Qt Quick

一、什么是 QML? QML 是一种用户界面规范和编程语言。它允许开发人员和设计师创建高性能、流畅的动画和视觉吸引人的应用程序。QML 提供了一种高度可读、声明性、类似 JSON 的语法,支持与动态属性绑定相结合的命令式 JavaScript 表达式。 QML 全称:Qt Meta Language 或 Qt Modelling Language,主要包含...