欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-30 15:21:50
...

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


示例(这里用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();
}

运行效果:

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




记住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: add a mark label
    QLabel text("Proc 2 Window",&w);
    text.setStyleSheet("background-color: pink; color: naviy;");

    WId proc2Window_HWND = WId(132510);
    //TODO: create the proc 1 window delegate
    QWindow* proc1Widow = QWindow::fromWinId(proc2Window_HWND);

    //TODO: set the proxy widnow handle to proc 2 window
    w.setProperty("_q_embedded_native_parent_handle",QVariant(proc2Window_HWND));

    //TODO: set the proxy window to proc2 window for parent
    w.winId();
    w.windowHandle()->setParent(proc1Widow);
    w.resize(250,250);
    w.move(20,20);

    w.show();

    return a.exec();
}

运行结果:

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


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

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


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


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


——

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

(未经同意请勿转载!)