在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());
}
}