赞
踩
场景:QML 目前还不够强大 有些需求无法满足,比如把MFC窗口嵌入到程序中,但是QWidget已经很成熟了,所以类似得痛点需要把QWidget嵌入到QML中。
以下为:将PPT通过QWidget 嵌入到QML中
- Item {
-
- ... // layouts, extra items, what have you
-
- Item
- {
- objectName: "widgetItem"
- anchors.fill: parent
- }
-
- ... // more layouts, extra items, etc.
- }
- 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());
- }
- }
- };

- 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();
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。