如何在鼠标悬停时高亮显示QTableWidget中的整行:Qt5

7

我希望当鼠标悬停在QTableWidget的行上时,能够突出显示该行。

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

我尝试过以下方法:

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

输出: 事件类型:13
`(13 = QEvent::Move)`

我已经进行了大量的谷歌搜索,但没有找到任何合适的解决方案。
是否有其他方法来满足我的要求(在鼠标悬停时突出显示整行)?
请帮忙。提前致谢。
编辑:
请参考下面的屏幕截图以获得更清晰的信息。
这是我的QTableWidget 我想在鼠标悬停时更改那个红色边框(已编辑)行的背景颜色。
5个回答

2
这是我的实现,它工作正常。首先,您应该子类化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&)));
  }

0

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


-2

我再添加一个答案,因为它太长了:

好的,你是对的,这是发生在 QTableView 上的。现在问题是,为什么你需要一个 QTableView?如果你只需要像你发布的那个简历一样的东西,你可以使用一个QTreeView,它支持在整行上悬停,而不是单个单元格。

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


1
也许下次可以将其分成两个评论。 - eric

-4
还没有使用过QT5,但是使用QT4可以通过样式表轻松实现这一点:
QTableView::item:hover {
    background-color: rgba(200,200,220,255);
}        

3
感谢#Leonardo Bernardini的回答,但不起作用。通过应用样式表,只有单个单元格被突出显示,而不是整个行... - AB Bolim
那么你的问题在于选择行为,使用tableView->setSelectionBehavior(QAbstractItemView::SelectRows); - Leonardo Bernardini
我想在我的QTableWidget中实现鼠标悬停时高亮行的效果。上述解决方案不适用于此... - AB Bolim
1
如果您想要进行单元格选择,但是鼠标悬停在整行上时,唯一的解决方案是覆盖自己的绘制函数。我确认,如果您更改了完整行的选择行为,则悬停也适用于整行... - Leonardo Bernardini
可能有一些混淆,在QTableWidget中鼠标悬停时,只有特定的单元格会被突出显示。但是,我想在鼠标悬停时突出整行。希望现在你明白我的问题了。。 - AB Bolim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接