QTableWidgetItem

时间:2015-09-16 09:53:10

标签: qt qtablewidget qpainter qstyleditemdelegate

我想在QTableWidgetItem内画一条线。 为了画线,我重新实现了QStyledItemDelegate::paint方法。

但是,当我滚动或选择QTableWidget中的某个项目时。 有些物品失去了绘画效果。

这是我的油漆实施:

void DrawLineDelegate::paint(QPainter *poPainter, const QStyleOptionViewItem &oOption, const QModelIndex &oIndex) const
{
    // Valid index ?
    if(!oIndex.isValid())
        // Not valid.
        return;

    const QRect oRect( oOption.rect );

    // Painter has certain settings
    poPainter->save();

    // Draw line
    QColor oLineColor (oIndex.data(Qt::UserRole).toString());

    poPainter->setRenderHint(QPainter::Antialiasing);
    poPainter->setPen(QPen(oLineColor, 2, Qt::SolidLine, Qt::RoundCap));
    poPainter->drawLine(oRect.left(),                       // Start X-coordinate
                        oRect.top() - oRect.height() / 2 ,  // Center Height (Y-coordinate)
                        oRect.left() + oRect.width(),       // Line width
                        oRect.top() - oRect.height() / 2);  // Center Height (Y-coordinate)

    poPainter->restore();

    QStyledItemDelegate::paint( poPainter, oOption, oIndex );
}

在TableWidget init函数中,我设置了像这样的委托项

ui->tableWidget->setItemDelegateForColumn(2, new DrawLineDelegate(this) );

注意:每个项目我将颜色名称存储为Qt::UserData

在表格初始化时,线条正常,错误就在我正在玩桌子的时候。

以下是一些截图

Before scrolling

After scrolling

After row selection

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

好的,由于Kuba Ober的提示,我成功地解决了我的问题。

修正:

  1. 我错过了计算行高,导致它走出表项边界。 (所以我在DrawLine函数中将' - '切换为'+')
  2. 添加了行选择突出显示处理。
  3. 在绘图之前移动了基本QStyledItemDelegate绘制函数。
  4. 这是完整的工作答案。

    PropertyPlaceholderConfigurer