У меня есть приложение 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);
}
Как вы можете видеть сверху, я настроил сглаживание. Проблема в том, что когда я его настраиваю, это как-то меняет вид моего рисунка:
Это вид нетронутой сетки:
Теперь для поля 1x1
(проиндексировано с 0
) я щелкнул по нему (сделал его красным), а затем дважды щелкнул по нему (чтобы он вернулся в исходное состояние). Проблема в том, что, как вы видите, граница этой рамки немного толще:
Забавно, что на этом взгляде он только толще. Если я увеличу масштаб, нет никакой разницы между его границей и границами других полей. Другое дело, что если я установлю Qt::HighQualityAntialiasing
-> граница будет такой же, но тогда масштабирование станет запаздывающим, я думаю, что ему придется делать более тяжелые вычисления или что-то вроде этого.
Так что мой вопрос здесь будет таким: есть ли способ заставить сглаживание не изменять толщину границы? (Я имею в виду, я знаю, что это на самом деле не меняет этого, но вы определенно можете увидеть разницу здесь)