背景:
本文实验环境 windows10,qt5.14
由于工作需要写了一个小的qt程序,然后在实际使用过程中还要和其他小工具来回切换,就想能不能把其他工具代码集成,最后发现对我来说还是直接在qt中嵌入其他的程序界面比较快,在网上搜索一下发现原理可行,但是没有找到完整的示例代码,对新手来说太痛苦了,所以记录一下过程,有需要的可以参考一二。
网上好多都是基于计算器的集成,但是win10中的计算器使用新的ui,不知道怎么玩就放弃了,就拿Windows中记事本练手吧。
一:新建项目
下图中由于没有用到画布,所有Generat form没有勾选。
代码很少,算是能走了一个完整的流程吧,需要其他功能的可以自行探究,对于我来说这点已经够用了,还吭哧了好久。代码都放在main函数中,附录在本文最后面,需要的可以复制。
遇到的问题:
我实际遇到如下错误:QThread: Destroyed while thread is still running,最后我通过把 QProcess m_process 变量设置为全局变量解决,或者new一个,当然我也不知道为啥报错,也有可能这样解决是碰巧解决,网上还有其他修复方法,下一次用上qt又不知道啥时候,原理不清楚~~~~。
代码中:WId wid = (WId)FindWindow(L"Notepad", NULL); Notepad是通过vs中spy.exe软件定位出来的。详见第四部分。若编译25行报错,先注释掉,然后按需调试。
二:测试结果
记事本嵌入qt程序中的时候标题隐藏了,好像和第25行代码无关,不知哪里设置的,知道大神期望告知。
三:测试代码
main.c中代码:
#include "mainwindow.h"
#include <QApplication>
#include <QDebug>
#include <QWidget>
#include <QProcess>
#include <QWindow>
#include <Windows.h>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget *w = new QWidget;
QProcess m_process;
m_process.start("C:/Windows/System32/notepad.exe",QStringList()<<""); // 1.电脑中记事本的路径
if(!m_process.waitForFinished(3000))
{
qDebug()<<"--------";
}
WId wid = (WId)FindWindow(L"Notepad", NULL); // 2.需要嵌入的exe的界面的类名称
QWindow *m_window = QWindow::fromWinId(wid);
m_window->setFlags(m_window->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint); //这边可以设置一下属性
QWidget *m_widget = QWidget::createWindowContainer(m_window, w);
m_widget->setMinimumSize(500, 500);//窗口大小
w->show();
return a.exec();
}
四:定位窗口类的名称
spy.exe我以从vs中复制出来,需要可以直接下载使用,见文末。
下载链接:VisualStudio2019Tools-spy.exe_QT一个窗口显示其他软件-DOS文档类资源-CSDN下载