qt 中 qwidget 嵌入 qml

article/2025/10/13 2:20:17

 以上是效果图, 整个窗口是 qml 窗口

核心代码

#ifndef WIDGETANCHOR_H
#define WIDGETANCHOR_H#include <QObject>
#include <QQuickItem>
#include <QWidget>
#include <QQmlApplicationEngine>
#include <QQmlContext>class WgtAnchorMgr: public QObject
{QWidget * _p_wgt = nullptr;QQuickItem* _p_quick_item =nullptr;
public:WgtAnchorMgr();WgtAnchorMgr(QWidget* pWidget, QQuickItem* pItem);bool init_info(QWidget* pWidget, QQuickItem* pItem);bool init_info(QQmlApplicationEngine &engine, const QString &object_name, QWidget* pWidget);bool init_info(QQmlApplicationEngine &engine, const QString &object_name, std::function<QWidget *()> fun);void init_connect();~WgtAnchorMgr();private:void updateGeometry();
};#endif // WIDGETANCHOR_H
#include "WgtAnchorMgr.h"#include <QQuickItem>
#include "WgtAnchorMgr.h"
#include <QQuickWidget>
#include <QQmlContext>WgtAnchorMgr::WgtAnchorMgr()
{}WgtAnchorMgr::WgtAnchorMgr(QWidget* pWidget, QQuickItem* pItem): QObject(pWidget), _p_wgt(pWidget), _p_quick_item(pItem)
{connect(_p_quick_item, &QQuickItem::xChanged, this, &WgtAnchorMgr::updateGeometry);connect(_p_quick_item, &QQuickItem::yChanged, this, &WgtAnchorMgr::updateGeometry);connect(_p_quick_item, &QQuickItem::widthChanged, this, &WgtAnchorMgr::updateGeometry);connect(_p_quick_item, &QQuickItem::heightChanged, this, &WgtAnchorMgr::updateGeometry);updateGeometry();
}bool WgtAnchorMgr::init_info(QWidget *pWidget, QQuickItem *pItem)
{if(nullptr == pWidget || nullptr == pItem)return false;_p_wgt = pWidget;_p_quick_item = pItem;return true;
}bool WgtAnchorMgr::init_info(QQmlApplicationEngine &engine, const QString &object_name, QWidget *pWidget)
{if(nullptr == pWidget)return false;for(auto obj : engine.rootObjects()){if(obj->findChild<QQuickItem*>("widgetItem")){_p_quick_item = obj->findChild<QQuickItem*>(object_name);if(nullptr == _p_quick_item)continue;QWindow * mainWindow = qobject_cast<QWindow*>(obj);WId proc2Window_HWND = mainWindow->winId();_p_wgt = pWidget;_p_wgt->setProperty("_q_embedded_native_parent_handle", QVariant(proc2Window_HWND));_p_wgt->setWindowFlags(Qt::Widget|Qt::FramelessWindowHint);_p_wgt->winId();_p_wgt->windowHandle()->setParent(mainWindow);engine.rootContext()->setContextProperty("WidgetAnchor", this);return true;}}return false;
}bool WgtAnchorMgr::init_info(QQmlApplicationEngine &engine,  const QString &object_name, std::function<QWidget *()> fun)
{for(auto obj : engine.rootObjects()){if(obj->findChild<QQuickItem*>("widgetItem")){_p_quick_item = obj->findChild<QQuickItem*>(object_name);if(nullptr == _p_quick_item)continue;QWindow * mainWindow = qobject_cast<QWindow*>(obj);WId proc2Window_HWND = mainWindow->winId();_p_wgt = fun();if(nullptr == _p_wgt)return false;_p_wgt->setProperty("_q_embedded_native_parent_handle", QVariant(proc2Window_HWND));_p_wgt->setWindowFlags(Qt::Widget|Qt::FramelessWindowHint);_p_wgt->winId();_p_wgt->windowHandle()->setParent(mainWindow);engine.rootContext()->setContextProperty("WidgetAnchor", this);return true;}}return false;
}void WgtAnchorMgr::init_connect()
{connect(_p_quick_item, &QQuickItem::xChanged, this, &WgtAnchorMgr::updateGeometry);connect(_p_quick_item, &QQuickItem::yChanged, this, &WgtAnchorMgr::updateGeometry);connect(_p_quick_item, &QQuickItem::widthChanged, this, &WgtAnchorMgr::updateGeometry);connect(_p_quick_item, &QQuickItem::heightChanged, this, &WgtAnchorMgr::updateGeometry);updateGeometry();
}WgtAnchorMgr::~WgtAnchorMgr()
{disconnect(_p_quick_item, 0, 0, 0);delete _p_wgt;qDebug()<<"=============~WgtAnchorMgr==============";}void WgtAnchorMgr::updateGeometry()
{if (_p_quick_item){QRectF r = _p_quick_item->mapRectToItem(0, QRectF(_p_quick_item->x(), _p_quick_item->y(), _p_quick_item->width(), _p_quick_item->height()));qDebug()<<" r ===="<<r;_p_wgt->setGeometry(r.toRect());}_p_wgt->show();
}

