关系经济人类预测化学自然
自然科学
知识物理
化学生物
地理解释
预测理解
本质社会
人类现象
行为研究
经济政治
心理结构
关系指导
人文遗产

QRowTable表格控件重写表头排序支持第三次单击恢复默认

4月4日 赤雷榭投稿
  一、原生表格
  开发客户端程序的方式越来越多了,现在很流行的libcef、electron等等都可以作为快速开发客户端软件的方案,但是如果需要一个好的用户体验,还是离不开原生化的开发,虽然慢,但是性能好啊。
  说到原生化开发,那对应的UI库相对较多,流行的就有Qt、soui、duilib、还有老掉牙的MFC和其他一些第三方公司开源维护的directUI库等等。网上找到一篇整理的文章,有兴趣的同学可以参考C界面库。
  目前C客户端使用最广泛的就是UI框架就是Qt,它不仅包含了GUI控件,更多的其实是一种解决方案,使用过Qt的同学都比较清楚,Qt的安装动态库有几十个之多,可是如果你只想使用Qt的GUi模块的话,就只需要包含3个动态库即可,他们分别是核心模块QtCore、Gui模块QtGui和QtWidget。
  当我们将Qt作为我们的开发SDK时,大多数时候原生的控件qss美化就可以完成我们的需求,然而总有一些特殊情况,比如产品经理脑残的时候、或者说是业务场景傻逼了,总是需要完成一些奇奇怪怪交互,那么我们就需要重写原生的控件实现方式。
  今天就来说一个案例表格控件列排序方式。
  对于某一些特殊的场景下,我们的表格展示的数据可能需要排序,这样的表格控件Qt已经给我们提供好了,只需要我们从写一些类和接口即可。前边已经写了4篇关于表格控件的功能,分别是QRowTable表格控件支持hover整行、checked整行、指定列排序等、QRowTable表格控件(二)红涨绿跌、QRowTable表格控件(三)效率优化之合理使用QStandardItem和QRowTable表格控件(四)效率优化之优化数据源,感兴趣的同学可以去看看。
  不幸的是Qt自带的表格排序功能,即是我们冲写完所有接口依然不能满足负责的业务需求表格表头连续3点三次是一个循环,什么意思呢?
  传统表格排序
  Qt自带的表格排序行为是这样的,默认情况是不排序的,我们可以通过接口开启排序,或者通过接口设置不排序,当我们启用排序规则后,假设说我们的表格点击点击一下是降序,点击第二下就是升序,再次点击是又会恢复到降序规则,这样是不是还挺完美呢!
  这个时候产品有话说了,点击第三次时,需要设置程序为不排序。
  程序员:卧槽你说什么听不到
  【领QT开发教程学习资料,点击下方链接免费领取,先码住不迷路】链接
  新的排序规则
  在传统表格排序的基础上做一下调整可以支持某些列不允许排序3次连续单击为一个循环,也就是降序升序无序这样3个状态循环
  不得不说产品的脑洞还是很大的。既然产品都说想要这个功能了,那么有时间还是得考虑下。跟产品沟通良久后,有了如下安排,虽然这个功能对用户来说不是一个特别需要的功能,但是当我们的软件功能稳定后,迭代没有那么着急的时候,是不是可以考虑研究下这个而功能呢。
  然后也就有了本篇文章
  虽然重写了Qt本身的逻辑,没想到还是可以实现的!!!二、效果展示
  按照惯例先上图,看看是不是同学们想要的功能。
  三、实现方式
  新的表格排序有2个点需要我们去思考,分别是某些列排序、排序交互修改,下面我们分开来去实现1、排序列定制
  Qt默认提供了可排序接口,但是开启后我们所有的列都支持排序了,这个时候我们就需要研究Qt的源码,看看Qt的排序是怎么触发的,然后在合理的时机去加上我们不支持排序的逻辑
  博主这里找到的做法是重写QHaderView这个类,并重写实现了鼠标按下并抬起的接口,在这个接口中判断我们业务层是不是允许排序。
  重写后的逻辑是这样的如果不允许排序,我们先调用Qt原有的接口禁用所有列排序功能调用父类的鼠标抬起函数如果不允许排序,需要调用Qt原有的接口启用所有列排序功能
  以上逻辑的步骤2是原有的逻辑,步骤1和步骤3分别是在进行业务逻辑判断后进行的逻辑调整,达到我们禁用某些列排序的功能voidQRowHeader::mouseReleaseEvent(QMouseEventevent){intcolumnlogicalIndexAt(eventpos()。x());if(mIndicator。contains(column)mIndicator〔column〕falseqAbs(eventx()mpPressPos。x())QApplication::startDragDistance()非拖拽){setSectionsClickable(false);QHeaderView::mouseReleaseEvent(event);setSectionsClickable(true);}QHeaderView::mouseReleaseEvent(event);。。。
  如上代码,mIndicator结构中存储了我们想要定制的是否允许排序的列,只需要对外暴露一个修改接口即可,代码是不是还很简单呢。voidQRowHeader::SetSortEnable(intlogicalIndex,boolenable){mIndicator〔logicalIndex〕}
  这样禁用某些列排序的功能就是实现了。
  禁用某些列排序这个功能相对来说好实现一些,毕竟重写的逻辑不是特别复杂,下面我们来看下怎么修改排序交互逻辑。2、排序交互修改
  有了前面的问题处理思路,这个功能依然如此,我们先跟Qt源码,看看已有的排序交互逻辑实现怎么实现的,然后在合理的实际去重置某些变量的值,达到重写交互逻辑。
  博主这里跟踪完Qt默认的排序实现方式后,发现重写这个功能还是有一定难度的,首先数据排序是一块,另一块是一旦启用排序后,排序箭头的绘制这块也需要去重写。
  什么意思呢?
  Qt的排序规则一旦启用,排序的箭头就会被绘制,并且绘制箭头的逻辑还简单粗暴,不是升序就是降序。
  【领QT开发教程学习资料,点击下方链接免费领取,先码住不迷路】链接
  且看如下Qt表头绘制源码
  如果显示排序箭头并且是排序列,则需要绘制排序箭头,不是降序就是升序
  我:我槽什么鬼,就不能提供一个空的枚举吗?voidQHeaderView::paintSection(QPainterpainter,constQRectrect,intlogicalIndex)const{。。。if(isSortIndicatorShown()sortIndicatorSection()logicalIndex)opt。sortIndicator(sortIndicatorOrder()Qt::AscendingOrder)?QStyleOptionHeader::SortDown:QStyleOptionHeader::SortUp;。。。}
  既然这条路子是走不通了,那么我们只能取巧,换其他方式。
  终于、皇天不负有心人被博主想到一个好办法,代码量依然还是很少。
  回到我们最开始的需求,我们其实就是想让第三次点击时,只是一个特殊的操作,然后把第四点击当做第一次单击即可。
  有了这个想法后,那么就来干吧,既然还是重写鼠标抬起函数,想尽一切办法监控连续的第三次单击,把他处理成非排序状态,然后在下一次单击时,走正常的排序逻辑。voidQRowHeader::mouseReleaseEvent(QMouseEventevent){。。。QHeaderView::mouseReleaseEvent(event);columnlogicalIndexAt(eventpos()。x());staticboolnextNoSstaticintprevColumn1;if(nextNoSortprevColumncolumnqAbs(eventx()mpPressPos。x())QApplication::startDragDistance()){emitRestoreSort();恢复默认排序}if(nextNoSort!trueprevColumncolumnsectionsClickable()sortIndicatorOrder()Qt::DescendingOrder){if(qAbs(eventx()mpPressPos。x())QApplication::startDragDistance()){nextNoSprevC}else{nextNoS}}else{if(nextNoSortqAbs(eventx()mpPressPos。x())QApplication::startDragDistance()){nextNoS}else{nextNoSprevC}}。。。}
  好了,代码以上。不过这里重点还是要说下为什么这么干!
  首先需要调用父类的mouseReleaseEvent函数,否则拖拽会有问题,而且必须调用这个函数才可以让内存数据正常。
  然后我们记录了一系列内存状态,判断是不是需要恢复排序状态,当条件满足时发出RestoreSort信号,外部程序只需要接收这个信号,然后恢复默认排序即可。
  恢复默认排序voidQRowTable::RestoreSort(){mpFilterSetCompareType(QFilterModel::CTNULL);mpFilterinvalidate();mpHHeadersetSortIndicator(1,Qt::DescendingOrder);}
搜索 投诉 评论 转载

荣耀X50Note手机被曝光,采用7。12英寸大屏,6000说真的,荣耀这个手机品牌,确实挺不错的。不光旗舰机型综合性价比不错,就连入门的中低端机型,也是很不错的。比如荣耀的X系列机型,就非常的不错的,使用过的人,都能感受到。最近……拳王泰森休息期间带娇妻庆生,开心大呼要迎接第七个宝宝到来12月3日,英国《镜报》报道了拳王泰森弗瑞在训练休息期间带着妻子帕里斯弗瑞吃生日餐的照片。本周三帕里斯就曾在Instagram上分享了她和这位世界重量级冠军拳王泰森的合照。帕里……没了胆以后,你的肠道还好吗今天就跟大家分享几点对于治疗胆汁型腹泻比较有效的办法。第一点就是饮食上要注意,不要吃太油腻的食物,因为毕竟胆囊切除以后胆汁没有办法按需分配了,当你吃很多油腻的食物后,需要……6款Java8自带工具,轻松分析定位JVM问题这篇文章中介绍下如何使用JDK自带工具来分析和定位Java程序的问题。使用JDK自带工具查看JVM情况JDK自带了很多命令行甚至是图形界面工具,帮助我们查看JVM的……原神太快乐!有万叶后一定要做这7件事万叶不仅能提升你的账号强度,还能带来很多欢乐,毕竟快乐风男不是白叫的。已经抽到万叶的玩家,强烈推荐去做这7件事,还没万叶的话先收藏,以后保准能用上。1。吸猫就是字面……LOL天注定组合重聚!TES官宣S9冠军打野Tian加盟20212022赛季冬季转会期终于落下帷幕,憋气许久的LPL各大战队开始陆续官宣选手离队和新援加盟的消息。作为LPL近年崛起的新生代强队之一,TES战队麾下拥有众多实力强劲的本……陈伟霆前任,陈星旭前任,于小彤前任,看到张新成意外了要是说到哪个领域的爱情分分合合最快,那娱乐圈定是当仁不让的。在娱乐圈中的演员都是有着很多段感情的,特别是在他们有了名气之后,他们的日常生活就会被很多人所关注,所以在网上也常常被……这个底线我们该不该守,要不要守呢?话说自2017年起,P2P行业进入了一个疯狂增长期,最高的时候全国大小网贷平台高达万家,而这些网贷平台却没有一家是合规的,甚至可以说存在就是最大的社会问题,从以往的形式来看,中……国庆川A大军都去哪儿了头条创作挑战赛这个国庆假期远出旅行out了川A出城大军也out了,成都人都去哪了?答案还得是骑行,最美的风景在路上。骑行真的很惬意舒畅快乐,要知道,在骑车这项运动上,成都……杜峰太能装了,篮球媒体人证实马尚已到达赛区,办完手续即可出战北京时间4月5日,根据知名篮球媒体人导演我躺那CBA的发文爆料,证实广东队外援马尚布鲁克斯已经在2号就到达江西南昌赛区了,并已经开始和球队进行合练,对于这个消息可谓是激起千层浪……为什么说鱼腥草是害人草?常吃鱼腥草会怎么样呢?一文告诉你鱼腥草是中国西南地区的一种草本植物,有鱼腥味,所以被称为鱼腥草,也叫老鸨。它在夏天和秋天被收集,清洗,在阳光下干燥,然后切成小块供生用,辛凉微寒,属肺肾经。具有清热解毒、……QRowTable表格控件重写表头排序支持第三次单击恢复默认一、原生表格开发客户端程序的方式越来越多了,现在很流行的libcef、electron等等都可以作为快速开发客户端软件的方案,但是如果需要一个好的用户体验,还是离不开原生……
优秀的微商朋友圈营销文案都是这么写的树立品牌价值突破销售瓶颈什么样的离婚男会很吃香打投诉后悔了作用很大可以让不良商家进行整改医院干部作风问题排查整改责任清单及整改报告非法暴力传销有哪些女性怀孕真的会变傻吗与哪些因素有关说不出来红楼梦究竟好在哪里北京景点推荐,法源寺低音号语音导游供人造句用供人造句大全瞧瞧娱乐圈里的明星们孕肚照片(二十七)48岁徐静蕾发福明显,穿T恤配黑裤太随性了,穿搭不讲究变土妞
同房时女人性高潮反应有哪些学前班教学工作计划未来几年国家队候选人预测名单,00后或助男篮未来登顶亚洲霸主期中考试的反思四年级作文文人树盆景,宣泄一种情绪,吐露一种幽愤!三年级假期计划作文四所985高校主要领导调整去宾馆可以查开房记录吗(免费查询酒店入住信息)爱在钢琴中飘荡哈士奇为什么会拆家?如何防止哈士奇拆家?意外伤害急救原则简介孕妇补充维生素D吃什么好

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找菏泽德阳山西湖州宝鸡上海茂名内江三亚信阳长春北海西安安徽黄石烟台沧州湛江肇庆鹤壁六安韶关成都钦州