Qml - 可滚动的页面视图

时间:2017-03-22 13:10:02

标签: qt listview model qml

这是我的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 }
            }
        }
    }
}

无法理解为什么结果只有一页带有重叠的标签,有更多页面,每一页都带有标签。 有人能告诉我哪里出错了吗?

谢谢!

1 个答案:

答案 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