QWidget отрисовывает клипы на mouseMoveEvent - PullRequest
0 голосов
/ 04 июня 2018

Я создаю инструмент выделения типа выделения в QWidget, и все работает нормально, за исключением ошибки рендеринга при перетаскивании области.Если я вызываю update без каких-либо аргументов, все работает прекрасно, но если я вызываю update, чтобы включить только область выделения, когда пользователь перетаскивает, то два края обрезаются, если мышь движется с умеренной скоростью.

Вот изображение того, как оно выглядит при перетаскивании в нижний правый угол:

Снимок экрана при перетаскивании в виджете

Я думалзамена update () на repaint () может исправить это, но это тоже не сработало.

Как правильно мне это делать?Я включил очень простой код, который демонстрирует проблему.

#include <QPainter>
#include <QPaintEvent>
#include <QWidget>

class Widget : public QWidget
{

public:

Widget(QWidget *parent = nullptr)
    : QWidget(parent)
{
}

void mousePressEvent(QMouseEvent *e) override
{
    startPt = e->pos();
    rect = QRect();
    update(); // clear the entire widget
}

void mouseMoveEvent(QMouseEvent *e) override
{
    rect = QRect(startPt, e->pos()).normalized();
    update(rect.adjusted(-2,-2,2,2)); // adjusted to include stroke
}

void paintEvent(QPaintEvent *event) override
{
    QPainter p(this);

    p.setBrush(Qt::NoBrush);
    p.setPen(QPen(Qt::black, 2));
    p.drawRect(rect);
}

private:
    QRect rect;
    QPoint startPt;
};
...