在Qt中将QWindow或者QWidget嵌入到别的进程中的窗口中(windows)

前提:必须知道另外一个进程的窗口句柄

 

示例(这里用QWidget举例,QWindow也一样的):

1、首先创建一个进程,创建一个顶级窗口“Proc 1 Window”并运行

 

#include "mainwindow.h"
#include <QApplication>

#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.setWindowTitle("Proc 1 Window");
    w.show();

    qDebug() << "proc 1 window handle:" << w.winId();

    return a.exec();
}

 

运行效果:

 

运行结果

 

 

 

记住Proc 1 Window 的HWND 为‘132510’!

 

2、创建第二个进程,创建它的顶级窗口“Proc 2 Window”并运行(记住其中使用的句柄为Proc 1 Window的句柄)

 

#include "mainwindow.h"
#include <QApplication>
#include <QLabel>
#include <QWindow>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    w.setStyleSheet("background-color: lightblue;");
    //TODO: 创建一个label表示w为进程2的窗口
    QLabel text("Proc 2 Window",&w);
    text.setStyleSheet("background-color: pink; color: naviy;");

    WId proc1Window_HWND = WId(132510); //记下进程1的窗口句柄
    //TODO: 创建一个进程1的窗口代理
    QWindow* proc1Widow = QWindow::fromWinId(proc1Window_HWND);

    //TODO: 告诉w它的本地父窗口是proc1Window_HWND,这步务必要做不然w上的一些控件会出问题,比如qcombobox的下拉框可能会错位
    w.setProperty("_q_embedded_native_parent_handle",QVariant(proc1Window_HWND));

    //TODO: 将进程1的窗口设置为w的父窗口(w嵌入到proc1的窗口中)
    w.winId();
    w.windowHandle()->setParent(proc1Widow);
    w.resize(250,250);
    w.move(20,20);

    w.show();

    return a.exec();
}

 

运行结果:

 

 

这时候你会看到Proc 2 运行之后没有出现新的顶级窗口,那么怎么办?别急,这时候你打开Proc 1 Window,你就会看到Proc 2 Window 已经嵌入到了Proc 1 Window! 以下为结果图:

 

其中亮蓝色部分就为Proc 2 Window!

 

至此就完成了Windows下Qt中将窗口潜入到其他进程窗口的示例!

 

——

注:这个方式是我刨Qt源码得出的方式,可能会根据不同的Qt版本有所差异。

(未经同意请勿转载!)

 

 

 

 

 

 

 

 

 

 

 

  • 22
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 43
    评论
可以使用QProcess类在QWidget嵌入exe程序。QProcess类提供了一个接口,可以在应用程序启动外部程序并与其进行交互。以下是一个简单的示例代码: ```cpp #include <QtWidgets> #include <QProcess> class MainWindow : public QWidget { Q_OBJECT public: MainWindow(QWidget *parent = nullptr) : QWidget(parent) { // 创建一个按钮 QPushButton *button = new QPushButton("启动外部程序", this); button->setGeometry(10, 10, 150, 30); // 连接按钮的clicked信号到startProcess()槽函数 connect(button, &QPushButton::clicked, this, &MainWindow::startProcess); // 设置窗口大小和标题 setFixedSize(200, 50); setWindowTitle("嵌入外部程序"); } private slots: void startProcess() { // 创建一个QProcess对象 QProcess *process = new QProcess(this); // 启动外部程序 process->start("path/to/your/exe"); // 将外部程序的窗口嵌入到当前窗口 process->setProcessChannelMode(QProcess::ForwardedChannels); process->waitForStarted(); WId wid = process->pid(); QWidget *container = QWidget::createWindowContainer(QWindow::fromWinId(wid), this); container->setGeometry(0, 50, width(), height() - 50); container->show(); } }; ``` 在这个示例代码,我们创建了一个QPushButton对象,当用户点击按钮时,我们使用QProcess启动外部程序,并将其窗口嵌入到当前窗口。需要注意的是,在Windows系统下,使用QProcess启动的外部程序可能无法直接获取到其窗口句柄,因此我们需要使用QWindow::fromWinId()函数获取外部程序的窗口句柄,并将其嵌入QWidget

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 43
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值