1. 运行外部exe程序

https://www.cnblogs.com/gaoxudong0704/p/5986730.html

[Original] Qt Tutorial(Funciton Edition) - 图1

下面是具体的实现方法,用Windows自带的计算器程序做例子。主要的思路就是获取到计算器程序的窗口类名称,然后在Qt中利用QWindow的静态函数fromWinId,创建出QWindow对象,然后将这个对象放到一个QWidget中。

获取计算器程序的窗口类名称

首先是获取计算器程序的窗口类名称,主要利用的是VS中的Spy++工具,在VS菜单“工具”中,打开之后如下图所示
[Original] Qt Tutorial(Funciton Edition) - 图2

然后Ctr+F,进行搜索,出现如下界面
[Original] Qt Tutorial(Funciton Edition) - 图3
确定之后可以获取到类名
[Original] Qt Tutorial(Funciton Edition) - 图4

完整的代码如下所示,这段代码是放在了一个QMainWindow的构造函数中,首先是调用了windows的API创建了计算器程序的进程,然后思路同前面所述。

  1. ui->setupUi(this);
  2. //创建进程
  3. //QString cmd="C:/Program Files/R/R-3.3.1/bin/x64/Rgui.exe";
  4. QString cmd="C:/Windows/system32/calc.exe";
  5. STARTUPINFO si={sizeof(si)};
  6. PROCESS_INFORMATION pi;
  7. si.dwFlags=STARTF_USESHOWWINDOW;
  8. si.wShowWindow=true;
  9. bool bRet=CreateProcess(
  10. NULL,
  11. (LPWSTR)cmd.toStdWString().c_str(),
  12. NULL,
  13. NULL,
  14. FALSE,
  15. CREATE_NEW_CONSOLE,
  16. NULL,
  17. NULL,&si,&pi);
  18. Sleep(50);
  19. WId wid = (WId)FindWindow(L"CalcFrame",NULL);
  20. //WId wid = (WId)FindWindow(L"Rgui Workspace",NULL);
  21. QWindow *m_window;
  22. m_window = QWindow::fromWinId(wid);
  23. //m_window->setFlags(m_window->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint); //
  24. QWidget *m_widget;
  25. m_widget = QWidget::createWindowContainer(m_window,this->ui->widget);
  26. m_widget->setMinimumSize(400,300);