在网上看到一些实现这个效果都是通过鼠标事件判断悬浮在哪一行实现的,这里提供另一种思路。
在Qt的模型/视图/代理框架里面,关于item的绘制是交给代理实现的,默认的QStyledItemDelegate的paint会去调用
virtual void initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const;
这个虚函数,初始化一些绘制的背景/字体等参数,所以我们可以重写这个虚函数,在里面判断是否悬浮在该行,如果是,则改变option参数里背景/前景色为设置的颜色,以达到hover的效果
void DrawRowTableDelegate::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const
{
QStyledItemDelegate::initStyleOption(option, index);
if(!m_drawHoverRowEnabled){
return ;
}
if(isHoveredRow(*option, index)){
option->backgroundBrush = m_hoveredRowBackground;
option->palette.setBrush(QPalette::Text, m_hoveredRowForeground);
option->palette.setBrush(QPalette::Active, QPalette::Highlight, m_hoveredRowBackground);
option->palette.setBrush(QPalette::Active, QPalette::HighlightedText, m_hoveredRowForeground);
}
}
bool DrawRowTableDelegate::isHoveredRow(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
bool ret = false;
int gridWidth = 0;
if(const QTableView* tableView = qobject_cast<const QTableView*>(option.widget)){
gridWidth = tableView->showGrid() ? 1 : 0;
}
for(int i = 0; i < index.model()->columnCount(); ++i){
QModelIndex idx = index.model()->index(index.row(), i);
if(const QAbstractItemView* view = qobject_cast<const QAbstractItemView*>(option.widget)){
QStyleOptionViewItem o;
o.initFrom(view);
o.rect = view->visualRect(idx).adjusted(0, 0, gridWidth, gridWidth);
if(o.rect.contains(view->viewport()->mapFromGlobal(QCursor::pos()))){
ret = true;
}
}
}
return ret;
}
效果如下
工程链接:HoverRowTableWidget
文章浏览阅读207次。插画投稿网站是提供给插画师们展示和分享自己作品的平台。这些网站通常允许插画师上传自己的作品,并与其他用户进行交流和互动。插画师可以在这些网站上展示自己的作品集,参与各种比赛和活动,与其他插画师进行合作,甚至有机会与潜在客户建立联系。是一个面向设计师和创意人才的社区平台,也是插画师展示作品的理想场所。在Dribbble上,插画师可以上传自己的作品,参与各种设计挑战和竞赛,与全球设计师社区互动,展示自己的创意和技能。_vue 插画
文章浏览阅读8k次,点赞8次,收藏57次。0 前言电商平台所有模块中,订单系统作为比较核心的模块,它决定了整个流程能不能顺畅的执行,起着承上启下的作用(下单、支付、履约、售后、清结算、营销活动)。订单系统的设计主要需要考虑订单字段、业务流程、状态机三大个方面,这些内容决定了订单系统稳定性与扩展性。2 订单流程订单流程指整个订单从产生到完成的整个流转过程,它包括正向流程和逆向的流程。3 订单状态机状态机表示了一笔订单的生命周期,按照一定的方向通过触发不同的事件产生数据流转的过程。状态机v2.0随着业务快速._订单状态机
文章浏览阅读491次,点赞5次,收藏11次。工欲善其事,必先利其器”,为了方便Linux驱动设备的开发和调试,建立舒适的开发环境、使用必要的软件工具,以及掌握常用的调试技巧是比较重要的。本篇介绍GDB调试器的主要功能和常见用法,同时在第三部分中,命令顺序按照使用频率由高到低编写,方便阅读和使用。
文章浏览阅读53次。nyoj-0613-免费馅饼 G. 免费馅饼都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼。说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内。馅饼如果掉在了地上当然就不能吃了,所以gameb...
文章浏览阅读183次。php将浮点数转为整数的方法:可以利用php内置函数intval()来实现。intval()函数用于获取变量的整数值,成功时返回interger值,失败时返回0。intval()函数不能用于object。php中的内置函数intval()用于获取变量的整数值。成功时返回var的integer值,失败时返回0。空的array返回0,非空的array返回1。(推荐教程:php视频教程)intval()..._php 浮点型改成整形
文章浏览阅读418次。使用while循环写九九乘法表。使用for循环写九九乘法表。_99乘法表循环编辑
文章浏览阅读357次,点赞8次,收藏8次。作为一个学习者,什么样的学习方式、学习路径能够帮助我们更高效、便捷的入门人工智能,不至于错过奔驰而过的“AI”号列车?人工智能时代持续发展,成为新一轮产业变革的核心驱动力和引领未来发展的战略技术,不仅受到政策的支持,国内人工智能市场规模也在不断攀升,相应地对各行各业的人员也产生了巨大的影响,人工智能相关专业掀起了热潮,并且非计算机专业也被迫卷入“转型升级”的道路中。作为一项具有一定门槛的学科,如何避免陷入低效率的学习困境和低质量的培训陷阱?
文章浏览阅读61次。PlugNT CMS v4.6.3 最新功能:弃用标签 selected="commend,stick" 改为andwhere="commend=1 and stick=1"{tmp:baseif test="[tmp:field name="title"]" operate="equals" value="PlugNT"} {tmp:pagelist co..._true and stick
文章浏览阅读458次。ISO 9126质量模型:软件质量模型的6大特性和27个子特性ISO9126软件质量模型是评价软件质量的国际标准,由6个特性和27个子特性组成,建议大家深入理解各特性、子特性的含义和区别,在测试工作需要从这6个特性和27个子特性去测试、评价一个软件。这个模型是软件质量标准的核心,对于大部分的软件,都可以考虑从这几个方面着手进行测评。一、功能性:1、适合性:提供了相应的功..._考试中质量属性 iso与mccall
文章浏览阅读1.9k次。在两台计算机之间(客户机与服务器),能进行文件的传递,客户端连接到服务器之后,要能完成三件事客户端要能查看服务器下的某个文件,删除文件,新建文件 客户端下载文件到本地 上传文件到服务器这些事不是客户端完成的,而是客户端给服务器发送命令,服务器收到命令后自己进行相应的操作..._linux文件传输开源项目
文章浏览阅读1.6k次。问题Not all return nodes are being displayed due to Initial Node Display setting. Only 300 of 300 nodes are being displayed解决办法在设置里修改一下Graph Visualization就可以啦_not all return nodes are being displayed due to initial node display setting
文章浏览阅读507次。在这篇文章中,我们学习了如何使用 SQL DISTINCT 子句,它从 SELECT 语句的结果集中删除重复项,只留下唯一值。正如我们所见,它可以处理一个或多个列以及 NULL 值。但是,如果你需要在一个或多个列上应用聚合函数,就应该改用 GROUP BY 子句。_navicat16怎么设置字段值不能重复