Я пытаюсь нарисовать прямоугольник вне 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);
}

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

Есть ли какое-нибудь решение вроде ReleaseDC ()?

Я использую Qt 5.12.6.

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

0
chan 15 Апр 2020 в 06:34

1 ответ

Лучший ответ

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

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

2
Jeremy Friesner 15 Апр 2020 в 04:13