【QT】QML—— ListView添加固定表头的方法

这篇具有很好参考价值的文章主要介绍了【QT】QML—— ListView添加固定表头的方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在qt中构建界面时经常会对多个数据进行排列显示,可以使用qml提供的ListView组件来快速的构建一个列表模型来进行列表内容的分组显示;
通常的步骤是定义一个简单的ListView列表。创建一个Model并填入数据到其中;

Rectangle {
	id:rootRect;
	width:600;
	height:200;
	color:"grey";

	ListView {
		id:listView;
		width:parent.width;
		height:parent.height;
		clip:true; //对超出划定边界的数据进行裁剪
		delegate:modelItem; //自定义列表内容的组件,属性是Component
		//构建一个Model,也可以直接引入c++中的创建的model 运行程序可已看到生成了一个包含name,age,Heigth的列表
     model:ListModel {
         id: listModel;
         ListElement {
             name:"jack";
             age: "22";
             Height: "188cm"
         }
         ListElement {
             name:"mark";
             age:"19";
             Height:"178cm";
         }
         ListElement {
             name:"zhangsan";
             age:"17";
             Height:"177cm";
         }
         ListElement {
             name:"lisi";
             age:"27";
             Height:"167cm";
         }
         ListElement {
             name:"xiaoxiao";
             age:"25";
             Height:"18";
         }
     }
	}

   Component {
       id:modelItem;
       Rectangle {
           width:parent.width;
           height:40;
           color: "grey"
           Row {
               width:0.9*parent.width;
               anchors.left: parent.left;
               anchors.leftMargin: 0.1*parent.width;
               height:parent.height;
               Label {
                   text: name;
                   font.pixelSize: 20;
                   width: 0.3*parent.width;
                   anchors.verticalCenter: parent.verticalCenter;
                   verticalAlignment: Text.AlignHCenter;
               }
               Label {
                   text: age;
                   font.pixelSize: 20;
                   width: 0.3*parent.width
                   anchors.verticalCenter: parent.verticalCenter;
                   verticalAlignment: Text.AlignHCenter;
               }
               Label {
                   text: Height;
                   font.pixelSize: 20;
                   width: 0.3*parent.width
                   anchors.verticalCenter: parent.verticalCenter;
                   verticalAlignment: Text.AlignHCenter;
               }
           }
       }
   }
}

以上的内容在qt运行显示的是一个基础的列表,但是一眼望去并不明确每一项的具体含义, 这样在一些使用过程中很不方便:具体的显示效果如下:
【QT】QML—— ListView添加固定表头的方法
可以通过鼠标移动或者滚轮滑动查看列表的显示,但是对每一项的含义不是那么的直观,也有一种方法就是直接在model也就是列表的index为1的时候添加每一列的名称进去,显示的时候可以看到每一列的名称,具体代码如下,只需在model的第一列添加如下代码到最前面:(修改后的model如下)

model:ListModel {
    id: listModel;
    ListElement {
        name:"name";
        age:"age";
        Height:"height";
    }

    ListElement {
        name:"jack";
        age: "22";
        Height: "188cm"
    }
    ListElement {
        name:"mark";
        age:"19";
        Height:"178cm";
    }
    ListElement {
        name:"zhangsan";
        age:"17";
        Height:"177cm";
    }
    ListElement {
        name:"lisi";
        age:"27";
        Height:"167cm";
    }
    ListElement {
        name:"xiaoxiao";
        age:"25";
        Height:"181cm";
    }
    ListElement {
        name:"huahua";
        age:"38";
        Height:"188cm"
    }
}

效果展示:
【QT】QML—— ListView添加固定表头的方法
可以看到第一行有显示每一列数据的名字了,但是因为设置的字体显示与后面一致(可以单独对某一个index的item设置不同的参数来突出显示,这里不做过多说明),而且会随着滑动,而且数据多了会滑动消失,所以不推荐使用;
在qml中,可以ListView的特性创建一个列表头,显示每一项的具体含义;表头header的属性和delegate一样也是Component;通过自定义表头的组件显示到列表最上面;

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.4

