-
背景
记得在初学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
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,如果本博客对你有一点帮助的话,请点个赞让更多的人看到,谢谢
优快云下载:https://download.youkuaiyun.com/download/weixin_40912639/10876647