在QML 中,嵌入QWidget 对象

场景:QML 目前还不够强大 有些需求无法满足,比如把MFC窗口嵌入到程序中,但是QWidget已经很成熟了,所以类似得痛点需要把QWidget嵌入到QML中。

 

以下为:将PPT通过QWidget 嵌入到QML中

 

一,QML文件加载 使用 QQuickWidget + Rectangle的形式,因为QQuickWidget 是继承于QWidget(详情参考:https://blog.csdn.net/weixin_38416696/article/details/105432525

,qml文件中,放置一个Item用户接收QWidget

Item {

    ... // layouts, extra items, what have you

        Item
        {
            objectName: "widgetItem"
            anchors.fill: parent
        }

    ... // more layouts, extra items, etc.
}

,新建一个继承自QObject的类,用于控制widget的位置和大小

class WidgetAnchor: public QObject
{
    QPointer<QWidget> _pWidget;
    QPointer<QQuickItem> _pQuickItem;
public:
    WidgetAnchor(QWidget* pWidget, QQuickItem* pItem)
        : QObject(pWidget), _pWidget(pWidget), _pQuickItem(pItem)
    {
        connect(_pQuickItem, &QQuickItem::xChanged, this, &WidgetAnchor::updateGeometry);
        connect(_pQuickItem, &QQuickItem::yChanged, this, &WidgetAnchor::updateGeometry);
        connect(_pQuickItem, &QQuickItem::widthChanged, this, &WidgetAnchor::updateGeometry);
        connect(_pQuickItem, &QQuickItem::heightChanged, this, &WidgetAnchor::updateGeometry);
        updateGeometry();
    }
private:
    void updateGeometry()
    {
        if (_pQuickItem)
        {
            QRectF r = _pQuickItem->mapRectToItem(0, QRectF(_pQuickItem->x()- _pQuickItem->width()/2, _pQuickItem->y()-_pQuickItem->height()/2, _pQuickItem->width(), _pQuickItem->height()));
            _pWidget->setGeometry(r.toRect());
        }
    }
};

四,main.cpp

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    auto pqw = new QQuickWidget;
    pqw->setSource(QUrl::fromLocalFile("main.qml"));
    pqw->setResizeMode(QQuickWidget::SizeRootObjectToView);
    pqw->setAttribute(Qt::WA_DeleteOnClose);
    auto pOwt = new MyWidget(pqw); // 自定义 widget窗体
    if (auto pOverlayItem = pqw->rootObject()->findChild<QQuickItem*>("widgetItem"))
        new WidgetAnchor(pOwt, pOverlayItem);
    pqw->show();

    return app.exec();
}

 

参考:https://www.thinbug.com/q/13014415

  • 3
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土拨鼠不是老鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值