31.qt quick-使用SwipeView添加滑动视图-高仿微信V2版本

摘要:
Count:int,只读属性,获取项目数currentIndex:int,当前项目索引编号currentItem:item,只读属性、当前项目MethodsvidaddItem,添加项目voidincrementCurrentIndex(),减少容器voidincamentCurrentIndex的当前索引(),增加容器voidinsertItem的当前索引,在索引处插入项目ItemAt,获取指定索引处的itemvoidmoveItem,将项从from索引移动到索引位置voidremoveItem,删除容器中指定的itemvoisetCurrentIndex,删除容器内指定的itemItemtakeItem,删除并返回指定索引的item2。SwipeView描述SwipeView由一组页面填充,一次只显示一个页面。它附加到SwipeView中的每个项目。

在上章我们学习了ListView,然后实现了: 28.qt quick-ListView高仿微信好友列表和聊天列表,本章我们来学习SwipeView滑动视图,并出高仿微信V2版本:

31.qt quick-使用SwipeView添加滑动视图-高仿微信V2版本第1张


1.Container介绍

由于SwipeView继承于Container,而Container是一个抽象的容器类.所以我们先来学习下Container
Container类的子类有:DialogButtonBox(对话框按钮框), MenuBar(菜单栏), SwipeView(滑动视图),TabBar、如下图所示:

31.qt quick-使用SwipeView添加滑动视图-高仿微信V2版本第2张

Properties

  • contentChildren :list<Item>,保存容器中的item所有项,与contentData不同,contentChildren只包括可视化的QML对象。当插入或移动项目时,它将重新排序。
  • contentData : list<Object>,保存容器中的所有数据列表,包含使用addItem()或者insertItem()方法动态添加或插入的项。与contentChildren不同,contentData包含了所有对象,并且插入或移动项目时,不会重新排序。
  • contentHeight : real,此属性保存内容高度。用于计算容器的总隐式高度。除非显式赋值它,否则内容高度将根据容器中项目的隐式高度自动计算。
  • contentWidth : real,和contentHeight一样,此属性保存内容高度
  • contentModel :model,只读属性,此属性保存item的内容模型。
  • count : int,只读属性,获取item数量
  • currentIndex : int,当前item索引号
  • currentItem : Item ,只读属性,当前item

Methods

  • void addItem(item),添加一个item
  • void decrementCurrentIndex(),递减容器的当前索引
  • void incrementCurrentIndex(),递增容器的当前索引
  • void insertItem(index, Item item),在index处插入一个item
  • Item itemAt(index),获取指定index处的item
  • void moveItem(from, int to),移动item从from索引到to索引位置
  • void removeItem(item),删除容器中指定的item
  • void setCurrentIndex(index),删除容器中指定索引的item
  • Item takeItem(index),删除并返回指定索引的item

2.SwipeView介绍

SwipeView(滑动视图)通过一组页面填充,每次只显示一个页面。用户可以通过横向滑动在页面之间导航,一般会将它与PageIndicator结合使用.

它的属性如下所示:

  • horizontal : bool,只读属性,此属性保存滑动视图是否水平方向的
  • interactive : bool,默认为true,表示用户可以滑动视图
  • orientation :enumeration,滑动视图方向,默认为Qt.Horizontal
  • vertical : bool ,只读属性,此属性保存滑动视图是否垂直方向的

它的Attached Properties附加属性如下所示:

  • index :int,此附加属性保存SwipeView中每个子项的索引。它附加到SwipeView的每个item项中。
  • isCurrentItem :bool,如果此子项是当前项,则此附加属性为true。它附加到SwipeView的每个item项中。
  • isNextItem : bool,如果此子项是下一项,则此附加属性为true。它附加到SwipeView的每个item项中。
  • isPreviousItem : bool如果此子项是上一个项目,则此附加属性为true。它附加到SwipeView的每个item项中。
  • view :SwipeView 此附加属性保存管理此子项的视图。它附加到SwipeView的每个item项。

使用SwipeView时,一般会将它与PageIndicator结合使用.PageIndicator用于标志在多个页面的容器时,当前活动的页面是哪个小圆圈.
示例代码如下所示:

Window {
    id: window
     400
    height: 400
    visible: true
    
    SwipeView {
        id: view
        currentIndex: 1
        anchors.fill: parent
        
        Rectangle {
            id: firstPage
            color: "red"
        }
        Rectangle {
            id: secondPage
            color: "yellow"
        }
        Rectangle {
            id: thirdPage
            color: "blue"
        }
    }
    
    PageIndicator {
        id: indicator
        
        count: view.count
        currentIndex: view.currentIndex
        
        anchors.bottom: view.bottom
        anchors.horizontalCenter: parent.horizontalCenter
    }

}

效果如下所示所示:

31.qt quick-使用SwipeView添加滑动视图-高仿微信V2版本第3张

3.SwipeView实战

为了方便后续更加方便添加模块,所以我们还需要重构之前V1版本整个文件目录结构,重构后的文件夹如下所示:

