QTableView: как навести курсор мыши на целый ряд?

Я вложил в подкласс QTableView, QAbstractTableModel и QItemDelegate. Я могу навести курсор мыши на одну ячейку:

void SchedulerDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    ...

    if(option.showDecorationSelected &&(option.state & QStyle::State_Selected))
{
    QColor color(255,255,130,100);
    QColor colorEnd(255,255,50,150);
    QLinearGradient gradient(option.rect.topLeft(),option.rect.bottomRight());
    gradient.setColorAt(0,color);
    gradient.setColorAt(1,colorEnd);
    QBrush brush(gradient);
    painter->fillRect(option.rect,brush);
}

    ...
}

... но я не могу понять, как парить целый ряд. Может ли кто-нибудь помочь мне с примерами кодов?

2 ответа

Есть 2 способа..

1) Вы можете использовать делегатов, чтобы нарисовать фон строки...
Вам нужно будет настроить выделение строки в делегате и на основании этого сделать выделение.

2) Ловить сигнал текущего ряда. Перебирайте элементы в этой строке и устанавливайте фон для каждого элемента.

Вы также можете попробовать таблицу стилей:

QTableView::item:hover {
    background-color: #D3F1FC;
}        

Надеюсь, это будет полезно для вас, ребята.

Вот моя реализация, она работает хорошо. Сначала вы должны создать подкласс 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);
    }
...
}
Другие вопросы по тегам