Russian Qt Forum
Ноябрь 22, 2024, 06:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] Подсветка строки в QTableWidget при наведении  (Прочитано 10237 раз)
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 есть по умолчанию. Кто делал, подскажите как добиться.
« Последнее редактирование: Март 10, 2019, 23:14 от igor_bogomolov » Записан
kai666_73
Крякер
****
Offline Offline

Сообщений: 319


Просмотр профиля
« Ответ #1 : Март 07, 2019, 11:47 »

Я бы сильно не запаривался, а использовал бы QTreeView и подсунул бы ему (ей) табличную модель.
Записан
igor_bogomolov
Гость
« Ответ #2 : Март 07, 2019, 11:55 »

kai666_73, для этого придётся менять уже написанный код наполнения таблицы. Не сложно, но хотелось бы этого избежать.
В идеале хотелось бы обойтись делегатом и таблицей стилей. Ну в крайнем случае, своим наследником qtablewidget.
Записан
igor_bogomolov
Гость
« Ответ #3 : Март 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);
}
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.2 секунд. Запросов: 22.