如何在 paintEvent() 之外绘画? Qt, C++

how to paint outside of paintEvent()? Qt, C++

我正在尝试在 paintEvent() 之外绘制矩形。

如果用户用鼠标单击并拖动屏幕,应用程序应绘制 'Selecting Area'。

但似乎不可能在 paintEvent() 之外进行绘画。

我已经使用 ReleaseDC() 在 MFC 上解决了这个问题。

这是我在 MFC 上的代码:

void DrawingPaper::DrawSelectingArea() {
    CDC *dc = this->GetDC();
    CPen pen;
    CPen *oldPen;

    dc->SetROP2(R2_NOTXORPEN);

    pen.CreatePen(PS_DOT, 1, RGB(166, 166, 166));

    oldPen = dc->SelectObject(&pen);

    dc->Rectangle(this->startX, this->startY, this->currentX, this->currentY);

    dc->SelectObject(oldPen);
    this->ReleaseDC(dc);

    DeleteObject(pen);
}

尽管代码不在 OnPaint() 中,但效果很好。

但是在 Qt 上,如何呢?

这是我在 Qt 上的代码:

void DrawingPaper::DrawSelectingArea() {
    QPainter painter(this);

    QRect drawRect(this->startX, this->startY, this->currentX, this->currentY);
    painter.drawRect(drawRect);

    //this->ReleaseDC(dc);
}

它不起作用,因为绘制矩形的画家将被 paintEvent() 中的其他 QPainter 删除。

有没有类似ReleaseDC()的解​​决方案?

我使用的是 Qt 5.12.6。

感谢您的帮助。

简短的回答是,你不能——Qt 不是那样工作的。如果你在 paintEvent() 之外并且你想重新绘制你的小部件,你需要做的是调用 update() 代替。这将导致 paintEvent() 尽快被调用,然后您在 paintEvent() 中的代码可以进行实际的绘画。

就是说,如果您绝对必须在其他地方进行绘画,您可以创建一个与您的小部件具有相同宽度和高度的 QPixmap 对象,并将指向该 QPixmap 的指针传递给您的 QPainter 对象的构造函数,并且绘制到 QPixmap 中。然后当你完成后,调用 update(),这将导致 paintEvent() 被尽快调用,并且在 paintEvent() 调用中你可以调用 drawPixmap() 以该 QPixmap 作为参数,将像素从 QPixmap 复制到小部件的屏幕缓冲区。请注意,这比直接在 paintEvent() 中进行原始绘制效率低,但是,因为这种方法需要额外复制像素(并且可能还导致图像绘制的次数超过必要的次数)