我想突出显示鼠标悬停在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
我想在鼠标悬停时更改红色边框(已编辑)行的背景颜色。
答案 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);
}