Оптимизированное рисование на QPixmap - PullRequest
0 голосов
/ 04 декабря 2011

У меня небольшой вопрос о том, как реализовать какой-то графический редактор.Для рисования я использую этот метод: сначала я проверяю, нажата ли левая кнопка мыши, затем я рисую один пиксель в event-> pos () на моем QPixmap, и после этого я вызываю update ();перерисовать это.Я также рисую линии на QPixmap между двумя точками, если мышь перемещается с нажатой кнопкой (потому что без нее будет только несколько точек).Это работает довольно хорошо, но я хочу знать, есть ли более оптимизированный метод для этого.Вот некоторый код (я пропустил части с масштабированием, соединяя недостающие пиксели между пикселями и т. Д.)

void Editor::paintEvent(QPaintEvent *event)
{
    painter.drawPixmap(QRect(0, 0, image.width() * zoom , image.height() * zoom),
                             image);
}

void Editor::mousePressEvent(QMouseEvent *event)
{

    if(event->button() == Qt::LeftButton)
    {
        setImagePixel(event->pos());
    }

}

void Editor::mouseMoveEvent(QMouseEvent *event)
{
    if(event->buttons() & Qt::LeftButton)
    {
        setImagePixel(event->pos(), true);
    }
}

void Editor::setImagePixel(const QPoint &pos)
{

    QPainter painter(&image);
    if(image.rect().contains(i, j))
    {
        painter.begin(&image);
        painter.setPen(primaryColor);
        painter.drawPoint(i, j);
        painter.end();
    }
}

1 Ответ

1 голос
/ 05 декабря 2011

Да, я бы использовал QPainterPath и его API для рисования фигур ручной работы. Посмотрите на его методы: moveTo() и lineTo(), которые позволят вам избавиться от логики рисования (недостающие пиксели и т. Д.). Это также очень легко комбинировать с событиями мыши.

Надеюсь, это поможет.

...