嵌入窗口并跟随移动
说明
本篇的实现的是将一个xlsx的表格窗口嵌入到我的Qt窗口内,并且我拖动qt窗口的时候能够跟随着进行移动。
代码
包含头文件:
#include <Windows.h>
.h文件:
Q_INVOKABLE void bindWindow(int w,int h);
//获取窗口HWND m_Hwnd ;//获取qt窗口HWND m_QHwnd;
.cpp文件:
void m_setWindow::bindWindow(int w,int h){//获取窗口m_Hwnd = FindWindow(0,TEXT(\"江南百景图.xlsx - WPS Office\"));//获取qt窗口m_QHwnd = FindWindow(0,TEXT(\"江南百景图\"));RECT qRect;GetWindowRect(m_QHwnd,&qRect);if (m_Hwnd && m_QHwnd){SetWindowPos(m_Hwnd,HWND_NOTOPMOST,qRect.left,qRect.top,w,h,SWP_SHOWWINDOW | SWP_NOSIZE);qDebug(\"X:%d,Y:%d\",qRect.left,qRect.top);}}
main.cpp文件:
头文件:
#include <QQmlContext>
m_setWindow wind;auto root_context = engine.rootContext();root_context->setContextProperty(\"$mwind\",&wind);
.qml文件:
//定义一个bool变量来判断是否嵌入窗口,放在Item下即可property bool isMove: false
//在button中进行判断按钮点击是开启还是关闭onPressed: {//console.log(\"1234\")if(isMove == false){isMove = true}else{isMove = false}//这里用了Timer方法来循环调用C++中的函数Timer{id:timer//刷新间隔interval: 1//开启循环running: isMove//是否重复repeat: trueonTriggered: {//当isMove为真时调用C++函数,并赋值想要的宽高。if(isMove){$mwind.bindWindow(bg_Rect.width,bg_Rect.height)}else{//停止循环timer.stop()}}}
注意
1.cpp文件中如果报错:无法解释的外部符号,因为qml中没有配置好库,可以加入
#pragma comment(lib,\"user32.lib\")
解决。
2.main.cpp文件中,包含类头文件的时候需要注意,如果类文件放在与qml文件不同的目录时
#include \"OtherSource/m_setwindow.h\"
,需要在前面加上文件夹名。
3.RECT结构体获取到的是矩形的 left、right、top、bottom,坐标以左上角为(0,0)点,请根据实际需求进行调整。
4.如果SetWindowPos不太好用,可以使用MoveWindow。