【问题标题】:how to paint outside of paintEvent()? Qt, C++如何在paintEvent() 之外绘制? Qt、C++
【发布时间】:2020-07-27 23:01:15
【问题描述】:

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

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

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

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

这是我在 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】:

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

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

【讨论】:

  • @jeremyFrisener 我已经有了你向我解释的 QPixmap 对象。我想我应该尝试改变绘画顺序。在绘制所有其他像素之后,我将绘制我的“选择区域”。你的回答对我帮助很大。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
相关资源
最近更新 更多