Как избежать очистки ранее нарисованных точек в Qt? - PullRequest
2 голосов
/ 28 февраля 2012

Я хочу нарисовать изображение попиксельно во время выполнения. Я использую QPainter и paintEvent для рисования. Но когда paintEvent вызывается каждый раз, ранее нарисованное изображение очищается, а новая точка рисуется.

Как избежать очистки ранее нарисованных частей? Я просто хочу добавить новую точку пикселя к ранее нарисованным точкам.

Lines::Lines(QWidget *parent)
    : QWidget(parent)
{
    m_timer = new QTimer(this);
    connect(m_timer, SIGNAL(timeout()), this, SLOT(updateStatus()));
    m_timer->start();
    m_x = 0;
    m_y = 0;
}

void Lines::paintEvent(QPaintEvent *event)
{
    QPen pen(Qt::black, 2, Qt::SolidLine);
    QPainter painter(this);
    painter.setPen(pen);
    painter.drawPoint(m_x, m_y);    
}

void Lines::updateStatus()
{
    m_x++;
    m_y++;
    update();
}

Ответы [ 2 ]

7 голосов
/ 28 февраля 2012

paintEvent должен полностью перерисовать область виджета, указанную в событии. Таким образом, вы отвечаете за буферизацию предыдущих результатов.

Не имеет смысла изменять желаемый вывод в paintEvent, так как он может вызываться случайным образом и когда он вызывается, находится вне вашего контроля.

Если вы хотите избежать этого, вы можете использовать QGraphicsView .

Буферизация может быть выполнена с использованием QPixmap, который будет частью класса Lines. Вы рисуете пиксель в растровом изображении (не в событии рисования в updateStatus) и рисуете растровое изображение в событии рисования.

1 голос
/ 28 февраля 2012

QWidget::setAttribute( WA_OpaquePaintEvent, true );

предотвращает очистку виджета.Однако это только для оптимизации, если виджет все равно полностью перерисовывается.

Вы должны следовать совету доктора Хирша.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...