有时候需要做框架集成的东西,需要把其他客户端像组件一样集成到一个客户端中,类似于一个软件集成的平台客户端,统一用一个中心管理的客户端做类似于控制面板一样的东西去调用不同的软件。此时就必须相应不同的点击图标的事件去嵌入到主界面里面。下面简单的对windows平台上面Qt的界面中嵌入系统自带的计算机程序做简单的说明。
一、首先是获取计算机程序的窗口类名称,只要利用的是VS中的Spy++工具,在vs菜单“工具”中打开之后如图所示。查找计算器的窗口句柄并获取到具体的类名。
m_window= QWindow::fromWinId(wid);
m_window->setFlags(m_window->flags()|Qt::CustomizeWindowHint|Qt::WindowTitleHint); //这边可以设置一下属性
四、获取代理QWidget。
m_widget = QWidget::createWindowContainer(m_window, this->ui->widget); //第二个参数是作为window的父类,也可以用layout
具体的代码如下所示,代码放在了一个widget的构造函数中。
winId.h
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(
5000
);
WId wid
= (WId)FindWindow(L
"
CalcFrame
"
, L
"
计算器
"
);
//
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
);
winId::
~
winId()
delete
ui;