【发布时间】: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 { }
}
}
【问题讨论】: