【问题标题】:QTableView How can I highlight the entire row for mouse hover?QTableView 如何突出显示整行以进行鼠标悬停?
【发布时间】:2022-05-06 23:07:42
【问题描述】:

选择行为设置为选择行,但仅突出显示悬停的单元格。有没有办法突出显示整行?

【问题讨论】:

    标签: c++ qt user-interface qtableview


    【解决方案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);
    

    【讨论】:

    • 感谢您的代码,但实际上并没有必要。
    【解决方案2】:

    有两种方法..

    1) 您可以使用委托来绘制行背景...
    您需要将行设置为在委托中突出显示,并基于此, 做高亮显示。

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

    希望对你们有用。

    【讨论】:

    • 。请您对第一种方法进行更多解释
    • 不是很有帮助。为什么不举个例子?
    【解决方案3】:

    一个老问题,但由于我设法仅使用委托解决了它,因此我的解决方案适用于遇到相同问题的任何人。这是在 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-31
      • 2016-02-29
      • 2012-08-13
      • 1970-01-01
      • 2020-10-16
      相关资源
      最近更新 更多