Window {
    id: window
    width: 640
    height: 200
    visible: true
    title: qsTr("Hello World")
    //qml ListView组件
    /*
      定义一个简单的ListView列表,并创建一个Model填入数据,运行程序可已看到生成了一个包含name,age,Heigth但是一眼望去并不明确每一项的具体含义;
      利用ListView的特性创建一个列表头,显示每一项的具体含义;表头header的属性和delegate一样也是Component;
     */

    Rectangle {
        id:rootRect
        width:parent.width;
        height:parent.height;
        color: "darkgrey";

        ListView {
            id:listView;
            width:parent.width;
            height:parent.height;
            clip: true; //超出边界的数据进行裁剪
            delegate:modelItem;
            header:headerView;//只构建表头上滑动时表头也会跟随上滑动消失
            headerPositioning: ListView.OverlayHeader;//枚举类型
            /*
                ListView.OverlayHeader: 向上滑动直接覆盖表头
                ListView.InlineHeader:表头和内容是放置在一起的,移动也是一起移动,默认设置此属性;
                ListView.PullBackHeader:表头和内容是可以分开,向上滑动会顶上去看不见
            */

            //构建一个Model
            model:ListModel {
                id: listModel;
                ListElement {
                    name:"jack";
                    age: "22";
                    Height: "188cm"
                }
                ListElement {
                    name:"mark";
                    age:"19";
                    Height:"178cm";
                }
                ListElement {
                    name:"zhangsan";
                    age:"17";
                    Height:"177cm";
                }
                ListElement {
                    name:"lisi";
                    age:"27";
                    Height:"167cm";
                }
                ListElement {
                    name:"xiaoxiao";
                    age:"25";
                    Height:"18";
                }
            }
        }

        Component {
            id:headerView;
            Rectangle {
                width:parent.width;
                height: 40;
                color: "lightgrey";
                z:2;//将表头的z坐标设置在上层,表头在设置属性为overlayHeader时就不会随滑动而消失,始终显示在最上面

                Row {
                    width: 0.9*parent.width;
                    height: parent.height;
                    anchors.left: parent.left;
                    anchors.leftMargin: 0.1*parent.width;

                    Label {
                        text: "name";
                        font.pixelSize: 20;
                        width: 0.3*parent.width;
                        anchors.verticalCenter: parent.verticalCenter;
                        verticalAlignment: Text.AlignHCenter;
                    }
                    Label {
                        text: "age";
                        font.pixelSize: 20;
                        width: 0.3*parent.width
                        anchors.verticalCenter: parent.verticalCenter;
                        verticalAlignment: Text.AlignHCenter;
                    }
                    Label {
                        text: "Height";
                        font.pixelSize: 20;
                        width: 0.3*parent.width
                        anchors.verticalCenter: parent.verticalCenter;
                        verticalAlignment: Text.AlignHCenter;
                    }

                }
            }
        }

        Component {
            id:modelItem;
            Rectangle {
                width:parent.width;
                height:40;
                color: "grey"
                Row {
                    width:0.9*parent.width;
                    anchors.left: parent.left;
                    anchors.leftMargin: 0.1*parent.width;
                    height:parent.height;
                    Label {
                        text: name;
                        font.pixelSize: 20;
                        width: 0.3*parent.width;
                        anchors.verticalCenter: parent.verticalCenter;
                        verticalAlignment: Text.AlignHCenter;
                    }
                    Label {
                        text: age;
                        font.pixelSize: 20;
                        width: 0.3*parent.width
                        anchors.verticalCenter: parent.verticalCenter;
                        verticalAlignment: Text.AlignHCenter;
                    }
                    Label {
                        text: Height;
                        font.pixelSize: 20;
                        width: 0.3*parent.width
                        anchors.verticalCenter: parent.verticalCenter;
                        verticalAlignment: Text.AlignHCenter;
                    }
                }
            }
        }
    }
}

如果表头还是会随着滑动消失,可以设置组件的z轴,让该组件显示在最上层,达到表头一直显示的效果;特别要注意的是需要设置ListView的headerPositioning的属性为ListView.OverlayHeader这个类型(三个类型的描述在代码里有注释),这个是向上滑动覆盖表头,但是因为表头的z轴设置的是最上层,所以并不会被覆盖,以此达到表头显示的效果。
以上的header添加后就可以在显示一个带表头的列表,并且列表滑动表头不会随着列表滑动,始终显示在最上方。实现效果显示如下:
【QT】QML—— ListView添加固定表头的方法

可以看到表头一直显示到最上方,且不会随滑动消失。
还有一个问题就是一个点击穿透的问题,上滑后点击表头会触发列表内容的点击,如果有监控对列表的点击操作时点击表头就会造成误操作,这里就需要做一个放穿透效果,即在表头的组件中加上以下代码:

MouseArea {
    anchors.fill: parent;
    onPressed: {
        mouse.accepted = true;
    }
}

如上所述。文章来源地址https://www.toymoban.com/news/detail-515222.html

