在mouseMoveEvent

时间:2018-06-04 00:16:04

标签: c++ qt qwidget

我在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;
};

0 个答案:

没有答案