逐行绘制矩形与直接绘制矩形没有相同的结果

时间:2019-07-05 08:14:46

标签: qt qtableview

我正在尝试自定义(自定义)QTableView中单元格的边框。为此,我发现了this

class MyDelegate : public QItemDelegate {
  public:
    MyDelegate( QObject *parent ) : QItemDelegate( parent ) { }
    void paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const {
      QItemDelegate::paint( painter, option, index );
      if( /* some condition */ ) {
         painter->setPen( Qt::red );
         painter->drawRect( option.rect );
      }
    }
}

这很好。我在委托人中添加了它-该委托人已经具有用于其他用途的自定义paint方法,并且完全满足我的要求:

Neat

整洁。

当我想确定我实际绘制的边框时,事情开始变得无赖。为此,每个项目都有一个BorderOption属性,该属性描述应绘制的边框。而且我的网格不再大1px。

所以我决定尝试以下操作:

painter->drawLine(option.rect.topLeft(), option.rect.topRight());
painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight());

哪个应该有相同的结果,对吗?对?好吧...

Sadness

似乎正在绘制两条1px宽度的线,每个单元格一条。

如果单元格的矩形不重叠,则可能有意义。但是我们已经看到情况不是 ,因为第一个示例可以工作并生成宽度为1px的矩形。

我做错什么了吗?

谢谢

2 个答案:

答案 0 :(得分:2)

我认为对option.rect的含义存在误解。它实际上是表格中项目的矩形。仍有一部分(一个像素宽的线)不属于项目的option.rect,而是属于QTreeView本身。

如果通过设置setClipRect将图形限制为允许的项目部分,则该图形将更加明显,并使用不同的颜色区分线条。

尝试使用绘制的线宽以及启用和禁用剪辑矩形来进行实验。也许您需要在允许的option.rec之外进行绘制,但是要注意,您还必须考虑在不同平台上QTreeView的不同图形,其中分隔线可能是0px宽或比一个像素宽

#pragma once

#include <QStyledItemDelegate>
#include <QItemSelectionModel>
#include <QPainter>
#include <QDebug>

class MyDelegate : public QStyledItemDelegate {
public:

    MyDelegate(QObject* parent=nullptr) : QStyledItemDelegate(parent) { }
    void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const {

        QStyledItemDelegate::paint(painter, option, index);
        if (true) {
            painter->save();
            auto color=QColor::fromHsv((30*index.row() + 30 * index.column()) % 255, 255, 127);
            painter->setPen(QPen(color, 1, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
            painter->setClipRect(option.rect); // Rectangle of the item

            painter->drawLine(option.rect.topLeft(), option.rect.topRight());
            painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight());
            painter->restore();
        }
    }
};

答案 1 :(得分:0)

您是否尝试过手动设置笔的厚度

painter->setPen(QPen(QColor(255, 0, 0), 3, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
painter->drawLine(option.rect.topLeft(), option.rect.topRight());
painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight());

在这里,我将厚度设置为 3px