1

伙计们!我是 qt 的新用户,我遇到了 qml 的问题。这个问题已经在这篇文章中讨论过了,但是对于 python。我用 C++/Qt 6.1.1、QtCreator 4.15.1 编写开源代码。请帮帮我。

这是问题的症结所在:qml 不起作用,应用程序输出写入以下消息:“无法创建顶点着色器:错误 0x80070057:????????????????????????? . 未能建立图形管线状态”。

Qt 文档说这是因为“场景图适应”。这是链接:https ://doc-snapshots.qt.io/qt6-dev/qtquick-visualcanvas-adaptations.html 。

我尝试使用主要文章中的此方法: QQuickWindow :: setSceneGraphBackend ("QT_QUICK_BACKEND"); 为此,您还需要包含库QQuickWindow

但是,Qt 给出以下错误:无法为后端“QT_QUICK_BACKEND”创建场景图上下文 - 检查插件是否正确安装在 C 中:/Qt/6.1.1/mingw81_64/plugins 在这里我不再明白该怎么做......

为了清楚起见,我提供了代码。因为在 qml 中创建一个窗口并在其中包含Rectangle {}就足够了。

我从示例中获取了代码(尝试了 3 个 QtQuick 示例)。下面是主要功能代码:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickWindow>

int main(int argc, char *argv[])
{
    QQuickWindow::setSceneGraphBackend("QT_QUICK_BACKEND");
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl("qrc:/sidepanel.qml"));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

QML 代码:

import QtQuick
import QtQuick.Controls

ApplicationWindow {
    id: window
    width: 360
    height: 520
    visible: true
    title: qsTr("Side Panel")

    //! [orientation]
    readonly property bool inPortrait: window.width < window.height
    //! [orientation]

    ToolBar {
        id: overlayHeader

        z: 1
        width: parent.width
        parent: Overlay.overlay

        Label {
            id: label
            anchors.centerIn: parent
            text: "Qt Quick Controls"
        }
    }

    Drawer {
        id: drawer

        y: overlayHeader.height
        width: window.width / 2
        height: window.height - overlayHeader.height

        modal: inPortrait
        interactive: inPortrait
        position: inPortrait ? 0 : 1
        visible: !inPortrait

        ListView {
            id: listView
            anchors.fill: parent

            headerPositioning: ListView.OverlayHeader
            header: Pane {
                id: header
                z: 2
                width: parent.width

                contentHeight: logo.height

                Image {
                    id: logo
                    width: parent.width
                    source: "images/qt-logo.png"
                    fillMode: implicitWidth > width ? Image.PreserveAspectFit : Image.Pad
                }

                MenuSeparator {
                    parent: header
                    width: parent.width
                    anchors.verticalCenter: parent.bottom
                    visible: !listView.atYBeginning
                }
            }

            footer: ItemDelegate {
                id: footer
                text: qsTr("Footer")
                width: parent.width

                MenuSeparator {
                    parent: footer
                    width: parent.width
                    anchors.verticalCenter: parent.top
                }
            }

            model: 10

            delegate: ItemDelegate {
                text: qsTr("Title %1").arg(index + 1)
                width: listView.width
            }

            ScrollIndicator.vertical: ScrollIndicator { }
        }
    }

    Flickable {
        id: flickable

        anchors.fill: parent
        anchors.topMargin: overlayHeader.height
        anchors.leftMargin: !inPortrait ? drawer.width : undefined

        topMargin: 20
        bottomMargin: 20
        contentHeight: column.height

        Column {
            id: column
            spacing: 20
            anchors.margins: 20
            anchors.left: parent.left
            anchors.right: parent.right

            Label {
                font.pixelSize: 22
                width: parent.width
                elide: Label.ElideRight
                horizontalAlignment: Qt.AlignHCenter
                text: qsTr("Side Panel Example")
            }

            Label {
                width: parent.width
                wrapMode: Label.WordWrap
                text: qsTr("This example demonstrates how Drawer can be used as a non-closable persistent side panel.\n\n" +
                           "When the application is in portrait mode, the drawer is an interactive side panel that can " +
                           "be swiped open from the left edge. When the application is in landscape mode, the drawer " +
                           "and the content are laid out side by side.\n\nThe application is currently in %1 mode.").arg(inPortrait ? qsTr("portrait") : qsTr("landscape"))
            }
        }

        ScrollIndicator.vertical: ScrollIndicator { }
    }
}
4

1 回答 1

0

我刚刚从 Qt 5.12 切换到 Qt 6.1.2,也遇到了和你一样的问题。我上线了 :

  • Windows x64(具有相当旧的 CPU 和图形)
  • Qt 6.1.2,面向 MSVC 和 MingW 的桌面

简而言之,可行的解决方案是将 Qt Quick 渲染设置为软件。 但是怎么做呢?

不,你只需要根据你的场景选择一个:

解决方案 1:在 OS env 级别将渲染永久设置为软件

优点:您不必在每次创建项目时都设置 env 值。

缺点:这将不太便携,如果您将项目移动到另一台机器,您可能会在 OS Env 级别再次设置它。

因此,此方法仅适用于开发目的。

怎么做? 只需将QT_QUICK_BACKEND设置为系统环境中的软件 。在 Windows 上:

  • 点击Win+R并输入control sysdm.cpl,,3
  • 在以值命名的Environment Variables>System Variables寄存器New... 变量上QT_QUICK_BACKENDsoftware
  • 重新启动 Qt 创建器并重建。这应该使其无需任何代码修改即可工作。

在此处输入图像描述

解决方案 2:动态设置 QT_QUICK_BACKEND 值到软件

这与解决方案 1 相同,但我们没有写入 OS Env,而是将其动态设置为代码中的标志。

此方法可用于生产或开发。

怎么做?

  • main.cpp就在你qputenv("QT_QUICK_BACKEND","software");main()声明之后。
  • 保存并重建项目
  • 完毕

解决方案3:将场景图渲染器显式设置为软件

好吧,我看到了您的代码,这有点想念。而不是将值设置为QT_QUICK_BACKEND您应该设置为software

怎么做?

  • 在您main.cpp导入 QQuickWindow 时:

#include <QQuickWindow>

  • 接下来,在main()声明之后添加:

QQuickWindow::setSceneGraphBackend("software");

  • 保存并重建项目
  • 完毕

在此处输入图像描述

它现在应该可以工作了,窗口不再显示空白画布,QtQuick 小部件正在显示: 在此处输入图像描述

于 2021-08-13T08:01:34.957 回答