Сглаживание Qt устанавливает разную ширину пера - PullRequest
0 голосов
/ 04 января 2019

У меня есть приложение qt с большим QGraphicsView, где я рисую сетку.

Эта сетка реагирует на щелчки мыши. В принципе, если вы нажмете на какое-нибудь поле -> поле станет красным. И если вы дважды щелкните по нему -> он вернется к своему первоначальному состоянию (его белый цвет).

Это реализация моего QGraphicsView:

#include "mapview.h"

// Constructors

mapview::mapview()
{
    setUpGui();
}

mapview::mapview(QWidget *parent) : QGraphicsView(parent)
{
    setUpGui();
}

// GUI setup

void mapview::setUpGui()
{
    scene = new QGraphicsScene(this);

    this->setScene(scene);
    this->setRenderHint(QPainter::Antialiasing);
//    this->setRenderHint(QPainter::HighQualityAntialiasing);
}

// Events

void mapview::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        lastPoint = event->pos();
        scribbling = true;
    }
}

void mapview::mouseMoveEvent(QMouseEvent *event)
{
    if ((event->buttons() & Qt::LeftButton) && scribbling)
    {
        drawWall(event->pos());
    }
}

void mapview::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton && scribbling)
    {
        drawWall(event->pos());
        scribbling = false;
    }
}

void mapview::mouseDoubleClickEvent(QMouseEvent *event)
{
    removeWall(event->pos());
}

// Drawing methods

void mapview::drawGrid(const int box_count)
{
    scene->clear();

    auto x = 0.0;
    auto y = 0.0;

    this->margin = 20.0;

    _width = this->width() - 2 * margin;
    _height = this->height() - 2 * margin;

    if (fabs(_width - _height) >= std::numeric_limits<double>::epsilon())
    {
//        qDebug() << "width (" << width <<  ") != height (" << height << ")";
        return;
    }

    this->box_count = box_count;
    this->box_size = _width / box_count;



    // Horizontal
    for (auto i = 0; i <= box_count; i++)
    {
        QGraphicsLineItem *line = new QGraphicsLineItem(x, y, x + _width, y);
        QPen pen;
        pen.setColor(Qt::black);
        line->setPen(pen);
//        scene->addLine(x, y, x + _width, y);
        scene->addItem(line);
        y += box_size;
    }

    y = 0.0;

    // Vertical
    for (auto i = 0; i <= box_count; i++)
    {
        scene->addLine(x, y, x, y + _height);
        x += box_size;
    }
}

void mapview::drawWall(const QPointF &endPoint)
{
    auto x = endPoint.x() - margin;
    auto y = endPoint.y() - margin;

    x = static_cast<int>(x / box_size) * box_size;
    y = static_cast<int>(y / box_size) * box_size;

    QGraphicsRectItem* rect = new QGraphicsRectItem(x, y, this->box_size, this->box_size);
    rect->setBrush(QBrush(Qt::red));
    rect->setPen(QPen());
    scene->addItem(rect);
}

void mapview::removeWall(const QPointF &point)
{
    auto x = point.x() - margin;
    auto y = point.y() - margin;

    x = static_cast<int>(x / box_size) * box_size;
    y = static_cast<int>(y / box_size) * box_size;

    QGraphicsRectItem* rect = new QGraphicsRectItem(x, y, this->box_size, this->box_size);
    rect->setBrush(QBrush(Qt::white));
    rect->setPen(QPen());
    scene->addItem(rect);
}

Как вы можете видеть сверху, я настроил сглаживание. Проблема в том, что когда я его настраиваю, это как-то меняет вид моего рисунка:

Это вид нетронутой сетки:

enter image description here

Теперь для поля 1x1 (проиндексировано с 0) я щелкнул по нему (сделал его красным), а затем дважды щелкнул по нему (чтобы он вернулся в исходное состояние). Проблема в том, что, как вы видите, граница этой рамки немного толще:

enter image description here

Забавно, что на этом взгляде он только толще. Если я увеличу масштаб, нет никакой разницы между его границей и границами других полей. Другое дело, что если я установлю Qt::HighQualityAntialiasing -> граница будет такой же, но тогда масштабирование станет запаздывающим, я думаю, что ему придется делать более тяжелые вычисления или что-то вроде этого.

Так что мой вопрос здесь будет таким: есть ли способ заставить сглаживание не изменять толщину границы? (Я имею в виду, я знаю, что это на самом деле не меняет этого, но вы определенно можете увидеть разницу здесь)

...