Qt 嵌入外部窗口

在Qt窗口中嵌入外部应用程序的窗口,可以利用QT中的QWindow类和WId(Window Identifier)来处理;

1.在 Windows 系统中,每个窗口都有一个唯一的窗口句柄(Window Handle/HWND),用于在底层操作系统中标识和引用该窗口。窗口句柄是一个由操作系统分配的整数值,可以通过调用 Windows API 函数来获取。
2.而在Qt框架中,WId 正是用于表示窗口句柄的类型;需要注意的是,WId 和窗口句柄之间并没有直接的映射关系;
3.在 Qt 中,为了与底层窗口系统进行交互,可以通过 WId 类型来传递和操作窗口句柄。WId 可以用于获取底层窗口系统的原生窗口句柄,从而实现与其他平台相关的功能。

实现一个自定义控件,将外部窗口嵌入到QT窗口中:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class main_widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QString externWndTitle, QWidget *parent = nullptr);
    ~Widget();

protected:
    void resizeEvent(QResizeEvent *event) override;

private:
    Ui::main_widget *ui;
    QWidget* containerWidget = nullptr;	//存放外部窗口的Widget
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"

#include <Windows.h>
#include <QWindow>
#include <QResizeEvent>

Widget::Widget(QString externWndTitle, QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::main_widget)
{
    ui->setupUi(this);
    HWND hwnd = FindWindow(nullptr, externWndTitle.toStdWString().c_str());
    if (hwnd != nullptr)
    {
        QWindow* externWindow = QWindow::fromWinId((WId)hwnd);
        containerWidget = QWidget::createWindowContainer(externWindow, this);
//        containerWidget->setGeometry(0, 0, externWindow->width(), externWindow->height());
    }
}

Widget::~Widget()
{
    delete ui;
}

void Widget::resizeEvent(QResizeEvent *event)	//外部窗口大小随动
{
    QWidget::resizeEvent(event);
    if (containerWidget != nullptr)
    {
        containerWidget->resize(event->size());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值