使用

#include <QApplication>
#include <QQmlApplicationEngine>
#include "mywgt.h"
#include <QQuickItem>
#include "WgtAnchorMgr.h"
#include <QQuickWidget>
#include <QQmlContext>
int main(int argc, char *argv[])
{
#if defined(Q_OS_WIN)QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endifQApplication app(argc, argv);QQmlApplicationEngine engine;engine.load(QUrl(QStringLiteral("qrc:/main.qml")));if (engine.rootObjects().isEmpty())return -1;//    auto pqw = new QQuickWidget;
//    pqw->setSource(QUrl(QStringLiteral("qrc:/main.qml")));
//    pqw->setResizeMode(QQuickWidget::SizeRootObjectToView);
//    pqw->setAttribute(Qt::WA_DeleteOnClose);//    auto pOwt = new MyWgt(pqw); // 自定义 widget窗体
//    auto pOverlayItem = pqw->rootObject()->findChild<QQuickItem*>("widgetItem");//    if (nullptr != pOverlayItem)
//    {
//        qDebug()<<"===="<<pOverlayItem;
//        new WidgetAnchor(pOwt, pOverlayItem);
//    }//   pqw->show();WgtAnchorMgr wgt_anchor;
//    if(wgt_anchor.init_info(engine, "widgetItem", []()->QWidget*{return new MyWgt;}))
//            wgt_anchor.init_connect();for(auto obj : engine.rootObjects()){if(obj->findChild<QQuickItem*>("widgetItem")){auto pOverlayItem = obj->findChild<QQuickItem*>("widgetItem");qDebug()<<"===="<<pOverlayItem;QWindow * mainWindow = qobject_cast<QWindow*>(obj);WId proc2Window_HWND = mainWindow->winId();auto pOwt = new MyWgt;pOwt->setProperty("_q_embedded_native_parent_handle", QVariant(proc2Window_HWND));pOwt->setWindowFlags(Qt::Widget|Qt::FramelessWindowHint);pOwt->winId();pOwt->windowHandle()->setParent(mainWindow);//WidgetAnchor anchor(pOwt, pOverlayItem);//pwgt_anchor = new WidgetAnchor(pOwt, pOverlayItem);if(wgt_anchor.init_info(pOwt, pOverlayItem))wgt_anchor.init_connect();engine.rootContext()->setContextProperty("WidgetAnchor", &wgt_anchor);break;}}//    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, &app, [pwgt_anchor](QObject* obj, const QUrl& objUrl)
//    {
//        qDebug()<<"=============~WidgetAnchor==============";
//        delete pwgt_anchor;
//        //if (!obj && url == objUrl) QCoreApplication::exit(-1);
//    }, Qt::QueuedConnection);return app.exec();
}


