我在QWidget中创建了一个选取框选择类型工具,除了拖动选框时的渲染错误外,一切正常。如果我在没有任何参数的情况下调用update,一切都运行得很漂亮,但是如果我将update更改为仅在用户拖动时包含选取框的区域,那么如果鼠标以适中的速度移动,则会切断两条边。
这是在向右下角拖动时的样子图像:
在小部件中单击并拖动时的屏幕截图
我认为用repaint()替换update()可能会修复它,但是它也没有用。
我应该这样做的正确方法是什么?我已经包含了一些非常基本的代码来证明这个问题。
#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;
};