Qt 将公共对象作为列表保存在QML中
我在QML中开发的应用程序中存在架构问题。请考虑以下数字: 有关应用程序的一些事实:Qt 将公共对象作为列表保存在QML中,qt,architecture,qml,Qt,Architecture,Qml,我在QML中开发的应用程序中存在架构问题。请考虑以下数字: 有关应用程序的一些事实: 我需要存储一个元素名数组,这里是橙色、苹果和香蕉 元素的数量是固定的,在运行时不会更改 虽然只有1个元素数组,但应该可以同时以不同的图形形式显示。在本例中,元素一度表示为黄色正方形,其他时间表示为绿色三角形。它们不一定必须以相同的顺序显示。但在运行时,顺序也不会改变 我希望避免不必要的代码复制,因此,我只希望使用1个具有不同图形表示的列表。然而,我在实现这一点时遇到了问题 Welp,在我有足够的声誉之前不能发
我希望避免不必要的代码复制,因此,我只希望使用1个具有不同图形表示的列表。然而,我在实现这一点时遇到了问题 Welp,在我有足够的声誉之前不能发表评论,但你就不能用这个吗?然后可以使用两个路径视图来确定对象的位置。这是一个示例,但您将拥有自己的QabStretchListModel,而不是示例ListModel。代表将决定项目的形状
之所以在QML的ListModel上使用QabStretchListModel,是因为ListModel是在运行时创建的。Welp,在我有足够的声誉之前,不能发表评论,但你不能仅用于此吗?然后可以使用两个路径视图来确定对象的位置。这是一个示例,但您将拥有自己的QabStretchListModel,而不是示例ListModel。代表将决定项目的形状
之所以在QML的ListModel上使用QabStretchListModel,是因为ListModel是在运行时创建的。我不太明白OP想要归档什么,但我想您需要的就是这个模型。 这是可重用模型的一个简单示例:
import QtQuick 2.11
import QtQuick.Window 2.2
import QtQuick.Controls 2.2
Window {
visible: true
width: 600
height: 400
title: qsTr("Model example")
ListModel {
id: myModel;
ListElement { name: "Apple" }
ListElement { name: "Orange" }
ListElement { name: "Banana" }
}
Repeater {
model: myModel
delegate: type1
}
Repeater {
model: myModel
delegate: type2
}
ListView {
model: myModel
delegate: Text { text: name; height: 30; }
width: 100
height: 200
}
ComboBox {
width: 100
y: 200
model: myModel
}
Component {
id: type1
Canvas {
x: 100 + Math.round(Math.random() * 400)
y: Math.round(Math.random() * 100)
rotation: Math.round(Math.random() * 360)
antialiasing: true
width: 100
height: 100
onPaint: {
var ctx = getContext("2d");
ctx.fillStyle = "#00DD00";
ctx.beginPath();
ctx.moveTo(50, 0);
ctx.lineTo(100, 100);
ctx.lineTo(0, 100);
ctx.fill();
}
Text {
anchors.centerIn: parent
text: name
}
}
}
Component {
id: type2
Rectangle {
x: 100 + Math.round(Math.random() * 400)
y: 200 + Math.round(Math.random() * 100)
rotation: Math.round(Math.random() * 360)
antialiasing: true
width: 100
height: 100
color: "orange"
Text {
anchors.centerIn: parent
text: name
}
}
}
}
我不太明白OP想要归档什么,但我想那个模型正是您所需要的。 这是可重用模型的一个简单示例:
import QtQuick 2.11
import QtQuick.Window 2.2
import QtQuick.Controls 2.2
Window {
visible: true
width: 600
height: 400
title: qsTr("Model example")
ListModel {
id: myModel;
ListElement { name: "Apple" }
ListElement { name: "Orange" }
ListElement { name: "Banana" }
}
Repeater {
model: myModel
delegate: type1
}
Repeater {
model: myModel
delegate: type2
}
ListView {
model: myModel
delegate: Text { text: name; height: 30; }
width: 100
height: 200
}
ComboBox {
width: 100
y: 200
model: myModel
}
Component {
id: type1
Canvas {
x: 100 + Math.round(Math.random() * 400)
y: Math.round(Math.random() * 100)
rotation: Math.round(Math.random() * 360)
antialiasing: true
width: 100
height: 100
onPaint: {
var ctx = getContext("2d");
ctx.fillStyle = "#00DD00";
ctx.beginPath();
ctx.moveTo(50, 0);
ctx.lineTo(100, 100);
ctx.lineTo(0, 100);
ctx.fill();
}
Text {
anchors.centerIn: parent
text: name
}
}
}
Component {
id: type2
Rectangle {
x: 100 + Math.round(Math.random() * 400)
y: 200 + Math.round(Math.random() * 100)
rotation: Math.round(Math.random() * 360)
antialiasing: true
width: 100
height: 100
color: "orange"
Text {
anchors.centerIn: parent
text: name
}
}
}
}
@谢谢你的回答。问题是,我没有MWE,因为我尝试的东西甚至不会运行。这更多的是一个概念问题,因为我不知道如何编写代码(因此没有提供MWE)。相反,我引入了一个使用图像的概念,它也只显示了用QML组件表达的想法,不能解释为工作代码,因为它不像我所说的那样工作。我用它来帮助理解我的问题。如果你认为这一部分是矛盾的,我可以删除它。它表明代码的工作方式与我展示的不一样。格式不对,是的。将修复.architecture问题,但特定于QML,因为我不知道如何在实践中使用QML。我已删除了代码部分。@eyllanesc谢谢您的回答。问题是,我没有MWE,因为我尝试的东西甚至不会运行。这更多的是一个概念问题,因为我不知道如何编写代码(因此没有提供MWE)。相反,我引入了一个使用图像的概念,它也只显示了用QML组件表达的想法,不能解释为工作代码,因为它不像我所说的那样工作。我用它来帮助理解我的问题。如果你认为这一部分是矛盾的,我可以删除它。它表明代码的工作方式与我展示的不一样。格式不对,是的。将修复.architecture问题,但特定于QML,因为我不知道如何在实践中使用QML。我已删除了代码部分。使用
ListModel
甚至简单的js数组作为模型都可以。这完全取决于OP的需要。一般来说,我想把QML尽可能地独立于C++代码。如果可能的话,我会坚持使用QML-only方法。这完全取决于OP的需要。一般来说,我想把QML尽可能地独立于C++代码。如果可能的话,我会坚持只使用QML的方法。这正是我的意思。我知道理论上的经典模型通常应该是什么样子,但我不知道如何使用QML实现它。谢谢,这正是我的意思。我知道理论上的经典模型通常应该是什么样子,但我不知道如何使用QML实现它。非常感谢。