当前位置:   article > 正文

在QML 中,嵌入QWidget 对象_qml加载qwidget

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

  1. Item {
  2. ... // layouts, extra items, what have you
  3. Item
  4. {
  5. objectName: "widgetItem"
  6. anchors.fill: parent
  7. }
  8. ... // more layouts, extra items, etc.
  9. }

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

  1. class WidgetAnchor: public QObject
  2. {
  3. QPointer<QWidget> _pWidget;
  4. QPointer<QQuickItem> _pQuickItem;
  5. public:
  6. WidgetAnchor(QWidget* pWidget, QQuickItem* pItem)
  7. : QObject(pWidget), _pWidget(pWidget), _pQuickItem(pItem)
  8. {
  9. connect(_pQuickItem, &QQuickItem::xChanged, this, &WidgetAnchor::updateGeometry);
  10. connect(_pQuickItem, &QQuickItem::yChanged, this, &WidgetAnchor::updateGeometry);
  11. connect(_pQuickItem, &QQuickItem::widthChanged, this, &WidgetAnchor::updateGeometry);
  12. connect(_pQuickItem, &QQuickItem::heightChanged, this, &WidgetAnchor::updateGeometry);
  13. updateGeometry();
  14. }
  15. private:
  16. void updateGeometry()
  17. {
  18. if (_pQuickItem)
  19. {
  20. QRectF r = _pQuickItem->mapRectToItem(0, QRectF(_pQuickItem->x()- _pQuickItem->width()/2, _pQuickItem->y()-_pQuickItem->height()/2, _pQuickItem->width(), _pQuickItem->height()));
  21. _pWidget->setGeometry(r.toRect());
  22. }
  23. }
  24. };

四,main.cpp

  1. int main(int argc, char *argv[])
  2. {
  3. QApplication app(argc, argv);
  4. auto pqw = new QQuickWidget;
  5. pqw->setSource(QUrl::fromLocalFile("main.qml"));
  6. pqw->setResizeMode(QQuickWidget::SizeRootObjectToView);
  7. pqw->setAttribute(Qt::WA_DeleteOnClose);
  8. auto pOwt = new MyWidget(pqw); // 自定义 widget窗体
  9. if (auto pOverlayItem = pqw->rootObject()->findChild<QQuickItem*>("widgetItem"))
  10. new WidgetAnchor(pOwt, pOverlayItem);
  11. pqw->show();
  12. return app.exec();
  13. }

 

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/831238
推荐阅读
相关标签
  

闽ICP备14008679号