范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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

  一、原生表格
  开发客户端程序的方式越来越多了,现在很流行的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分别是在进行业务逻辑判断后进行的逻辑调整,达到我们禁用某些列排序的功能 void QRowHeader::mouseReleaseEvent(QMouseEvent * event) { 	int column = logicalIndexAt(event->pos().x()); 	if (m_Indicator.contains(column)  		&& m_Indicator[column] == false 		&& qAbs(event->x() - m_pPressPos.x()) < QApplication::startDragDistance()/*非拖拽*/) 	{ 		setSectionsClickable(false); 		QHeaderView::mouseReleaseEvent(event); 		setSectionsClickable(true); 	} 	 	QHeaderView::mouseReleaseEvent(event); 	...
  如上代码,m_Indicator结构中存储了我们想要定制的是否允许排序的列,只需要对外暴露一个修改接口即可,代码是不是还很简单呢。 void QRowHeader::SetSortEnable(int logicalIndex, bool enable) { 	m_Indicator[logicalIndex] = enable; }
  这样禁用某些列排序的功能就是实现了。
  禁用某些列排序这个功能相对来说好实现一些,毕竟重写的逻辑不是特别复杂,下面我们来看下怎么修改排序交互逻辑。 2、排序交互修改
  有了前面的问题处理思路,这个功能依然如此,我们先跟Qt源码,看看已有的排序交互逻辑实现怎么实现的,然后在合理的实际去重置某些变量的值,达到重写交互逻辑。
  博主这里跟踪完Qt默认的排序实现方式后,发现重写这个功能还是有一定难度的,首先数据排序是一块,另一块是一旦启用排序后,排序箭头的绘制这块也需要去重写。
  什么意思呢?
  Qt的排序规则一旦启用,排序的箭头就会被绘制,并且绘制箭头的逻辑还简单粗暴,不是升序就是降序。
  【领QT开发教程 学习资料,点击下方链接免费领取↓↓ ,先码住不迷路~】「链接」
  且看如下Qt表头绘制源码
  如果显示排序箭头并且是排序列,则需要绘制排序箭头,不是降序就是升序
  我:我槽…什么鬼,就不能提供一个空的枚举吗? void QHeaderView::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const {     ...     if (isSortIndicatorShown() && sortIndicatorSection() == logicalIndex)         opt.sortIndicator = (sortIndicatorOrder() == Qt::AscendingOrder)                             ? QStyleOptionHeader::SortDown : QStyleOptionHeader::SortUp;     ... }
  既然这条路子是走不通了,那么我们只能取巧,换其他方式。
  终于、皇天不负有心人被博主想到一个好办法,代码量依然还是很少。
  回到我们最开始的需求,我们其实就是想让第三次点击时,只是一个特殊的操作,然后把第四点击当做第一次单击即可。
  有了这个想法后,那么就来干吧,既然还是重写鼠标抬起函数,想尽一切办法监控连续的第三次单击,把他处理成非排序状态,然后在下一次单击时,走正常的排序逻辑。 void QRowHeader::mouseReleaseEvent(QMouseEvent * event) {     ...     QHeaderView::mouseReleaseEvent(event);  	column = logicalIndexAt(event->pos().x()); 	static bool nextNoSort = false; 	static int prevColumn = -1; 	if (nextNoSort && prevColumn == column 		&& qAbs(event->x() - m_pPressPos.x()) < QApplication::startDragDistance()) 	{ 		emit RestoreSort();//恢复默认排序 	}  	if (nextNoSort != true 		&& prevColumn == column 		&& sectionsClickable() 		&& sortIndicatorOrder() == Qt::DescendingOrder) 	{ 		if (qAbs(event->x() - m_pPressPos.x()) < QApplication::startDragDistance()) 		{ 			nextNoSort = true; 			prevColumn = column; 		} 		else 		{ 			nextNoSort = false; 		} 	} 	else 	{ 		if (nextNoSort && qAbs(event->x() - m_pPressPos.x()) >= QApplication::startDragDistance()) 		{ 			nextNoSort = true; 		} 		else 		{ 			nextNoSort = false; 			prevColumn = column; 		} 	} 	... }
  好了,代码以上。不过这里重点还是要说下为什么这么干!
  首先需要调用父类的mouseReleaseEvent函数,否则拖拽会有问题,而且必须调用这个函数才可以让内存数据正常。
  然后我们记录了一系列内存状态,判断是不是需要恢复排序状态,当条件满足时发出RestoreSort信号,外部程序只需要接收这个信号,然后恢复默认排序即可。
  恢复默认排序 void QRowTable::RestoreSort() { 	m_pFilter->SetCompareType(QFilterModel::CT_NULL); 	m_pFilter->invalidate(); 	m_pHHeader->setSortIndicator(-1, Qt::DescendingOrder); }

设计有趣的轻巧真无线,体积小续航长,南卡小音舱上手大家平时都会听听音乐玩玩游戏,这时候就需要用到蓝牙耳机,特别是在户外接打电话时,戴上一副耳机都会方便很多。最近发现了一款南卡小音舱Lite2,这些天用过之后感觉它质量不错,做得十分户外冬游,照样有趣有新意天气越冷,遛娃越难,再加上风波不断的疫情,很多宝爸宝妈都不知道能带娃去哪好。总不能除了楼下小广场,就是客厅一日游吧!毕竟,最好的时光都在户外,即使现在不能前往,也可以有个小期待小希12月10日送你颗星早上舒心出门顺心回家开心祝你永远开心每一天早上好!真情相伴渡人生,难忘每天祝福声,清晨问候如美酒,献给知音与亲友。但愿天天好心情,健康快乐到永久。人生,快乐就好亲情,想着就好朋友,不忘就好一起,健康最好。一声早安,比啥都好花花世界之第一个海洋霸主葡萄牙,带你看看有趣的葡萄牙C罗的故乡葡萄牙是一个拥有丰富历史和充满活力的国家,本文整理17个关于葡萄牙的有趣事实1。葡萄牙是世界上第一个海上强国,也是世界上第一批探险家的出生地葡萄牙在15和16世纪处于欧洲南岭三日文摄李元胜一hr中午,烈日,我背着包,眯着眼,一个人站在三岔路口。从韶关市辗转来到这里,离南岭国家森林公园已经很近了。长途车的司机说,这个时间没有班车,但是摩的多,可以载你进去。确七星级迪拜帆船酒店同款!我住到了!写下这个标题时,我忽然在想,2023年我是不是就能真的住上迪拜帆船了?哈哈哈即便面对的有未知,但我们在正确的道路上前进,这不正像扬帆起航的帆船?!好贴合今天的主题七星级迪拜帆船酒店MAUIBlazor(Windows)App动态设置窗口标题接着上一篇如何为面向Windows的MAUIBlazor应用程序设置窗口标题?Tips总所周知,MAUI除了WindowsApp其他平台窗口是没有Title这回事的。在Blazor如何拍出好看的照片?意大利网红博主分享3个动态拍照技巧不会拍照的姐妹们可以看看意大利米兰的时尚博主PaolaCossentino。和一般博主只是长得好看或者纯粹秀服装不一样的是,PaolaCossentino分享的穿搭照,有很多动态的12月13日漂亮早上好问候动态图片最新版周二最美早安祝福图片大全1我不知道流星能飞多久,值不值得寻求!我不晓得樱花能开多久,值不值得等待!但我知道你我的友谊能像烟花般俏丽且像恒星般永恒,值得我用毕生去保护。天冷了,注意保重身体!2聆听冬的步履,活动预告洗尘迎新趣泡温泉,本周末五十六个民族欢聚温汤小镇!明月山冰雪温泉季隆重登场啦12月17日18日将有哪些精彩活动即将上线呢?温汤传统民俗温泉取水仪式五十六个民族系列活动富硒温泉系列活动超多特色美食大量精美展品多重趣味活动泡温泉过暖冬花了半天时间整理,TCL电视选购攻略,含详细参数对比!十年家电老司机,买家电不迷路!欢迎大家点赞关注!作为存量市场,彩电行业的竞争异常激烈。2022年更是价格战升级,各大品牌杀的最惨的一年!从整体市场来看,彩电行业自2016年开始已经
购买茅台1935,贪图便宜吃大亏人红是非多,酒红假酒多。2023年3月15日,茅台酱香酒打假知识产权保护部在一个内部会议上透露,近期他们分别在拼XXX宝X东等网络电商平台上以不高于1100元瓶的价格,累计购买了1育儿假,军人家庭真的很需要!剑客北海三剑客三剑客题图大唐文图来源于网络剑客君后台经常收到各类的问题和求助,关于军人家庭方面,育儿假真的被问的很多。还记得曾有人跟剑客君说如果军人哺乳期育儿假不能出台好消息,实在央企估值修复新逻辑ESG推动财务绩效稳健提升国企特别是央企是社会发展的中坚力量,ESG作为可持续发展理念,近年愈加受到国内机构投资者重视。当央企进行ESG实践走向深入,会带来那些积极影响。周二,华宝证券在报告中分析了ESG实完美日记母公司上市以来首次单季盈利,护肤品总营收逼近彩妆近日,逸仙电商发布2022年第四季度及全年财务业绩报告,公告显示,公司第四季度实现营收10。1亿元,同比下降34。2净亏损为5500万元,与去年同期相比收窄了88。4。NonGAAGPT4全网首个测评来了!逻辑性创造性,你想知道的我们都测了3月15日凌晨1点,OpenAI宣布推出GPT4,在功能和一致性方面取得了前所未有的成果。(官网链接httpsopenai。comproductgpt4)公众号后台回复GPT4可获逼孩子学习有用吗?先弄清学习的底层逻辑!这是一本适合家长和教师看的书,能让人们了解孩子喜欢与不喜欢上学的真实原因和底层逻辑。书中每一章都提出一个概念,分析对学习的影响,解释相关原因,并总结对课堂的启示,是一本对教室上课和17岁黄花闺女嫁入54岁空军上将,为他先后怀孕16次,后来怎样?不论什么年代,17岁,是一位女子最美好的年龄,也是每个少女都会对爱情充满向往,在她们的想象中,自己的意中人一定是个顶天立地的男子汉。而且有时候爱情之间的年龄差真的很重要吗?在民国时刚刚!两会后第二只部级大老虎接受审查,曾担任首都组织部部长大快人心,一大早就听到反腐的好消息,今天的主角可大有来头,如假包换的大老虎。3月17日,据权威媒体报道,宁夏回族自治区党委原副书记,银川市委原书记姜志刚接受调查。看照片,长得文质彬神兵奇迹手游攻略神兵奇迹手游弓箭手怎么加点弓箭手到底该如何加点?弓箭手到底如何去玩,如何去加点?本次就由小编来给大家仔细的分析一波,对于新手玩家来说一篇好的攻略,还是能起到不错的效果的,下面就一起来看看怎么玩吧!还有就是最因地制宜建设富美乡村虽是工作日,广东省东莞市茶山镇南社明清古村落一天接待了五六个旅游团。今年春节,村里的醒狮游园非遗美食节游船唱粤剧等传统文化活动每天都吸引上万名游客接下来的清明踏青游园活动,预计又将大西北环线之仁康古屋2017年10月24日下午到达四川省甘孜州的世界高城理塘,这里有七世达赖格桑嘉措的旧居仁康古屋。说藏族中流传着这么一种说法,如果经过理塘去西藏朝圣,没有到仁康古屋朝拜的,就等于没有