QStyledItemDelegate 在单元格(不是行)悬停时绘制事件
QStyledItemDelegate paint event on cell (not row) hover
我有一个自定义 QStyledItemDelegate,它在特定列中绘制 QPixmap。当鼠标悬停在该单元格上时,我想以不同的方式绘制它。
下面是我的绘制事件,它在未 State_MouseOver 时正确绘制单元格。但是,当我将鼠标悬停在该行的任意位置时,它会改变颜色。我怎样才能让它只在鼠标悬停在有像素图的单元格上时改变?
void myDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
Q_ASSERT(index.isValid());
switch(index.column()) {
case DAY_COLUMN:
{
QSize btnSize = QSize(option.rect.height() * .9, option.rect.height() * .9);
QRect r = option.rect;
int x = r.right() - btnSize.width() - 10;
int y = r.top();
QRect btnRect = QRect(x, y, btnSize.width(), btnSize.height());
QPixmap pixmap(":/icons/edit.png");
// If hovered over, change color.
if(option.state & QStyle::State_MouseOver) {
auto mask = pixmap.createMaskFromColor(QColor("Black"), Qt::MaskOutColor);
pixmap.fill(QColor("Red"));
pixmap.setMask(mask);
}
painter->drawPixmap(btnRect, pixmap, pixmap.rect());
return;
}
/*.... draw other column(s) as appropriate ...*/
}
}
我在带有 QTreeView 的所有行上使用这个委托。
Qt 5.12
可能是因为QTreeView的选择行为默认是QAbstractItemView::SelectRows
。
您可以使用以下方式更改它:
m_tree_view.setSelectionBehavior(QAbstractItemView::SelectItems);
查看更多:
QAbstractItemView::SelectionBehavior
QTreeView source code
我有一个自定义 QStyledItemDelegate,它在特定列中绘制 QPixmap。当鼠标悬停在该单元格上时,我想以不同的方式绘制它。
下面是我的绘制事件,它在未 State_MouseOver 时正确绘制单元格。但是,当我将鼠标悬停在该行的任意位置时,它会改变颜色。我怎样才能让它只在鼠标悬停在有像素图的单元格上时改变?
void myDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
Q_ASSERT(index.isValid());
switch(index.column()) {
case DAY_COLUMN:
{
QSize btnSize = QSize(option.rect.height() * .9, option.rect.height() * .9);
QRect r = option.rect;
int x = r.right() - btnSize.width() - 10;
int y = r.top();
QRect btnRect = QRect(x, y, btnSize.width(), btnSize.height());
QPixmap pixmap(":/icons/edit.png");
// If hovered over, change color.
if(option.state & QStyle::State_MouseOver) {
auto mask = pixmap.createMaskFromColor(QColor("Black"), Qt::MaskOutColor);
pixmap.fill(QColor("Red"));
pixmap.setMask(mask);
}
painter->drawPixmap(btnRect, pixmap, pixmap.rect());
return;
}
/*.... draw other column(s) as appropriate ...*/
}
}
我在带有 QTreeView 的所有行上使用这个委托。
Qt 5.12
可能是因为QTreeView的选择行为默认是QAbstractItemView::SelectRows
。
您可以使用以下方式更改它:
m_tree_view.setSelectionBehavior(QAbstractItemView::SelectItems);
查看更多:
QAbstractItemView::SelectionBehavior
QTreeView source code