qt 中 qwidget 嵌入 qml

这篇博客介绍了如何在Qt应用中结合QML进行窗口管理,通过`WgtAnchorMgr`类实现了QML窗口与QWidget的联动,监听QQuickItem的几何属性变化并更新QWidget的位置和大小。主要涉及`init_info`方法初始化窗口信息,以及信号连接来同步窗口布局。

 以上是效果图, 整个窗口是 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::up
### 在 QML嵌入 QWidget 的方法 在 Qt 中,可以使用 `QQuickWidget` 将 QWidget 嵌入QML 中。`QQuickWidget` 提供了一个容器,允许将 QWidget 子类嵌入QML 场景中,从而实现 QMLQWidget 的混合开发 [^1]。 #### 步骤一:创建 QWidget 子类 首先,需要创建一个 QWidget 子类。例如,以下是一个简单的自定义 QWidget 子类: ```cpp #include <QWidget> class CustomWidget : public QWidget { Q_OBJECT public: explicit CustomWidget(QWidget *parent = nullptr) : QWidget(parent) { // 初始化代码 } }; ``` #### 步骤二:注册 QWidget 子类到 QML 在应用程序的主函数中,需要将 QWidget 子类注册为 QML 类型,以便在 QML 文件中使用: ```cpp #include <QApplication> #include <QQmlApplicationEngine> #include <QQuickWidget> #include "customwidget.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); qmlRegisterType<CustomWidget>("CustomWidgets", 1, 0, "CustomWidget"); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); return app.exec(); } ``` #### 步骤三:在 QML 中使用 QWidgetQML 文件中,可以通过 `QQuickWidget` 来嵌入 QWidget。以下是一个简单的示例: ```qml import QtQuick 2.15 import QtQuick.Window 2.15 import CustomWidgets 1.0 Window { visible: true width: 640 height: 480 QQuickWidget { width: 200 height: 200 CustomWidget { // 设置 CustomWidget 的属性 } } } ``` ### 注意事项 1. **窗口管理差异**:需要注意的是,QMLQWidget 管理窗口的方式不同。QML 中的所有子组件通常与父 QML 窗口共享同一个 `winId`,而 QWidget 窗口下的子控件和其父控件的 `winId` 可能不同 [^4]。 2. **布局限制**:虽然这种方法可以将 QWidget 嵌入QML 中,但在某些情况下可能无法实现复杂的布局 [^2]。 3. **性能考虑**:嵌入 QWidget 可能会影响性能,尤其是在复杂的 QML 场景中。 ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值