如何在paintEvent()之外进行绘制? Qt,C ++

问题描述 投票:0回答:1

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

如果用户使用鼠标单击并拖动屏幕,则应用程序应绘制“选择区域”。

但是在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。

感谢您的帮助。

c++ qt paint
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.