【发布时间】:2022-05-06 23:07:42
【问题描述】:
选择行为设置为选择行,但仅突出显示悬停的单元格。有没有办法突出显示整行?
【问题讨论】:
标签: c++ qt user-interface qtableview
选择行为设置为选择行,但仅突出显示悬停的单元格。有没有办法突出显示整行?
【问题讨论】:
标签: c++ qt user-interface qtableview
首先,将QTableWidget/QTableView 子类化并重新实现mouseMoveEvent 和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();
}
...
接下来,你继承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);
}
...
最后,连接信号/插槽并设置项目委托:
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);
【讨论】:
有两种方法..
1) 您可以使用委托来绘制行背景...
您需要将行设置为在委托中突出显示,并基于此, 做高亮显示。2) 捕捉当前行的信号。迭代该行中的项目 和 为每个项目设置背景。
希望对你们有用。
【讨论】:
一个老问题,但由于我设法仅使用委托解决了它,因此我的解决方案适用于遇到相同问题的任何人。这是在 PyQt5 中,但应该很容易转换为 c++。
class HoverDelegate(QStyledItemDelegate):
def __init__(self, parent=None):
super().__init__(parent)
# Define the hover colour
self.hoverBackground = QBrush(QColor('#F5F5F5'))
# Initiate variables to invalid model indices
self.currentHovered = QModelIndex()
self.previousHovered = QModelIndex()
def initStyleOption(self, option, modelIndex):
super().initStyleOption(option, modelIndex)
# Cache model indices
if option.state & QStyle.State_MouseOver:
if modelIndex.row() != self.currentHovered.row():
self.previousHovered = self.currentHovered
self.currentHovered = modelIndex
# Set background brush if we're on a hover row
if modelIndex.row() == self.currentHovered.row():
option.backgroundBrush = self.hoverBackground
def paint(self, painter, option, modelIndex):
# Standard paint event takes care of painting the hover background
# if defined in initStyleOption
super().paint(painter, option, modelIndex)
# Remove the hover background from the previously hovered row
# by requesting update of all cells of the previously hovered row
if self.previousHovered.isValid():
view = self.parent()
col = 0
index = self.previousHovered.siblingAtColumn(col)
while index.isValid():
view.update(index)
col += 1
index = index.siblingAtColumn(col)
# Reset to an invalid index
self.previousHovered = QModelIndex()
【讨论】: