Рисование прямоугольника построчно не дает того же результата, что и рисование напрямую - PullRequest
1 голос
/ 05 июля 2019

Я пытаюсь настроить границы ячеек в (custom) QTableView.Для этого я нашел это :

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

Neat.

Дела начинают развиваться, когда я хочу решить, какие границы я на самом деле рисую.Для этого у каждого элемента есть свойство BorderOption, которое описывает, какие границы следует рисовать.И моя сетка перестала быть 1px больше.

Итак, я решил попробовать следующее:

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

Что должно иметь такой же результат, верно?Правильно?Ну ... нет.

Sadness

Кажется, что нарисованы две линии шириной 1px, по одной для каждой ячейки.

Что могло бы иметь смысл, если бы прямоугольники ячеек не перекрывались.Но мы уже видели, что это , а не , так как первый пример работал и производил прямоугольники шириной 1px.

Я что-то не так делаю?

Спасибо

Ответы [ 2 ]

2 голосов
/ 05 июля 2019

Я думаю, что есть неправильное представление о значении 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();
        }
    }
};
0 голосов
/ 05 июля 2019

Вы пытались установить толщину пера вручную?

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 например!

...