Russian Qt Forum

Qt => Model-View (MV) => Тема начата: igor_bogomolov от Март 07, 2019, 11:31



Название: [Решено] Подсветка строки в QTableWidget при наведении
Отправлено: igor_bogomolov от Март 07, 2019, 11:31
Как сделать так, что бы при наведении указателя мышки в QTableWidget подсвечивалась вся строка (как в QTreeWidget)?
Через таблицу стилей не получается, подсвечивается одна ячейка, а не вся строка.

Нашел вот такое решение через делегат https://forum.qt.io/topic/69446/qtablewidget-hover-entire-row-without-hard-coding-background-color/2.
Но оно не совсем устраивает. Выделение не должно сохранятся при выходе за пределы таблицы или при наведении на его заголовок. В общем нужно для таблицы поведение, такое же как для QTreeWidget есть по умолчанию. Кто делал, подскажите как добиться.


Название: Re: Подсветка строки в QTableWidget при наведении
Отправлено: kai666_73 от Март 07, 2019, 11:47
Я бы сильно не запаривался, а использовал бы QTreeView и подсунул бы ему (ей) табличную модель.


Название: Re: Подсветка строки в QTableWidget при наведении
Отправлено: igor_bogomolov от Март 07, 2019, 11:55
kai666_73, для этого придётся менять уже написанный код наполнения таблицы. Не сложно, но хотелось бы этого избежать.
В идеале хотелось бы обойтись делегатом и таблицей стилей. Ну в крайнем случае, своим наследником qtablewidget.


Название: Re: Подсветка строки в QTableWidget при наведении
Отправлено: igor_bogomolov от Март 10, 2019, 23:14
В результате остановился на таком решении:
Код
C++ (Qt)
class RowHoverDelegate : public QStyledItemDelegate
{
   Q_OBJECT
 
public:
   RowHoverDelegate(QTableView *tableView);
   void paint(QPainter *painter, const QStyleOptionViewItem &option,
              const QModelIndex &index) const override;
 
protected:
   bool eventFilter(QObject *obj, QEvent *event) override;
 
private:
   QTableView *m_tableView;
   int m_hoveredRow;
};

Код
C++ (Qt)
RowHoverDelegate::RowHoverDelegate(QTableView *tableWidget)
   : QStyledItemDelegate(tableWidget)
   , m_tableView(tableWidget)
   , m_hoveredRow(-1)
{
   m_tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
   m_tableView->setMouseTracking(true);
   m_tableView->installEventFilter(this);
   m_tableView->viewport()->installEventFilter(this);
}
 
void RowHoverDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                            const QModelIndex &index) const
{
   QStyleOptionViewItem opt = option;
   if(index.row() == m_hoveredRow) {
     opt.state |= QStyle::State_MouseOver;
   } else {
     opt.state &= ~QStyle::State_MouseOver;
   }
   QStyledItemDelegate::paint(painter, opt, index);
}
 
bool RowHoverDelegate::eventFilter(QObject *obj, QEvent *event)
{
   if (event->type() == QEvent::MouseMove) {
       QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
       m_hoveredRow = m_tableView->rowAt(mouseEvent->pos().y());
   } else if (event->type() == QEvent::Leave) {
       m_hoveredRow = -1;
   }
 
   return QObject::eventFilter(obj, event);
}