我将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);
}
...
}
...但我无法弄明白,如何将整行拖出来。有人可以帮我提供示例代码吗?
答案 0 :(得分:1)
有两种方式..
1)您可以使用委托来绘制行背景...
您需要在委托中设置要突出显示的行,并根据该行, 突出显示。2)抓住当前行的信号。迭代该行中的项目 和 为每个项目设置背景。
你也可以尝试样式表:
QTableView::item:hover {
background-color: #D3F1FC;
}
希望,这对你们有用。
答案 1 :(得分:0)
这是我的实现,它运行良好。首先你应该继承QTableView / QTabWidget,在mouseMoveEvent / dragMoveEvent函数中向QStyledItemDelegate发出一个信号。这个信号将发送悬停索引。
在QStyledItemDelegate中,使用成员变量hover_row_(在插槽绑定中更改为上面的信号)告诉paint函数哪个行被悬停。
这是代码examaple:
//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);
}
...
}