как рисовать за пределами paintEvent ()? Qt, C ++ - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь нарисовать прямоугольник вне paintEvent ().

Если пользователи щелкают и перетаскивают экран мышью, приложение должно нарисовать «Выбор области».

Но это кажется невозможным рисование вне paintEvent ().

Я уже решил эту проблему на MF C с ReleaseD C ().

Вот мой код на MF C:

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);
}

это не работает, потому что рисователь, рисующий прямоугольник, будет удален другим QPainter в paintEvent ().

Есть ли какое-либо решение, например ReleaseD C ()?

Я нахожусь на Qt 5.12.6.

Спасибо за помощь.

1 Ответ

2 голосов
/ 15 апреля 2020

Короткий ответ: вы не можете - Qt не работает таким образом. Если вы находитесь за пределами paintEvent () и хотите перекрасить свой виджет, вам нужно вместо этого вызвать update (). Это приведет к тому, что paintEvent () будет вызываться как можно скорее, и тогда ваш код внутри paintEvent () сможет выполнить фактическое рисование.

При этом, если вам абсолютно необходимо рисовать в другом месте, вы можете создать объект QPixmap, который имеет ту же ширину и высоту, что и ваш виджет, и передайте указатель на эту QPixmap в конструктор вашего объекта QPainter и зарисуйте в QPixmap. Затем, когда вы закончите, вызовите update (), что вызовет paintEvent () как можно скорее, и в вызове paintEvent () вы можете вызвать drawPixmap () с этим QPixmap в качестве аргумента, чтобы скопировать пиксели из QPixmap в экранный буфер виджета. Обратите внимание, что это менее эффективно, чем просто рисование оригинала непосредственно внутри paintEvent (), хотя, поскольку этот подход требует копирования пикселей дополнительное время (и, возможно, также вызывает рисование изображения чаще, чем необходимо)

...