在 QGraphicsScene 中显示 QQuickWidget

问题描述 投票:0回答:1

我正在升级一些旧代码,这些代码可以很好地在 QGraphicsScene 中显示我的 qml 文件,但我使用的是 QDeclarativeView + QGraphicsProxyWidget 方法,所以我使用 QQuickWidget 转换为新的 QT 6.5 / qtquick 2 格式。

旧代码(QT 4.8 / qt quick 1)-工作正常

    QGraphicsScene scene;
    QML_view = new QDeclarativeView;
    QDeclarativeContext *context = QML_view->rootContext();
    context->setContextProperty( "Vars_list", QVariant::fromValue( dataList ) );
    QML_view->rootContext()->setContextProperty( "myObject", this );
    QML_view->setSource( QUrl( "myqmlfile.qml" ) );

    QGraphicsProxyWidget *proxy = scene.addWidget( QML_view );
    proxy->setZValue( 10 );

新代码(QT 6.5 / qt quick 1)

    QGraphicsScene scene;
    QQuickWidget *QML_widget = new QQuickWidget();
    QQmlContext* context = QML_widget->rootContext();
    context->setContextProperty( "Vars_list", QVariant::fromValue( dataList ) );
    QML_widget->rootContext()->setContextProperty( "myObject", this );
    QML_widget->setSource( QUrl( "myqmlfile.qml" ) );

    scene.addWidget( QML_widget );

qml 显示正常,但所有 qml 按钮都没有响应,我的 QGraphicsScene 上可能有的任何现有按钮也显示在 qml 显示的顶部。

所以我尝试了另一种方法用 QML_widget->show() 替换 scene.addWidget(QML_widget)。 qml 文件现在按预期工作,但正如我所期望的那样,我现在在任务栏上打开了第二个我不想要的单独窗口。关于解决此问题的最佳方法是什么的任何线索?

qt qml qgraphicsscene qquickwidget
1个回答
0
投票

我正在使用 Qt 6.5.0 和 QtQuick.Controls 6.5 一切正常。根据这个page它说 QtQuick.Controls 1 is deprecated.

警告:自 Qt 5.12 起,Qt Quick Controls 1 模块已弃用。 请改用最新的 Qt Quick Controls 模块。

我的 Main.qml 中的按钮可以响应并输出所需的控制台消息。如果我使用

QPushButton
行,QML 小部件也位于
proxy->setZValue(10);
之上,就像您在 Qt 4.8 示例代码中所做的一样。

main.cpp

#include <QApplication>
#include <QGraphicsProxyWidget>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QPushButton>
#include <QQmlApplicationEngine>
#include <QQuickWidget>

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

    const QUrl url(u"qrc:/untitled15/Main.qml"_qs);

    QGraphicsScene scene;

    QQuickWidget *quickWidget = new QQuickWidget();
    quickWidget->setSource(url);

    QGraphicsProxyWidget *proxy = scene.addWidget(quickWidget);
    proxy->setZValue(10);

    QPushButton *button = new QPushButton("Button");
    scene.addWidget(button);

    QGraphicsView view(&scene);
    view.setWindowTitle("Hello World");
    view.resize(800, 600);
    view.show();

    return app.exec();
}

Main.qml

import QtQuick
import QtQuick.Controls

Item {
    width: 400
    height: 300

    Column {
        anchors.centerIn: parent

        Text {
            text: "Hello from QML"
            color: "red"
        }

        Button {
            text: "Button #0"
            onPressed: console.log("pressed", text)
        }
        Button {
            text: "Button #1"
            onPressed: console.log("pressed", text)
        }
        Button {
            text: "Button #2"
            onPressed: console.log("pressed", text)
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.