Qt界面中嵌入其他exe程序的界面,使用Qt5
下面用一个小例子来演示如何在Qt的界面中嵌入其他exe程序的界面,最终效果如下图所示。本文参考了
http://blog.csdn.net/jiaoyaziyang/article/details/49802993,感谢原作者。
下面是具体的实现方法,用Windows自带的计算器程序做例子。主要的思路就是获取到计算器程序的窗口类名称,然后在Qt中利用QWindow的静态函数fromWinId,创建出QWindow对象,然后将这个对象放到一个QWidget中。
首先是获取计算器程序的窗口类名称,主要利用的是VS中的Spy++工具,在VS菜单“工具”中,打开之后如下图所示
然后Ctr+F,进行搜索,出现如下界面
确定之后可以获取到类名
完整的代码如下所示,这段代码是放在了一个QMainWindow的构造函数中,首先是调用了windows的API创建了计算器程序的进程,然后思路同前面所述。
ui->setupUi(this); //创建进程 //QString cmd="C:/Program Files/R/R-3.3.1/bin/x64/Rgui.exe"; QString cmd="C:/Windows/system32/calc.exe"; STARTUPINFO si={sizeof(si)}; PROCESS_INFORMATION pi; si.dwFlags=STARTF_USESHOWWINDOW; si.wShowWindow=true; bool bRet=CreateProcess( NULL, (LPWSTR)cmd.toStdWString().c_str(), NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL,&si,&pi); Sleep(50); WId wid = (WId)FindWindow(L"CalcFrame",NULL); //WId wid = (WId)FindWindow(L"Rgui Workspace",NULL); QWindow *m_window; m_window = QWindow::fromWinId(wid); //m_window->setFlags(m_window->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint); // QWidget *m_widget; m_widget = QWidget::createWindowContainer(m_window,this->ui->widget); m_widget->setMinimumSize(400,300);