适合主进程界面与子进程界面都是QT界面的情况,其他进程的情况请参考其他文章,需要区分平台。
关键点
使用如下两个函数,QWInow类是Qt5.0之后提供的,Qt4版本是否有代替的未去深究,主要这个功能需求比较少,很少涉及。
QWindow * fromWinId(WId id);
QWidget *QWidget::createWindowContainer(QWindow *window, QWidget *parent = Q_NULLPTR, Qt::WindowFlags flags = Qt::WindowFlags())
下面示例三个程序都在一个目录下,每个app在相应的子目录下面
示例:
子窗口1为MyWidget1,为应用程序
功能:显示界面,并将窗口1的wid写入QSetting配置文件(或者其它主进程能获取子进程id的方式都行)
子窗口2为MyWidget2,为应用程序
功能:显示界面,并将窗口2的wid写入QSetting配置文件
主窗口进程启动两个子进程并从 QSetting文件获取两个子窗口的wId;
然后使用下面两个函数将两个窗口添加到主界面上就行了。
QWindow *childWin1 = QWindow::fromWinId(wid1); //根据子窗口id获取QWindow指针
QWindow *childWin2 = QWindow::fromWinId(wid2);
if(childWin1 && childWin2)
{
QVBoxLayout *ver = new QVBoxLayout;
childWin1->setFlags(childWin1->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint );
QWidget *widget1 = QWidget::createWindowContainer(childWin1,this,Qt::Widget); //根据获取的QWindow指针创建一个容器来放子窗口界面
ver->addWidget(widget1);
childWin2->setFlags(childWin2->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint );
QWidget *widget2 = QWidget::createWindowContainer(childWin2,this,Qt::Widget);
ver->addWidget(widget2);
//设置边距
ver->setContentsMargins(5,5,5,5);
ver->setSpacing(0);
this->setLayout(ver);
}