外部进程嵌入到Qt进程界面
2017-11-14 20:49
483 查看
有时候需要做框架集成的东西,需要把其他客户端像组件一样集成到一个客户端中,类似于一个软件集成的平台客户端,统一用一个中心管理的客户端做类似于控制面板一样的东西去调用不同的软件。此时就必须相应不同的点击图标的事件去嵌入到主界面里面。下面简单的对windows平台上面Qt的界面中嵌入系统自带的计算机程序做简单的说明。
一、首先是获取计算机程序的窗口类名称,只要利用的是VS中的Spy++工具,在vs菜单“工具”中打开之后如图所示。查找计算器的窗口句柄并获取到具体的类名。
CTRL+F,搜索句柄,获取到对应的类名。
二、通过windows系统函数获取软件进程窗口的句柄。
接口中的第一个参数是类名称,也就是界面中“类”中有个标题,第二个参数是窗口名称,打开“常规”,填写标题,这个软件窗口名称为“计算器”,填入参数即可。
三、获取QWindow。
QWindow*m_window;
m_window=
QWindow::fromWinId(wid);
四、获取代理QWidget。
具体的代码如下所示,代码放在了一个widget的构造函数中。
winId.h
#pragma once
#include <QtWidgets/QWidget>
#include "ui_winId.h"
class winId : public QWidget
{
Q_OBJECT
public:
winId(QWidget *parent = Q_NULLPTR);
~winId();
private:
Ui::winIdClass *ui;
};
winId.cpp
#include "stdafx.h"
#include "winId.h"
winId::winId(QWidget *parent)
: QWidget(parent),ui(new Ui::winIdClass)
{
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;
}
最后的运行效果如下图。
另外在git上面也有一个例子,具体路径为:https://github.com/snasoft/qt-windows-composition-example
一、首先是获取计算机程序的窗口类名称,只要利用的是VS中的Spy++工具,在vs菜单“工具”中打开之后如图所示。查找计算器的窗口句柄并获取到具体的类名。
CTRL+F,搜索句柄,获取到对应的类名。
二、通过windows系统函数获取软件进程窗口的句柄。
#include<Windows.h> WId wid = (WId)FindWindow(L"CalcFrame", L"计算器");
接口中的第一个参数是类名称,也就是界面中“类”中有个标题,第二个参数是窗口名称,打开“常规”,填写标题,这个软件窗口名称为“计算器”,填入参数即可。
三、获取QWindow。
QWindow*m_window;
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
#pragma once
#include <QtWidgets/QWidget>
#include "ui_winId.h"
class winId : public QWidget
{
Q_OBJECT
public:
winId(QWidget *parent = Q_NULLPTR);
~winId();
private:
Ui::winIdClass *ui;
};
winId.cpp
#include "stdafx.h"
#include "winId.h"
winId::winId(QWidget *parent)
: QWidget(parent),ui(new Ui::winIdClass)
{
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;
}
最后的运行效果如下图。
另外在git上面也有一个例子,具体路径为:https://github.com/snasoft/qt-windows-composition-example
相关文章推荐
- 外部进程嵌入到Qt进程界面(使用QWindow::fromWinId)
- qt界面嵌入外部进程界面
- 将外部程序嵌入到Qt界面中
- 将外部程序嵌入到Qt界面中
- 将外部进程嵌入到Qt中
- Qt / C++ 如何关闭外部进程
- 将OSG嵌入QT窗口系统中,实现拖拽界面
- 把另一进程的窗体界面嵌入到当前程序中
- Qt ------ QProcess,启动外部进程,进程间通信
- Qt项目在Windows下结束外部进程
- QT设置窗口模态 进程调用外部程序和入参
- 【Qt开发】调起外部程序/进程
- Qt实用技巧:在Qt Gui程序中嵌入qml界面(可动态覆盖整个窗口)
- <Linux+Qt>Qt4编程控制mplayer嵌入自定义界面监控或视频显示
- QT做界面真是绝美,并且还可嵌入HTML与JS做界面
- qt嵌入外部程序的几种情况源码
- 在Qt中将QWindow或者QWidget嵌入到别的进程中的窗口中(windows)
- linux嵌入式下的QT图形界面开发(入门篇详解)
- QT自定义界面纯QSS
- QT实现无边框拖动界面