QTableView 如何突出显示鼠标悬停的整行?

0xb*_*00d 0 c++ user-interface qt qtableview

选择行为设置为选择行,但仅突出显示悬停的单元格。有没有办法突出显示整行?

Ser*_*sta 8

首先,您子类化QTableWidget/QTableView并重新实现mouseMoveEventand leaveEvent

在 中custom_table_widget.cpp,您应该:

...
CustomTableWidget::CustomTableWidget(QWidget *parent) :
  QTableWidget(parent)
{
  setMouseTracking(true);  // receives mouse move events even if no buttons are pressed.
}

void CustomTableWidget::mouseMoveEvent(QMouseEvent *event)
{
  // detect where the mouse cursor is relative to our custom table widget
  QModelIndex index = indexAt(event->pos());
  emit hoverIndexChanged(index);
}

void CustomTableWidget::leaveEvent(QEvent *event)
{
  // detect when the mouse cursor leaves our custom table widget
  emit leaveTableEvent();
  viewport()->update();
}
...
Run Code Online (Sandbox Code Playgroud)

接下来,您将QStyledItemDelegate. 重新实现paint方法并添加两个槽来修改悬停的行。在 中row_hover_delegate.cpp,您应该:

...
void RowHoverDelegate::onHoverIndexChanged(const QModelIndex& item) {
  hovered_row_ = item.row();
}

void RowHoverDelegate::onLeaveTableEvent() {
  hovered_row_ = -1;
}

void RowHoverDelegate::paint(QPainter *painter,
                                  const QStyleOptionViewItem &option,
                                  const QModelIndex &index) const {
  QStyleOptionViewItem opt = option;
  if(index.row() == hovered_row_) {
    opt.state |= QStyle::State_MouseOver;
  } else {
    opt.state &= ~QStyle::State_MouseOver;
  }
  QStyledItemDelegate::paint(painter, opt, index);
}
...
Run Code Online (Sandbox Code Playgroud)

最后,连接信号/插槽并设置项目委托:

connect(my_custom_table_widget, 
        &CustomTableWidget::hoverIndexChanged,
        my_row_hover_delegate,
        &RowHoverDelegate::onHoverIndexChanged);
connect(my_custom_table_widget, 
        &CustomTableWidget::leaveTableEvent,
        my_row_hover_delegate,
        &RowHoverDelegate::onLeaveTableEvent);

my_custom_table_widget->setItemDelegate(my_row_hover_delegate);
Run Code Online (Sandbox Code Playgroud)