3

我想在里面画一条线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 初始化函数中,我像这样设置委托项目

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

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

在 table init 上,线条画得很好,错误是当我在玩桌子时。

这是一些截图

滚动前

滚动后

行选择后

有什么建议么 ?

4

1 回答 1

3

好的,感谢 Kuba Ober 提示,我成功解决了我的问题。

修复:

  1. 我错过了计算行高,导致它超出表格项边界。(所以我在 DrawLine 函数中将“-”切换为“+”)
  2. 添加了行选择突出显示处理。
  3. 在绘图之前移动了基础 QStyledItemDelegate 绘制函数。

这是完整的工作答案。

void DrawLineDelegate::paint(QPainter *poPainter, const QStyleOptionViewItem &oOption, const QModelIndex &oIndex) const
{
    QStyle *poStyle;
    bool bSelected;

    // Valid index ?
    if(!oIndex.isValid())
        // Not valid.
        return;

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

    if (oIndex.column() == COLUMN_COLOR_ID) {

        const QRect oRect( oOption.rect );
        QColor oLineColor (oIndex.data(Qt::UserRole).toString());

        QStyleOptionViewItemV4 oOptv4 = oOption;
        initStyleOption(&oOptv4, oIndex);

        const QWidget *poWidget = oOption.widget;

        // Style option
        poStyle =
                poWidget ? poWidget->style() : QApplication::style();

        // Set pen
        poPainter->setPen(QPen(oLineColor, 2, Qt::SolidLine, Qt::RoundCap));

        // Selection state
        bSelected =
                oOption.state&QStyle::State_Selected;

        // Item selected ?
        if (bSelected)
        {
            poPainter->setBrush(oOption.palette.highlightedText());
            // This call will take care to draw line while selecting
            poStyle->drawControl(QStyle::CE_ItemViewItem, &oOptv4, poPainter, poWidget);
        }

        // Draw line in the middle of the item
        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)
    }


}   
于 2015-09-17T11:35:49.590 回答