Qt程序中嵌入其他程序窗口

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

运行效果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wyy626562203/article/details/82800224