Tiếp tục câu trả lời Julien - một cách đơn giản để đạt được điều này là sử dụng QQuickWidget để hiển thị các cảnh QML, và sau đó thêm một QWidget bình thường như một đứa trẻ của QQuickWidget. Bạn cũng có thể thêm QObject trung gian đơn giản để gắn QWidget vào một mục trong cảnh.
Ví dụ:
Trong main.qml:
Item {
... // layouts, extra items, what have you
Item
{
objectName: "layoutItem"
anchors.fill: parent
}
... // more layouts, extra items, etc.
}
widgetanchor.h:
class WidgetAnchor: public QObject
{
ptr<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->y(), _pQuickItem->width(), _pQuickItem->height()));
_pWidget->setGeometry(r.toRect());
}
}
};
Trong 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);
if (auto pOverlayItem = pqw->rootObject()->findChild<QQuickItem*>("overlayItem"))
new WidgetAnchor(pOwt, pOverlayItem);
pqw->show();
return app.exec();
}
Các tài liệu nói rằng sử dụng QQuickWidget có quảng cáo vantages trên QQuickView và QWidget :: createWindowContainer, chẳng hạn như không có hạn chế về thứ tự xếp chồng, nhưng có một 'hiệu suất nhỏ hit'.
Hy vọng điều đó sẽ hữu ích.
Một số tin tức liên quan về vấn đề này: [QtQuickWidget] (https://qt.gitorious.org/qt/qtdeclarative/source/b02bed1caae6966925b9efb04e1db79c3e9ef687:src/quickwidgets/qquickwidget.cpp#L169) giải quyết được vấn đề này; có nghĩa là, nhúng các mục Qt Quick vào các tiện ích. Nó sẽ có sẵn trong Qt 5.3. – Mitch