【问题标题】:Qt: Qt 6.1.1 Failed to create vertex shader: Error 0x80070057Qt:Qt 6.1.1 无法创建顶点着色器:错误 0x80070057
【发布时间】:2021-09-10 05:40:29
【问题描述】:

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

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

Qt 文档说这是因为“Scene Graph Adaptations”。这是链接: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 { }
    }
}

【问题讨论】:

    标签: c++ qt c++11 qt6


    【解决方案1】:

    我刚从 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 设置为 software。 在 Windows 上:

    • 点击Win+R并输入control sysdm.cpl,,3
    • Environment Variables&gt;System Variables注册New...变量名为QT_QUICK_BACKEND,值为software
    • 重新启动 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 &lt;QQuickWindow&gt;

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

    QQuickWindow::setSceneGraphBackend("software");

    • 保存并重建项目
    • 完成

    它现在应该可以工作了,窗口不再显示空白画布,QtQuick 小部件正在显示:

    【讨论】:

      猜你喜欢
      • 2016-03-24
      • 1970-01-01
      • 2017-08-11
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多