http://chatgpt.dhexx.cn/article/K4rEIhyN.shtml

相关文章

QWidget尺寸限定

1、控件只能在最小和最大之间进行调整&#xff0c;不能超过范围。 ①直接宽高同时设置 window.setMinimumSize(200, 200)&#xff1b; window.setMaximumSize(500, 500) app QApplication(sys.argv)window QWidget()window.setWindowTitle("最小最大窗口")windo…

QWidget居中显示

须知 以下函数只要继承QWidget都可以使用.例如 QDialog, QPushButton( -v- 一个居中的”引爆按钮”)关于坐标问题: qt窗口坐标原点是在”左上角”的. 如图, (x2, y2)是我窗口的分辨率的一半无论目前我的窗口在什么位置,我只要把窗口原点设置为(x1, y1)就行了.所以目前我要获得…

QWidget事件消息

1、用户操作界面时会产生特定的事件消息。 API&#xff1a;显示和关闭事件、移动事件、调整大小、鼠标事件、键盘事件、焦点事件、拖拽事件、绘制事件、改变事件、右键菜单、输入法。 应用场景&#xff1a;当一个控件被触发了一个特定的行为时&#xff0c;就会调用特定的方法…

QWidget的isHidden和isVisible

文章目录 问题的出现QWidget的show()函数QWidget的isVisible和isHidden源码追溯 QWidget的isHidden和isVisible 问题的出现 最近在写代码的时候&#xff0c;出现了一个问题&#xff0c;我新建了两个类&#xff0c;分别是Chapter2和ConsecutiveCurtain // ConsecutiveCurta…

QWidget鼠标操作

1、设置鼠标形状&#xff1a;鼠标放置在不同控件上&#xff08;有不同功能时&#xff09;鼠标的形状是不一样的。 鼠标跟踪&#xff1a;鼠标在某一个控件上移动&#xff0c;则会向对应的控件对象发送一个消息&#xff0c;去调用具体的某一个方法&#xff0c;可以在方法里面监听…

QWidget旋转方法

参考链接&#xff1a;https://stackoverflow.com/questions/43388464/rotate-whole-qwidget-by-angle 说明&#xff1a; 本文实现方法本质是使用QGraphics三件套&#xff0c;即View、Scene、Item&#xff0c;将QWidget控件作为Item显示&#xff0c;从而实现角度控制的目的&…

QWidget设置背景图及圆角

在Qt开发过程中&#xff0c;QWidget是经常作为主窗体的父窗口&#xff0c;有时我们需要对主窗口设置背景&#xff0c;设置圆角以达到美观的效果&#xff0c;通常的有以下三种方法&#xff1a;qss, QPalette设置以及paintEvent绘制。下面介绍这三种方法。 背景设置介绍 方法一&a…

QWidget之adjustSize

from PyQt5.Qt import * import sys# 创建一个应用程序对象 app QApplication(sys.argv)window QWidget()label QLabel(window) label.setText(学无止境) label.move(100, 100) label.setStyleSheet(background-color:gray)def changeCao():tmp label.text()学无止境label.…

初识QWidget

初识QWidget 在Qt中QWidget是一个非常关键和重要的类&#xff0c;推荐初学Qt的同学们第一个学习此类 在Qt的帮助手册中我们搜索QWidget&#xff0c;可以看到下图的描述 通过帮助手册我们了解到如果想使用QWidget这个类&#xff0c;需要包含QWidget这个头文件&#xff0c;Qt特…

QWidget继承

查看QWidget的继承于哪个类 方法一 随便写一个类继承自己QWidget 按住Ctrl鼠标单击QWidget即可 方法二 print(QWidget.__base__)方法三 print(QWidget.mro()) 链条式的继承展示 enjoy

QWidget(长文)