31.qt quick-使用SwipeView添加滑动视图-高仿微信V2版本第4张

接下来我们就在我们之前v1版本里面添加一个Page.qml,通过SwipeView实现切换微信主界面每页列表, Page.qml如下所示:

import QtQuick 2.12
import Qt.labs.folderlistmodel 2.12
import QtQuick.Layouts 1.12
import QtQuick.Controls 2.12
import "qrc:/bar" as Bars
import "qrc:/recentFirend" as RencentFirend

Rectangle {
    id: container
    anchors.fill: parent

    ListModel {             // 最近好友列表
        id: recentFirendModel
        // 格式如下所示:
        // 'name' : 好友名称
        // 'headSrc' : 头像位置
        // 'recode'(聊天记录) : [date(时间), msgType(hint提示、hintDate时间提示、recv接受提示、send发送提示), msg(信息内容)]
    }

    ColumnLayout {
        id: pageList
        anchors.fill: parent
        spacing: 0
        SwipeView {
            id: view
            currentIndex: 0
            Layout.fillHeight: true
            Layout.fillWidth: true
            interactive: false
            RencentFirend.RecentFirendList {
                id: recentFirendList
                onNewFirendRequest: {
                    addExample()
                }
                onEnterRequest: {
                    var obj = newJumpWindow("qrc:/chat/ChatList.qml", recentFirendModel.get(index));
                    console.log("",recentFirendModel.get(index).name)
                    obj.show();
                }
                Component.onCompleted: {
                    recentFirendList.setModel(recentFirendModel)
                }
            }
            Rectangle {
                Text {
                    text: "Page2"
                    anchors.centerIn: parent
                    font.pixelSize: 24
                    font.family: "Microsoft Yahei"
                }
            }
            Rectangle {
                Text {
                    text: "Page3"
                    anchors.centerIn: parent
                    font.pixelSize: 24
                    font.family: "Microsoft Yahei"
                }
            }
            Rectangle {
                Text {
                    text: "Page4"
                    anchors.centerIn: parent
                    font.pixelSize: 24
                    font.family: "Microsoft Yahei"
                }
            }

            onCurrentIndexChanged: {
                menuBar.swipeIndex(currentIndex)
            }

        }
        Bars.MenuBar {
            id: menuBar
            Layout.fillHeight: false
            Layout.fillWidth: true
            Layout.preferredHeight: 60
            onIndexClicked: {
                view.currentIndex = index

            }

        }
    }
    ... ...
}

最终效果如下所示(支持自适应布局):

31.qt quick-使用SwipeView添加滑动视图-高仿微信V2版本第5张

代码已上传群里, 未完待续,  后续出 微信V3版-添加通讯录列表控件(通过字典树实现中文转拼音排序)

 

免责声明:文章转载自《31.qt quick-使用SwipeView添加滑动视图-高仿微信V2版本》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇软件质量保障体系建设web框架前言与学生数据库系统(附1.0源码)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

ThinkPHP

ThinkPHP的开发模式是define//Debug mode define//当运行模式控制器的操作系统找不到请求的方法时,它将定位__Empty()方法处理。使用此机制,我们可以统一处理用户请求的所有不存在的操作。模块分组大A函数和大R函数有什么区别?关联数组易于操作,信息量相对较大...

将Kafka收到的数据传入到redis中

首先,配置配置。在属性测试中,首先启动网络管理系统(GateWay),然后启动终端(TBox),然后运行KafkaTest启动TBox。在启动测试中可以看到收到的数据。然后关键是sdf,然后去你的xshell启动动物园管理员、kafka和redis...

MySQL锁详解

MySQL锁详解update语句执行流程MySQL的锁介绍按照锁的粒度来说,MySQL主要包含三种类型(级别)的锁定机制:全局锁:锁的是整个database。由MySQL的SQLlayer层实现的表级锁:锁的是某个table。由MySQL的SQLlayer层实现的行级锁:锁的是某行数据,也可能锁定行之间的间隙。...

JavaScript算法学习:获取字符串最后一位方法及判断是否以指定字符串开始或结尾

Str.substr,其中start是必需的参数,表示坐标的起始位置。正值在正方向计数,负值在反方向计数,长度是可选参数,表示从起始位置开始计数的数字。...

C# Winform Treeview控件

WinformTreeview控件目录手动添加节点。丰富节点数据并清除所有节点信息。选择指定的节点。函数GetAllTreeNodeWinformTreeview控件手动添加节点//在根节点下添加根节点和子节点TreeNodeCollectionRoot=treeView1.Nodes;TreeNodecurNode=根。添加(“良好”);curN(电流)...

如何在Android模拟器上安装apk文件

如本实例的“mishop_2.0.20130911_1.1.1.apk”3.执行控制台命令,进行安装。切换到D盘,输入D:,然后点击Enter,即切换到D盘,输入cd,找到platform-tools的文件地址,即adb.exe的文件路径。,粘贴在控制台中。...