我正在尝试在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。
感谢您的帮助。
简短的答案是,您不能-Qt不能那样工作。如果您不在paintEvent()之外,并且想要重新绘制小部件,则需要调用update()。这将导致paintEvent()尽快被调用,然后您在paintEvent()中的代码可以进行实际绘制。
就是说,如果您绝对必须在其他地方进行绘画,则可以创建一个宽度和高度与小部件相同的QPixmap对象,并将指向该QPixmap的指针传递给QPainter对象的构造函数,然后将其绘制到QPixmap。然后,完成后,调用update(),这将导致paintEvent()尽快被调用,在paintEvent()调用中,您可以使用该QPixmap作为参数调用drawPixmap(),以将像素从QPixmap复制到小部件的屏幕缓冲区。请注意,这比直接在paintEvent()内进行原始绘画要低效,因为这种方法需要将像素复制额外的时间(可能还需要更频繁地绘制像素)]