QWidget :: paintEvent() — объекты, нарисованные с помощью QPainter, обрезаются

#c #qt #qt5 #drawing

#c #qt #qt5 #рисование

Вопрос:

У меня есть простое приложение Qt Widgets. Я вызываю update (rect) в mouseMoveEvent(). Я вызываю drawArc() и drawRect() в paintEvent(). Функция drawArc() рисует окружность немного меньше, чем rect, а drawRect() рисует событие->rect(). Они рисуются в положениях мыши с помощью mouseMoveEvent(). Поэтому я хочу иметь приложение, в котором круг и квадрат следуют за курсором. У меня есть такое приложение, но есть проблема. Круг и квадрат, кажется, нарисованы в правильном положении, но они каким-то образом обрезаны. Я даже увеличил прямоугольник обновления на 100 пикселей, но обрезка все еще там. Вы можете увидеть это на прикрепленном изображении. Код приведен ниже, а также на GitHub. Я использую Qt 5.15.1.

  void ScribbleArea::mouseMoveEvent(QMouseEvent *event)
{
        mousePos = event->pos();
        int enlargement = 100;
        int size = 129 enlargement;
        QRect r = QRect(mousePos.x()-size/2,mousePos.y()-size/2,size,size);
        update(r);
}

void ScribbleArea::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    
    int size = 129;
    QRect arcRect = QRect(mousePos.x()-size/2,mousePos.y()-size/2,size,size);
    
    painter.drawArc(arcRect,0,16*360);
    painter.drawRect(event->rect().adjusted(10,10,-10,-10));
}
 

Весь код находится на GitHub: https://github.com/AlessandroFilipepi/QtDrawingExampleIssue (Не волнуйтесь, она короткая).

Обрезанная кисть

Спасибо за помощь.

Комментарии:

1. Что делать, если вы обновите весь виджет целиком, то есть вызовете update() функцию без параметров?

2. Я попробовал это сделать. Это работает, но это неэффективно для моего реального приложения. Обновление всего виджета занимает слишком много времени.

3. Я думаю, проблема в том, что вы обновляете скорее текущую область, а не «предыдущую». Следовательно, вы получили эти остатки. Вы также можете попытаться расширить область обновления, если обновление всего виджета происходит медленно.

4. Я отредактировал свой вопрос и предоставил лучшее изображение. Остатки вызваны простотой кода. Это работает в моем реальном приложении. Я хочу знать, почему части нижнего и правого краев моей «кисти» обрезаны. На изображении он отмечен красным цветом.

5. Я могу подтвердить проблему с помощью MSYS Qt 5.15.2: imgur.com/a/J7ZnxiM