怎样优化QTableView的性能( 二 )
我的需求:
【怎样优化QTableView的性能】 1、表格可以导入、导出xml/json格式的数据。
2、表格的每一列是定制的(数据类型和用来显示的控件都不同)
3、表格编辑功能,包括增、删、改、查,撤销、恢复,以及特定规则的内容校验。
我的实现:
1、显然要做xml/json的解析,Qt对xml/json的支持已经很好了。这里的难点是,把json/xml转换成TableView需要的数据ListModel,和把ListModel转换回json/xml数据。qml中有JSON.parse和JSON.stringify可以完成这个工作,实际开发中要注意字符编码、js中的Object 源信息过滤等问题。
2、TableView按照列定制:我是把所有可能的列对应的控件都写出来,然后根据实际数据类型,显示相应的控件。这种方法在表格列有限的情况下是可行的。实际开发的时候,会研究的问题是,行号和列号怎么拿到,鼠标点击高亮,数据怎么绑定(比如TextField的初始数据怎么设置和修改后怎么设置回ListModel中,才比较合理,而且不造成循环绑定)等等。这些问题大部分都能在TableView的帮助文档里找到,极少问题需要搜索引擎/请教老司机(我就碰到了一个,headerDelegate里面拿不到鼠标悬浮事件,公司一圈人都问了一遍,两天都搞不定,最后去问公司最老的一个Qt程序员(他在Qt公司工作过),他看了一分钟就搞定了,设置z轴,别人根本想不到啊!!!)。
3、增、删、改、查和内容校验都是对ListModel的操作了。ListModel本身提供了添加、删除、修改的操作,以及遍历每个Object的get方法,够用了。撤销、恢复是对整个表格增、删、改的操作,不是只对一个TextEdit操作的右键菜单那种。我用C++做了一个撤销、恢复的数据结构,存的数据就是QString,C++ 层面不关心数据内容,只实现撤销、恢复的逻辑。然后在qml里面去用这个数据结构,每次增删改操作的时候,记录操作,即用特定JSON格式的字符串往这个数据结构里面存,撤销、恢复的时候再从数据结构里面拿数据,去操作ListModel。
我的代码:
之后会放在github上。
----------------------------分割线-------------------------------
补上github的地址:jaredtao/TableEdit
----------------------------分割线-------------------------------
补一个关于z轴的,看代码import QtQuick 2.6import QtQuick.Controls 2.1import QtQuick.Controls 1.4 as QC14ApplicationWindow { visible: true width: 640 height: 480 title: qsTr("Hello World") QC14.TableView { width: parent.width height: parent.height QC14.TableViewColumn { role: "title" title: "Title" width: 100 } QC14.TableViewColumn { role: "author" title: "Author" width: 200 } model: ListModel { id: libraryModel ListElement { title: "A Masterpiece" author: "Gabriel" } ListElement { title: "Brilliance" author: "Jens" } } headerDelegate: Rectangle { id: headerDelegate implicitWidth: 100 height: 40 color: "#2d2d2d" border.width: 1 border.color: "#838383" Rectangle { anchors.right: parent.right width: 40 height: 40 color: "red" MouseArea { anchors.fill: parent hoverEnabled: true focus: true onHoveredChanged: { //这里的HoveredChanged信号,默认情况下是拿不到的,鼠标单击的时候才能拿到,与普通的MouseArea不一致。 console.log("containMouse", containsMouse) } } } //这几行是老司机加的代码,加上之后就能正常拿到hoveredChanged信号了// Component.onCompleted: {// parent.z = 10// } } }}
推荐阅读
- 聪明人养花,这3种“花”怎样也要养一盆,每年能省不少医药费
- 互联网怎样解决“家政服务上门速度慢”的问题
- 怎样看待从1月8号起,QQ钱包开始提现收费
- 银行it人怎样转型
- 汽车|冬天怎样让车内温度快速升高?座椅加热的最佳使用方式二,外循环的作用总结
- 怎样进入通信行业
- 怎样评价扶他柠檬茶的小说《云养汉》的结尾
- 怎样成为一名合格的Python程序员?
- |徐州市出台《关于优化创新创业生态系统 提升区域科技创新活力的实施意见》及实施细则
- 怎样评价华为、诺基亚、中兴中标中国移动高端路由交换设备扩容集采