这是我的xml:
<?xml version="1.0" encoding="utf-8"?>
<parameters version="2.0">
<page currentPage = "1">
</page>
<page currentPage = "2">
</page>
</parameters>
这是我的qml代码:
import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3
import QtQuick.Controls.Styles 1.4
import QtQuick.Extras 1.4
import QtQuick.XmlListModel 2.0
import QtQml.Models 2.2
ApplicationWindow {
id: mainWindow
visible: true
minimumWidth: 500
minimumHeight: 500
XmlListModel {
id: pageXmlModel
source: "qrc:/Config/Esempio.xml"
query: "/parameters/page"
XmlRole { name: "currentPage"; query: "@currentPage/number()" }
}
ListView {
id: pageListView
model: pageXmlModel
anchors.fill: parent
orientation: Qt.Horizontal
clip: true
snapMode: ListView.SnapOneItem
delegate: Rectangle {
id: myPageContainer
anchors.fill: parent
Page {
id: myPage
anchors.fill: parent
Text { text: currentPage }
}
}
}
}
无法理解为什么结果只有一页带有重叠的标签,有更多页面,每一页都带有标签。 有人能告诉我哪里出错了吗?
谢谢!
答案 0 :(得分:0)
我能在代码中看到的唯一问题是你的代表:
delegate: Rectangle {
id: myPageContainer
anchors.fill: parent // <--- Here is a BIG problem
Page {
id: myPage
anchors.fill: parent
Text { text: currentPage }
}
}
您将委托设置为填充父级。这会发生什么?
好吧,ListView
扩展了Flickable
,因此它有一个contentItem
,可以将代理的所有实例保持在一起。 contentItem
的大小取决于您的委托的所有可见实例的大小与模型计数的关系。究竟是怎么计算的还是我所不知道的。 (see here )
但是,在您anchors.fill: parent
的情况下,您需要调整代理人的大小以便始终填充contentItem
。这将导致contentItem
的增长,这将导致delegate
的增长,依此类推。你有一个绑定循环。
有趣的是,当您使用XmlListModel
而不是数字作为模型时,QML似乎检测到此问题,并且不接受anchors.fill: parent
。因此,在您的示例中,每个widht
的{{1}}为 0 。这会导致您的问题,即您将两个页面的文本放在一起。
经验教训: 从不在代理的根节点中使用delegate
。
anchors.fill: parent