我正在尝试自定义(自定义)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
方法,并且完全满足我的要求:
整洁。
当我想确定我实际绘制的边框时,事情开始变得无赖。为此,每个项目都有一个BorderOption
属性,该属性描述应绘制的边框。而且我的网格不再大1px。
所以我决定尝试以下操作:
painter->drawLine(option.rect.topLeft(), option.rect.topRight());
painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight());
哪个应该有相同的结果,对吗?对?好吧...
似乎正在绘制两条1px宽度的线,每个单元格一条。
如果单元格的矩形不重叠,则可能有意义。但是我们已经看到情况不是 ,因为第一个示例可以工作并生成宽度为1px的矩形。
我做错什么了吗?
谢谢
答案 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 !