[转载]震惊!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 -;
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(,,,);//设置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(,,,); //标签属性设置
QLineEdit Edit("",&Widget); //添加输入框
Edit.setGeometry(,,,);
QPushButton Btn("send",&Widget); //添加按钮
Btn.setGeometry(,,,);
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
width:
height:
title: qsTr("Hello World")
Rectangle{
id:qmlRec
height:
width:
x:
color: "dimgray"
Text {
id: label
height:
width:
y:
text: qsTr("this is qmlRec")
}
Rectangle{
id:inputText
height:
width:
x:
border.color: "white"
y:
color: "lightgray"
TextInput{
height: parent.height
width: parent.width
x:
y:
}
}
Rectangle{
id:sendeBtn
height:
width:
x:
y:
border.color: "lightgray"
border.width:
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窗口句柄竟然是这样获取的更多相关文章
- BarTender如何将条码下的数字嵌入到条码中
现今社会,在各种包装箱子.书籍.超市商品等东西上面,必不可少的绝对要数条形码或者二维码了.有时候,根据客户的需求或者其他条件限制等原因,我们需要将BarTender 2016条码下的数字嵌入到条码中. ...
- 把腾讯视频嵌入到html中
---------------------------------------------------------------------------------------------------- ...
- QML与C++交互:在qml中使用QSqlQueryModel显示数据库数据
QML与C++交互:在qml中使用QSqlQueryModel显示数据库数据 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 參考链接: http:// ...
- Qt5.3中qml ApplicationWindow设置窗口无边框问题
这个版本的qt在这里有点bug.. 设置ApplicationWindow的flags属性为Qt.FramelessWindowHint的确可以使程序无边框,但是同时程序在任务栏的图标也没了. 看文档 ...
- qt quick中qml编程语言
Qt QML 入门 — 使用C++定义QML类型 发表于 2013 年 3 月 11 日 注册C++类 注册可实例化的类型 注册不实例化的QML类型 附带属性 注册C++类 注册可实例化的类型 如 ...
- Power BI官方视频(2) Power BI嵌入到应用中的3种方法
今天给大家介绍3种将Power BI嵌入到应用中的方法. 本文原文地址:Power BI官方视频(2) Power BI嵌入到应用中的3种方法 Power BI系列文章地址:微软Power BI技术文 ...
- C# 将excel表格嵌入到Word中
C# 将excel表格嵌入到Word中 继续开扒,今天要实现的是使用C#将excel表格嵌入到Word中这个功能,将word表格导入到excel中我已经写过了,如有需要可参考我之前的文章,在开始前还有 ...
- qml中打开本地html
main.cpp QString tmploc = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation); QDi ...
- Nodejs进阶:如何将图片转成datauri嵌入到网页中去
问题:将图片转成datauri 今天,在QQ群有个群友问了个问题:"nodejs读取图片,转成base64,怎么读取呢?" 想了一下,他想问的应该是 怎么样把图片嵌入到网页中去,即 ...
随机推荐
- charles mock方法及问题
一. 抓包后修改返回数据1.生成一个完成的请求返回信息1.charles抓取一个完整的请求,返回数据2.然后找到该请求,右键“save response”,将该完整请求返回文件保存至本地3.修改本地需 ...
- html5手机 input file 上传图片 调用API
<input type="file" accept="video/*;capture=camcorder"> <input type=&quo ...
- samba 设置文件的读写权限
原文:https://blog.csdn.net/lan120576664/article/details/50396511 打开配置文件 sudo pico /etc/samba/smb.conf ...
- 学习Struts2经验总结
一.struts 访问路径问题 1) Struts2的思想:主要围着“action”转,只要找到“action”它就知道自己该干嘛了. 首先配置struts.xml ,我们可以明白的看到,action ...
- String:(字符串)中常用的方法
package stringyiwen; //字符串中常用的方法public class StringTest03 { public static void main(String[] args) { ...
- 《剑指offer》-找到字符串中第一个只出现一个的字符
题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...
- spring 中常用的两种事务配置方式以及事务的传播性、隔离级别
一.注解式事务 1.注解式事务在平时的开发中使用的挺多,工作的两个公司中看到很多项目使用了这种方式,下面看看具体的配置demo. 2.事务配置实例 (1).spring+mybatis 事务配置 &l ...
- [HDU] 5306 Gorgeous Sequence [区间取min&求和&求max]
题解: 线段树维护区间取min求和求max 维护最小值以及个数,次小值 标记清除时,分情况讨论 当lazy>max1 退出 当max1>lazy>max2(注意不要有等号) 更新 否 ...
- Python列表split方法
转载自:https://www.cnblogs.com/douzi2/p/5579651.html 1.split翻译为分裂. split()就是将一个字符串分裂成多个字符串组成的列表. 2.spl ...
- 【Java】 剑指offer(6) 重建二叉树
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的 ...