【问题标题】:Is there any way to embed a QWidget inside a QQmlApplicationEngine or QQuickView?有没有办法在 QQmlApplicationEngine 或 QQuickView 中嵌入 QWidget?
【发布时间】:2020-03-26 09:32:17
【问题描述】:

我找到了一种在 QML 中嵌入 QWidget 的方法,方法是使用 QQuickWidget 渲染(锚定,具有 QQuickWidget 位置的 QWidget),但我正在尝试使用 QQuickView/QmlApplicationEngine 来做同样的事情,它使用不同的渲染系统,并且没有显示 QWidget。

有什么想法吗?提前致谢!

【问题讨论】:

标签: qt qml qwidget qqmlapplicationengine qquickview


【解决方案1】:

cmets 上链接的帖子都没有回答我的问题。有这个小工作(对于那些需要它的人):

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

    QQmlApplicationEngine *engine = new QQmlApplicationEngine(&app);
    engine->load(QUrl("qrc:/qml/main.qml"));
    QQuickWindow* qmlwindow = qobject_cast<QQuickWindow *>(engine->rootObjects().first());

    CustomWidget *customwidget = new CustomWidget();
    QWindow* customwidgetwindow = QWindow::fromWinId(customwidget->winId());

    customwidgetwindow->setParent(qmlwindow);
    customwidget->show();

    if (window) {
        QQuickItem *qmlCustomWidget = qmlwindow->findChild<QQuickItem*>("qmlcustomwidget");
        if (qmlCustomWidget) {
            new WidgetAnchor(customwidgetwindow, qmlCustomWidget);
        }
    }

return app.exec();
}

CustomWidget 是基于 QWidget 的类,而 WidgetAnchor.cpp 是:

WidgetAnchor::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();
}

void WidgetAnchor::updateGeometry() {
    if (_pQuickItem) {
        QRectF r = _pQuickItem->mapRectToItem(nullptr, QRectF(_pQuickItem->x(), _pQuickItem->y(), _pQuickItem->width(), _pQuickItem->height()));
    _pWidget->setGeometry(r.toRect());
    }
}

在 main.qml 你有:

import QtQuick 2.0
import QtQuick.Window 2.3

Window {
    id: root
    visible: true
    width: 500; height: 500

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

【讨论】:

  • new WidgetAnchor(customwidgetwindow, qmlCustomWidget);QWindow* 传递给QWidget* 显然是错误的。
  • 您有什么更好的建议吗?
  • 如果只是为了让代码通过,可以像WindowAnchor(QWindow* pWindow, QQuickItem* pItem)这样更正。由qquickwidget 优先考虑嵌套 qml 的小部件。少量的小部件可以由此锚定。我只是指出你的答案的细节是错误的。
猜你喜欢
  • 2016-05-30
  • 2019-11-23
  • 2018-07-03
  • 2022-06-18
  • 1970-01-01
  • 2012-01-11
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多