版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wyy626562203/article/details/82800224
Qt程序中嵌入其他程序窗口
在开发中可以需要在Qt中嵌入其他应用的窗口,在Qt中我们该如何实现呢,以下就介绍实现方法。
使用spy++查找窗口句柄
本文将在Qt窗口中嵌入计算器
使用spy++查看计算器的窗口句柄
#include <QDebug>
#include <QProcess>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//WId就是spy++查看的句柄
QWindow *win = QWindow::fromWinId((WId)0x000A10CA);
win->setFlags(win->flags()|Qt::CustomizeWindowHint|Qt::WindowTitleHint);
QWidget *w = QWidget::createWindowContainer(win);
setCentralWidget(w);
}
MainWindow::~MainWindow()
{
delete ui;
}
运行后的效果如下。当关闭窗口时计算器应用也会被关闭。
此方法有个不好的地方就是,你要先打开计算器的这应用,然后用spy++查看窗口句柄,最后Qt程序中使用该句柄获取到计算器这个窗口,很繁琐且不实用,最好是把这些过程都在程序中完成,接下来介绍的这种方式就是这样实现的。
使用程序查找窗口句柄
通过QProcess来调用外部程序,这要无需我们手动运行计算器应用程序了,以下QProcess的三种启动方式:
扫描二维码关注公众号,回复:
3361239 查看本文章
方法 | 描述 |
---|---|
QProcess::execute() | 以阻塞方式打开外部程序,只有当外部程序执行完后才继续往后执行现程序。其中,外部程序的标准输出、标准错误都是重定向到现程序的标准输出和标准错误。 |
QProcess::start() | 以子进程的方式打开外部程序,外部进程和现进程执行互不干扰,但外部进程的父进程是当前进程。 |
QProcess::startDetached() | 以分离方式打开外部程序,外部进程和当前进程执行互不干扰,外部进程的父进程是系统的init进程。 |
其中start()函数为普通成员函数,execute()和startDetached()为静态成员函数
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QWindow>
#include <qt_windows.h>
#include <QDebug>
#include <QProcess>
#include <QThread>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//调用外部应用
QProcess p;
p.startDetached("calc");
//这里加延时,等待calc创建出窗口的时候才能找到句柄
QThread::msleep(100);
WId wid = (WId)FindWindow(L"CalcFrame", L"计算器");
QWindow *win = QWindow::fromWinId(wid);
win->setFlags(win->flags()|Qt::CustomizeWindowHint|Qt::WindowTitleHint);
QWidget *w = QWidget::createWindowContainer(win);
setCentralWidget(w);
//由于使用了QProcess::startDetached方式启动外部程序,
//关闭窗口时后台的计算器应用进程不会被杀掉,所以显示调用QProcess::kill杀掉进程
connect(this,&MainWindow::destroyed,&p,&QProcess::kill);
}
MainWindow::~MainWindow()
{
delete ui;
}
运行效果