一、描述 1、QWidget 是用户界面的原子&#xff1a;它从窗口系统接收鼠标、键盘和其他事件&#xff0c;并在屏幕上绘制自己的表示。每个小部件都是矩形的&#xff0c;它们按Z顺序排序。小部件由其父部件和它前面的小部件剪裁。 2、未嵌入父窗口小部件的 QWidget 称为窗口。通…

QWidget的使用

一、QWidget介绍 QWidget是用户操作的原子接口&#xff0c;它从窗口系统中接收鼠标&#xff0c;键盘以及其他事件&#xff0c;并绘制图形界面。QT提供的默认窗口基类只有QMainWindow、QWidget、和QDialog这三种&#xff0c;QMainWindow是带有菜单栏和工具栏的主窗口类&#xf…

QWidget

QWidget QWidget是容器组件&#xff0c;继承自QObject类和QPaintDevice类。能够绘制自己和处理用户输入&#xff0c;是QT中所有窗口组件类的父类&#xff0c;是所有窗口组件的抽象&#xff0c;每个窗口组件都是一个QWidget&#xff0c;QWidget类对象常用作父组件或顶级组件使用…

QT学习总结之QWidget详解

1、说明 QWidget类是所有用户界面对象的基类。 QWidget是用户界面的原子类。它接收鼠标、键盘和来自系统的其他事件&#xff0c;并在屏幕上将它们绘制出来。每个Widget都是矩形的&#xff0c;并按照Z-order&#xff08;Z轴&#xff09;进行排序。一个Widget夹在它的Parent和它…

VS2019安装与使用教程

VS2019安装与使用教程 可能有很多小伙伴们&#xff0c;知道VS2019这个软件&#xff0c;但是不知道怎么安装与使用&#xff0c;下面我将具体介绍VS2019的安装方法与创建我们自己的C项目以及如何运行自己编写的代码&#xff01; Visual Studio 2019(VS2019)简介 Microsoft Visual…

vs2017初学c++环境配置及使用教程

作为一个计算机小白, 初学c的时候使用了vs2017, 配置环境如下 如图所示, 可以实现c的基本操作. 在vs2017的版本中, 取消了win32这个选项, 所以直接选择新建空项目. 在解决方案资源管理器中, 于源文件处新建.cpp文件, 即可执行操作. 如果出现闪现的情况, 则右键点击解决方案资…

【转载】VS2019使用技巧

大家好&#xff0c;今天分享几个我知道的实用 VS 技巧&#xff0c;而这些技巧我发现很多人都不知道。因为我经常在工作中遇到&#xff1a;我在同事电脑上解决问题&#xff0c;或在会议上演示代码示例时&#xff0c;使用了一些 VS “骚”操作&#xff0c;他们会好奇地问&#xf…

VS2019安装教程

VS2019安装教程 &#xff08;如果下面的博客没有能解决你的问题或者你还有其他关于计算机方面的问题需要咨询可以加博主QQ&#xff1a;1732501467&#xff09; 在安装完JDK后&#xff0c;现在还不能使用java来进行编程&#xff0c;此时你还需要一个java开发工具&#xff0c;其…

VS2017专业版使用最新版Qt5.9.2教程(最新教材)

VS2017专业版使用最新版Qt5.9.2教程&#xff08;最新教材&#xff09; 目录 VS2017专业版使用最新版Qt5.9.2教程&#xff08;最新教材&#xff09; 运行环境&#xff1a; 1.安装Qt5.9.2 2.安装Qt5.9与VS2017之间的插件: 3.配置Qt VS Tool的环境. 4.设置创建的Qt的项目的…

Visual Studio(VS)2013使用教程

目录 1、初始2、新建项目3、点下一步后&#xff0c;此步后点完成4、解决方案资源管理器5、新建文件6、代码完成后不要点调试7、头文件显示&#xff1a;无法打开源文件路径未被包含若这一步没问题&#xff0c;则可能新建项时路径出错①添加包含目录级如上述②移除文件&#xff0…