• Roson的Qt之旅#107 QML ListView


    1.概述

    ListView显示的数据来自于从内置的QML类型创建的模型,如ListModel和XmlListModel,或在C++中定义的继承于QAbstractItemModel或QAbstractListModel的自定义模型类。
    ListView有一个模型,它定义了要显示的数据,还有一个委托,它定义了数据应该如何显示。列表视图中的项目是水平或垂直布置的。由于ListView继承了Flickable,所以ListView本质上是可弹出的。


    2.使用实例

    下面的例子显示了一个简单的列表模型的定义,它被定义在一个叫做ContactModel.qml的文件中。

    1.   import QtQuick 2.0
    2.   ListModel {
    3.       ListElement {
    4.           name: "Bill Smith"
    5.           number: "555 3264"
    6.       }
    7.       ListElement {
    8.           name: "John Brown"
    9.           number: "555 8426"
    10.       }
    11.       ListElement {
    12.           name: "Sam Wise"
    13.           number: "555 0473"
    14.       }
    15.   }


      
    另一个组件可以在ListView中显示这个模型数据,像这样。

    1. import QtQuick 2.9
    2. import QtQuick.Window 2.2
    3. Window {
    4. visible: true
    5. width: 640
    6. height: 480
    7. title: qsTr("Hello World")
    8. ListView {
    9. width: 180; height: 200
    10. model: ContactModel {}
    11. delegate: Text {
    12. text: name + ": " + number
    13. }
    14. }
    15. }

    在这里,ListView为其模型创建了一个ContactModel组件,为其委托创建了一个Text项目。视图将为模型中的每个项目创建一个新的Text组件。委托人能够直接访问模型的名字和号码数据。

    运行效果如下:

     

    下面是一个改进的列表视图。委托在视觉上得到了改进,并被移到一个单独的contactDelegate组件中。

    1. import QtQuick 2.9
    2. import QtQuick.Window 2.2
    3. Window {
    4. visible: true
    5. width: 640
    6. height: 480
    7. title: qsTr("Hello World")
    8. Rectangle {
    9. width: 180; height: 200
    10. Component {
    11. id: contactDelegate
    12. Item {
    13. width: 180; height: 40
    14. Column {
    15. Text { text: 'Name: ' + name }
    16. Text { text: 'Number: ' + number }
    17. }
    18. }
    19. }
    20. ListView {
    21. anchors.fill: parent
    22. model: ContactModel {}
    23. delegate: contactDelegate
    24. highlight: Rectangle { color: "lightsteelblue"; radius: 5 }
    25. focus: true
    26. }
    27. }
    28. }

    运行效果如下: 

    上面的代码使用了高亮属性highlight,当前选择的项目被蓝色的矩形高亮显示,焦点被设置为 "true",以启用列表视图的键盘导航。列表视图本身是一个焦点范围(更多细节见Qt Quick中的键盘焦点)。

    代理根据需要被实例化,并且可以在任何时候被销毁。它们是ListView的contentItem的父对象,而不是视图本身。状态不应该被存储在一个委托中。
    ListView将一些属性附加到委托的根项上,例如ListView.isCurrentItem。在下面的例子中,根委托项可以作为ListView.isCurrentItem直接访问这个附加属性,而子contactInfo对象必须作为wrapper.ListView.isCurrentItem引用这个属性。

    1. import QtQuick 2.9
    2. import QtQuick.Window 2.2
    3. Window {
    4. visible: true
    5. width: 640
    6. height: 480
    7. title: qsTr("Hello World")
    8. ListView {
    9. width: 180; height: 200
    10. Component {
    11. id: contactsDelegate
    12. Rectangle {
    13. id: wrapper
    14. width: 180
    15. height: contactInfo.height
    16. color: ListView.isCurrentItem ? "black" : "red"
    17. Text {
    18. id: contactInfo
    19. text: name + ": " + number
    20. color: wrapper.ListView.isCurrentItem ? "red" : "black"
    21. }
    22. }
    23. }
    24. model: ContactModel {}
    25. delegate: contactsDelegate
    26. focus: true
    27. }
    28. }

    运行效果如下:
      

    注意事项

    视图不会自动启用剪辑。如果视图没有被其他项目或屏幕剪掉,就有必要设置clip: true以使视图之外的项目被很好地剪掉。

     

  • 相关阅读:
    数据结构学习笔记(第八章 排序-内部排序)
    FP独立站获客难?斗篷黑科技你玩转了吗?
    如何修复丢失的vcruntime140_1.dll文件
    还在手撸TCP/UDP/COM通信?一个仅16K的库搞定!
    Vue前端框架搭建
    Hacker 资讯|11 月中下旬区块链黑客松活动汇总
    电子学会2022年6月青少年软件编程(图形化)等级考试试卷(二级)答案解析
    【故障公告】cc攻击又来了,雪上加霜的三月
    获取随机id的api接口
    左连接一对多的情况
  • 原文地址:https://blog.csdn.net/jolin678/article/details/126208132