如何在QTableWidget中突出显示鼠标悬停的整行:Qt5

时间:2014-04-16 13:34:37

标签: c++ hover mouseevent qt5 qtablewidget

我想突出显示鼠标悬停在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)`

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

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

请帮忙。提前谢谢。

修改

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

enter image description here

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

5 个答案:

答案 0 :(得分:1)

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

在QStyledItemDelegate中,使用成员变量hover_row_(在插槽绑定中更改为上面的信号)告诉paint函数哪个行被悬停。

这是代码examaple:

//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);
    }
...
}

答案 1 :(得分:1)

我有类似的任务,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&)));
  }

答案 2 :(得分:0)

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

答案 3 :(得分:-2)

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

好的,对,这是在QTableView上发生的。现在问题是,为什么需要QTableView?如果你只需要一个你在那里发布的简历,你可以使用QTreeView,而不是QTableView,支持在整个行上而不是单个单元格。如果你绝对需要一个QTableView,你需要禁用您当前的悬停效果并覆盖paint和mousemove方法。在你的mousemove方法上使用QTableView :: rowAt(y)计算鼠标下的行(还记得将鼠标坐标映射到Widget相对坐标),并存储一个索引,如果它从前一个变化,则使整个表无效。在paint事件上,只需在调用基类绘制事件后手动在行周围绘制一个矩形...

答案 4 :(得分:-3)

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

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