Qt Drawing Lines - PullRequest
       24

Qt Drawing Lines

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

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

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

void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);

        painter.setRenderHint(QPainter::Antialiasing, true);
        painter.setPen(QPen(Qt::black, 2));

        painter.drawLine(QPointF(qrand() % 300, qrand() % 300), QPointF(qrand() % 300,qrand() % 300));
}



void MainWindow::on_b_toggleDrawing_triggered()
{
    this->update();
}

Ответы [ 4 ]

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

Вы можете нарисовать линии на внеэкранной поверхности и blit их на виджет в событии рисования. QImage будет идеальным, так как это QPaintDevice и может быть нарисовано с использованием QPainter :: drawImage . Во фрагменте ниже предполагается, что this->image является указателем на QImage такого же размера, что и MainWindow.

void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);

    painter.drawImage(this->rect, *this->image);
}

void MainWindow::on_b_toggleDrawing_triggered()
{
    QPainter painter(this->image);

    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setPen(QPen(Qt::black, 2));
    painter.drawLine(QPointF(qrand() % 300, qrand() % 300),
                     QPointF(qrand() % 300,qrand() % 300));

    this->update();
}

Альтернативой может быть построение пути с использованием QPainterPath . В этом случае вы просто должны поддерживать экземпляр QPainterPath, добавлять линии по мере необходимости, а затем рисовать путь в обработчике события рисования. Я не так хорошо знаком с живописными путями. Поэтому я не уверен, как производительность сравнивается с предыдущим подходом.

0 голосов
/ 29 августа 2012

Каждый раз, когда вы хотите создать следующую строку, вы можете создать объект QGraphicsLineItem (ссылка) и добавить его в виджет QGraphicsScene (ссылка) .

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

0 голосов
/ 23 августа 2012

Или вставьте команду

 this->setAttribute( Qt::WA_NoSystemBackground, bool ) ;

перед вызовом

 this->update() ;

bool = true - оставляет область рисования нетронутой и позволяет добавлять новые элементы в область рисования.

bool = false - стирает область рисования перед рисованием элементов.

0 голосов
/ 28 февраля 2011

Установить autoFillBackground в ложь.Он стирает (заполняя фоновым цветом) перед вызовом paintEvent, если установлен.

...