Как выделить весь ряд при наведении курсора мыши в QTableWidget: Qt5

Я хочу выделить строку при наведении мыши в моем QTableWidget,

При наведении курсора мыши выделяется только одна ячейка.

Я попробовал этот подход:

bool MyTabWidget::eventFilter(QObject *target, QEvent *event)
{
if( target == ui->MyTableWidget )
{
//Just to print the event type
qDebug() <<"EventType : "<<event->type();
}
}

Выход : EventType : 13,

`(13 = QEvent::Move)`

Я потерял Google. но не получить правильного решения.

Есть ли другой подход для выполнения моего требования (выделить весь ряд при наведении курсора мыши)?

Пожалуйста помоги. Заранее спасибо.

РЕДАКТИРОВАТЬ:

Пожалуйста, смотрите ниже снимок экрана для более ясного.

введите описание изображения здесь

Это мое QTableWidget
Я хочу изменить цвет фона этой красной (отредактированной) строки при наведении курсора мыши.

5

Решение

Вот моя реализация, она работает хорошо. Сначала вы должны создать подкласс QTableView / QTabWidget, передать сигнал в QStyledItemDelegate в функции mouseMoveEvent / dragMoveEvent. Этот сигнал отправит индекс зависания.

В QStyledItemDelegate используйте переменную-член hover_row_ (измененную в привязке слота к указанному сигналу), чтобы сообщить функции рисования, какая строка должна быть перемещена.

Вот пример кода:

//1: Tableview :
void TableView::mouseMoveEvent(QMouseEvent *event)
{
QModelIndex index = indexAt(event->pos());
emit hoverIndexChanged(index);
...
}
//2.connect signal and slot
connect(this,SIGNAL(hoverIndexChanged(const QModelIndex&)),delegate_,SLOT(onHoverIndexChanged(const QModelIndex&)));

//3.onHoverIndexChanged
void TableViewDelegate::onHoverIndexChanged(const QModelIndex& index)
{
hoverrow_ = index.row();
}

//4.in Delegate paint():
void TableViewDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
...
if(index.row() == hoverrow_)
{
//HERE IS HOVER COLOR
painter->fillRect(option.rect, kHoverItemBackgroundcColor);
}
else
{
painter->fillRect(option.rect, kItemBackgroundColor);
}
...
}
1

Другие решения

Я добавляю другой ответ, потому что он слишком длинный:

Хорошо, вы правы, это происходит в QTableView. Теперь вопрос в том, зачем вам нужен QTableView? Если вам просто нужно резюме, подобное тому, которое вы опубликовали там, вы можете использовать QTreeView, который вместо QTableView поддерживает наведение на всю строку вместо одной ячейки. Если вам абсолютно необходим QTableView, вам нужно отключить ваш текущий эффект наведения и переопределить метод рисования и перемещения мышью. В вашем методе mousemove рассчитайте строку под мышью, используя QTableView :: rowAt (y) (также не забудьте сопоставить координаты мыши с относительными координатами виджета), и сохраните индекс, если он отличается от предыдущего, аннулируйте всю таблицу , На событии рисования просто нарисуйте прямоугольник вокруг строки вручную после вызова события рисования базового класса …

-2

До сих пор не играл с QT5, но с QT4 это очень просто, используя таблицу стилей:

QTableView::item:hover {
background-color: rgba(200,200,220,255);
}
-3
По вопросам рекламы [email protected]