说明
所说的多进程界面开发,其实就是两个或多个进程,其中一个主进程exe启动后,需要启动其他进程,并且把其他进程的界面嵌入到我们主进程的窗口中来。
我们平时用到多进程软件查看,如下图所示:
1、启动外部子进程
启动外部进程方式很多,这里例举两个:
(1)QProcess方式
QProcess * myProcess = new QProcess(this);
QStringList arguments;
myProcess->start("C:/Windows/System32/MyApp.exe");
myProcess->waitForFinished(2000);
(2)CreateProcess方式(只适用于windows)
#include<Windows.h>
QString cmd = "C:/Windows/system32/MyApp.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);
2、找到外部进程类名和窗口名并获取其句柄
(1)找到外部进程类名和窗口名
我们可以使用SPY++工具进行查看外部进程的类名称和窗口名称。
具体教程可参考:https://blog.csdn.net/u013394556/article/details/78534833
说明:Microsoft Spy++是一个非常好的查看Windows操作系统的窗口、消息、进程、线程信息的工具,简单易用,功能强大。
(2)获取外部进程句柄
#include<Windows.h>
WId wid = (WId)FindWindow( QStringLiteral("Qt5QWindowIcon").toStdWString().c_str(),
QStringLiteral("MyApp软件").toStdWString().c_str());
3、将外部界面嵌入到主界面布局
在第二步获取到句柄后,可以依据句柄获取其窗体并嵌入到新的Widget中,如何将这个新的Widget加入到主界面布局。
WId wid = (WId)FindWindow( QStringLiteral("Qt5QWindowIcon").toStdWString().c_str(),
QStringLiteral("MyApp软件").toStdWString().c_str());
if(wid)
{
QWindow * window = QWindow::fromWinId(wid); //依据句柄获取窗体
if(window != NULL)
{
QWidget * widget = QWidget::createWindowContainer(window, NULL, Qt::Widget);
widget->show();
}
}
4、总结
最后说明一下,按1、2、3步骤多加入几个窗口,就可以像说明中的图片一样,如chrom浏览器,想打开多少子窗口就打开多少。
以前还真的没有意识到经常使用的软件都是使用多进程框架编程的。