到了这里,关于【QT】QML—— ListView添加固定表头的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 80.qt qml-QianWindow炫酷界面框架-新增Canvas动态背景

    如下图所示:    动图如下所示: 如果我们使用图片,对于分辨率大的显示时,如果图片太小会失真,如果图片太大会占用很大内存,而且如果是动态图背景,那么至少40MB大小了. 所以我们增加Canvas动态背景功能,而且Canvas还可以根据系统性能我们来进行内部代码优化.比单色背景有趣的

    2024年02月05日
    浏览(28)
  • Qt6 第一天认识基本模块、附加模块、支持的平台、QML用户界面

    Qt 5在很多年前发布,引入了一种新的声明方式来编写令人惊叹的用户界面。从那时起,我们周围的世界发生了很大的变化。 Qt 6将是Qt 5的延续,不会对大多数用户造成干扰。是什么让Qt对用户有价值? 它的跨平台特性 它的可扩展性 世界一流的API和文档 可维护性、稳定性和兼

    2024年02月13日
    浏览(40)
  • 【QML】使用 QtQuick2的ListView创建一个列表(一)

    qtquick2版本和qtquick1版本分别提供了一个ListView组件供使用,两个组件在使用上和属性的提供上还是有比较大的差异的,因为qtquick2是新的,所以就以改版本为基础学习如何使用; 首先,要知道ListView提供了那些属性提供修改,那些是只读,各个属性的类型是啥,这些可用在Q

    2024年02月09日
    浏览(29)
  • QT界面中再添加界面窗口

    目录 使用场景: 教程: 1.首先创建一个qt设计师界面类 2.现在你有界面了,但是没有创建 3.创建了界面,但是没有容纳该界面的地方,这个时候就要选择容纳的界面, 4.创建完成控件以后开始添加界面,大体的方法基本都是这个 首先说一下使用场景,很多时候一个界面会包含很多不

    2024年02月16日
    浏览(29)
  • Qt Qml 多媒体播放视频(MediaPlayer)遇到的问题及解决方法

    Qml 多媒体播放视频开发过程中遇到的问题,记录一下。 创建的Qt Quick Ui Prototype工程,视频播放正常。但是相同的代码在Qt Quick Application(compat)中却不能正常显示。 Qt Quick Ui Prototype目录结构 Qt Quick Application(compat) 目录结构 Qt Quick Ui Prototype 工程 这里没有什么需要注意的,按照

    2024年02月05日
    浏览(39)
  • qt学习:模仿qq界面+添加资源+无边框界面+修改样式

    目录 一,创建登录ui界面类 LoginWidget 二,添加图片资源 三,通过样式的方法将图片设置成圆圈的背景 四,新建登录后的ui界面  MWindow  简陋的就可以,因为只为了学习,可以自己补充 五,新建三个嵌套ui界面类,ChatWidget聊天界面   FriendWiidget好友界面   CollectWidget收藏界面

    2024年01月23日
    浏览(30)
  • 给table组件(有固定列的时候)固定表头的功能实现

    1,增加height属性 在props中添加height属性, 保证在父组件中可以传值。如果父组件不传值,那么就是undefined 2,修改样式 最主要的是thead和tbody的样式,其中都是根据height去动态控制thead和tbody的样式,注意下面三个类所在的位置以及对应的样式。 cvn-table-head-row cvn-table-body-row

    2024年02月12日
    浏览(31)
  • Qt学习_11_构建内嵌子界面与独立子界面的框架

    对于较大的Qt项目而言,弹出的 独立 子界面 与 根据菜单在主窗口内切换的 内嵌 子界面是我们所必须面对的问题。那么在项目框架对这两部分内容应该如何布局,才能让项目 更清爽 , 更规整 。是本文着重讨论的内容。下图给出我们的最终设计框架。 1.1.1 创建 首先介绍独

    2024年02月02日
    浏览(22)
  • QT6为工程添加资源文件,并在ui界面引用

    这种方式虽然添加到了工程中,但不能在UI设计界面完成引用。主要原因可能是未把文件放入到项目资源文件中,以下面一种方式可以看出区别。 选择qt resource file,点击选择, 然后通过下面的设置得到一个.qrc的资源文件, 鼠标右键这个资源文件,第一种添加的文件在qrc文件

    2024年02月11日
    浏览(35)
  • element-ui 设置table表头固定

    设置包裹table组件的标签flex:1 将table高度设为100% 统一设置样式,在App.vue添加样式: 对应界面设置样式

    2024年02月11日
    浏览(81)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包