Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在paintEvent()外部绘制?Qt,C++;_C++_Qt_Paint - Fatal编程技术网

C++ 如何在paintEvent()外部绘制?Qt,C++;

C++ 如何在paintEvent()外部绘制?Qt,C++;,c++,qt,paint,C++,Qt,Paint,我正在尝试在paintEvent()外部绘制矩形 如果用户用鼠标点击并拖动屏幕,应用程序应绘制“选择区域” 但似乎不可能在paintEvent()之外进行绘画 我已经用ReleaseDC()在MFC上解决了这个问题 以下是我在MFC上的代码: void DrawingPaper::DrawSelectingArea() { CDC *dc = this->GetDC(); CPen pen; CPen *oldPen; dc->SetROP2(R2_

我正在尝试在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()这样的解决方案

我在Qt5.12.6上


谢谢你的帮助。

简单的回答是,你不能-Qt不是那样工作的。如果您不在paintEvent()范围内,并且希望重新绘制小部件,则需要调用update()。这将导致尽快调用paintEvent(),然后paintEvent()中的代码可以进行实际的绘制


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

简单的回答是,您不能-Qt不能以这种方式工作。如果您不在paintEvent()范围内,并且希望重新绘制小部件,则需要调用update()。这将导致尽快调用paintEvent(),然后paintEvent()中的代码可以进行实际的绘制


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

@jeremyFrisener我已经有了您向我解释的QPixmap对象。我想我应该试着改变绘画顺序。在绘制完所有其他像素后,我将绘制我的“选择区域”。你的回答对我帮助很大。谢谢。@jeremyFrisener我已经有了你解释给我的QPixmap对象。我想我应该试着改变绘画顺序。在绘制完所有其他像素后,我将绘制我的“选择区域”。你的回答对我帮助很大。谢谢,就用?就用?