【问题标题】:How to highlight the entire row on mouse hover in QTableWidget: Qt5如何在 QTableWidget 中突出显示鼠标悬停时的整行:Qt5
【发布时间】:2014-05-31 10:08:10
【问题描述】:

我想在我的QTableWidget 中突出显示鼠标悬停时的行。

当我将鼠标悬停时,只有一个单元格突出显示。

我已经尝试过这种方法:

bool MyTabWidget::eventFilter(QObject *target, QEvent *event)
{
    if( target == ui->MyTableWidget )
    {
        //Just to print the event type
        qDebug() <<"EventType : "<<event->type();
    }
}

输出:EventType : 13.

`(13 = QEvent::Move)`

我已经完成了谷歌搜索。但没有得到任何适当的解决方案。

有没有其他方法可以满足我的要求(在鼠标悬停时突出显示整行)?

请帮忙。提前致谢。

编辑:

请参阅下面的屏幕截图以获得更清晰的信息。

这是我的QTableWidget 我想在鼠标悬停时更改该红色边框(已编辑)行的背景颜色。

【问题讨论】:

    标签: c++ hover mouseevent qt5 qtablewidget


    【解决方案1】:

    这是我的实现,效果很好。首先你应该继承 QTableView/QTabWidget ,在 mouseMoveEvent/dragMoveEvent 函数中向 QStyledItemDelegate 发出一个信号。这个信号将发送悬停索引。

    在 QStyledItemDelegate 中,使用成员变量 hover_row_(在插槽中更改为绑定到上述信号)来告诉绘制函数哪一行被悬停。

    代码示例如下:

    //1: Tableview :
    void TableView::mouseMoveEvent(QMouseEvent *event)
    {
        QModelIndex index = indexAt(event->pos());
        emit hoverIndexChanged(index);
        ...
    }
    //2.connect signal and slot
        connect(this,SIGNAL(hoverIndexChanged(const QModelIndex&)),delegate_,SLOT(onHoverIndexChanged(const QModelIndex&)));
    
    //3.onHoverIndexChanged
    void TableViewDelegate::onHoverIndexChanged(const QModelIndex& index)
    {
        hoverrow_ = index.row();
    }
    
    //4.in Delegate paint():
    void TableViewDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
    ...
        if(index.row() == hoverrow_)
        {
            //HERE IS HOVER COLOR
            painter->fillRect(option.rect, kHoverItemBackgroundcColor);
        }
        else
        {
            painter->fillRect(option.rect, kItemBackgroundColor);
        }
    ...
    }
    

    【讨论】:

      【解决方案2】:

      我有类似的任务和baixiangcpp的回答帮助了我,但它只在按下鼠标按钮时有效,而不是在简单的悬停时。我在 qt 论坛上的用户 mrjj 的帮助下解决了这个问题,他建议我应该将 TableView(在我的情况下为 CustomView)中的“mouseTracking”属性设置为“true”。

      CustomView::CustomView(QWidget *parent) : QTableView(parent)
      {
          this->setMouseTracking(true);
          connect(this,SIGNAL(hoverIndexChanged(const QModelIndex&)),parent,SLOT(onHoverIndexChanged(const QModelIndex&)));
        }
      

      【讨论】:

        【解决方案3】:

        这不是解决问题的正确方法,但如果您想继续使用 QTableWidget,您可以只显示垂直标题并单击它们上方以突出显示其特定行。

        【讨论】:

          【解决方案4】:

          我正在添加另一个答案,因为它太长了:

          好的,你是对的,这发生在QTableView。现在的问题是,为什么需要QTableView?如果您只需要像您在此处发布的简历,您可以使用 QTreeView,而不是 QTableView,支持将鼠标悬停在整行而不是单个单元格上。

          如果您绝对需要QTableView,则需要禁用当前悬停效果并覆盖paintmouseMoveEvent 方法。在您的mouseMoveEvent 方法上,使用QTableView::rowAt(y) 计算鼠标下的行(还要记住将鼠标坐标映射到Widget 相对坐标),并存储一个索引,如果它与前一个索引不同,则使整个表无效。在绘制事件上,只需在调用基类绘制事件后手动在行周围绘制一个矩形。

          【讨论】:

          • 也许下次把它分成两个 cmets
          【解决方案5】:

          还没有玩过 QT5,但是在 QT4 中,使用样式表非常容易:

          QTableView::item:hover {
              background-color: rgba(200,200,220,255);
          }        
          

          【讨论】:

          • 感谢#Leonardo Bernardini 的回答,但它不起作用。通过应用样式表,仅突出显示单个单元格而不是整行...
          • 那么你的问题在于选择行为,使用 tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
          • 我想在我的QTableWidget 中突出显示鼠标悬停时的行。以上解决方案不适用于...
          • 如果您想要单单元格选择,但将鼠标悬停在整行上,您唯一的解决方案是覆盖您自己的绘制功能。我确认,如果您更改整行的选择行为,悬停也适用于整行...
          • 可能存在一些混淆,鼠标悬停在QTableWidget 内时,该特定单元格会突出显示。但是,我想在鼠标悬停时突出显示整行。希望现在你有我的问题..
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-29
          • 1970-01-01
          相关资源
          最近更新 更多