QTableView/QTableWidget 实现hover一行效果

在网上看到一些实现这个效果都是通过鼠标事件判断悬浮在哪一行实现的,这里提供另一种思路。
在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

QTableView/QTableWidget 实现hover一行效果在网上看到一些实现这个效果都是通过鼠标事件判断悬浮在哪一行实现的,这里提供另一种思路。在Qt的模型/视图/代理框架里面,关于item的绘制是交给代理实现的,默认的QStyledItemDelegate的paint会去调用virtual void initStyleOption(QStyleOptionViewItem *option, const QModelIndex &amp;index) const;这个虚函数,初始化一些 之前有讲解过QTableWidget的使用(QTableWidget详解(样式、右键菜单、表头塌陷、多选等)),已经算是很详细了,这节再讲更常用的视图部件QTableView的高级用法。 Qt中有几种纯粹的视图部件:QListView、QTableView、QColumnVi...
之前有讲解过QTableWidget的使用(QTableWidget详解(样式、右键菜单、表头塌陷、多选等)),已经算是很详细了,这节再讲更常用的视图部件QTableView的高级用法。     Qt中有几种纯粹的视图部件:QListView、QTableView、QColumnView、QTreeView,所有的这些视图都必须提供一个模型(无论是自定义,还是Qt中已提供的)来与之配合。Qt仍然
connect(ui->tableWidget,SIGNAL(entered(QModelIndex)),this,SLOT(slot_tooltip(QModelIndex))); void Ship_Detection::slot_tooltip(QModelIndex index) QToolTip::showText(QCursor::pos(),i...
原文链接:http://www.cnblogs.com/qnkk123/p/6840944.html 最近项目需要添加系统托盘,本来Qt的QSystemTrayIcon可以实现的,但是要求要添加hover效果,并显示未读消息(就和qq的托盘差不多,移动上去显示未读列表),加了这个要求QSystemTrayIcon就没法实现了,最后使用的是NOTIFYICONDATA实现的,记录下。 1.创建...
QTableViewQTableWidget都是Qt框架中用于显示表格数据的控件。 QTableView是一个基于模型/视图架构的控件,它需要一个数据模型来提供数据,可以使用QStandardItemModel、QSqlTableModel等模型类。QTableView可以自定义表头、单元格样式、选择模式等,支持排序、过滤、编辑等功能。 QTableWidget是一个基于QWidget的控件,它自带一个数据模型,可以直接使用setItem()方法设置单元格数据。QTableWidget可以自定义表头、单元格样式、选择模式等,支持排序、过滤、编辑等功能。 总的来说,QTableView更加灵活,适用于需要自定义数据模型和视图的场景;而QTableWidget更加简单易用,适用于快速实现简单的表格显示需求。
保留样式表,改成下面这样: if(index.row() == m_hoverrow){ painter->fillRect(option.rect, kHoverItemBackgroundcColor); QItemDelegate::paint(painter,option,index); QTableView/QTableWidget 实现hover一行效果 m0_58677004: 表格较多的时候绘制会有bug QTableView/QTableWidget 实现hover一行效果 youyicc: 感谢大佬,真的比网上其他人说的用代理里面的paint效果好多了,太厉害了 QTableView/QTableWidget 实现hover一行效果 S--WORKS: 这篇确实是中肯的回答,翻了两天csdn里让人眼前一亮的一片 Qt Installer FrameWork MessageBox按钮翻译中文 荧惑辉炎: 在么兄弟,求助呀,界面里的文本是乱码怎么办呀,配这个翻译,只管按钮呀?