3

我继承了 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);
}

    ...
}

...但我不知道如何悬停整行。有人可以帮我提供示例代码吗?

4

2 回答 2

1

有2种方法..

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

2) 捕捉当前行的信号。遍历该行中的项目并为每个项目设置背景。

你也可以尝试样式表:

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

希望对大家有用。

于 2014-04-16T13:52:58.263 回答
0

这是我的实现,效果很好。首先你应该继承 QTableView/QTabWidget ,在 mouseMoveEvent/dragMoveEvent 函数中向 QStyledItemDelegate 发出一个信号。这个信号将发送悬停索引。

在 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);
    }
...
}
于 2017-09-16T07:09:13.950 回答