2013-12-13 87 views

回答

1

有2种方式..

1)您可以使用委托绘制行背景...
您将需要设置该行的委托,以突出和此基础上, 突出显示。

2)抓住当前行的信号。迭代该行中的项目 和 为每个项目设置背景。

希望它会对你们有用。

+0

.Could请您给一些关于第一种方法 – IMAN4K

1

首先,您的子类QTableWidget/QTableView和重新实现mouseMoveEventleaveEvent

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); 
+0

谢谢你的代码解释,但并不是真的有必要。 – 0xbaadf00d

相关问题