Рисовальщика QPainter сохранить предыдущие рисунки

Это мой первый раз, когда я использую Qt, и я должен сделать эквивалент MSPaint с Qt. Однако у меня возникли проблемы с покраской моих линий. В настоящее время я могу нарисовать линию, щелкнув где-то на экране и отпустив где-то еще, однако, когда я рисую вторую линию, предыдущая строка стирается. Как я могу сохранить ранее окрашенные предметы при покраске другого предмета?

void Canvas::paintEvent(QPaintEvent *pe){
    QWidget::paintEvent(pe);
    QPainter p(this);
    p.drawPicture(0,0,pic);
}

void Canvas::mousePressEvent(QMouseEvent *mp){
    start = mp->pos();
}

void Canvas::mouseReleaseEvent(QMouseEvent *mr){
    end = mr->pos();
    addline();
}

void Canvas::addline()Q_DECL_OVERRIDE{
    QPainter p(&pic);
    p.drawLine(start,end);
    p.end();
    this->update();
}

Canvas-это класс, производный QWidget, он имеет 2 атрибута QPoint start и конец.

класс:

class Canvas : public QWidget{
Q_OBJECT
private:
    QPoint start;
    QPoint end;
    QPicture pic;
public:
    Canvas(){paint = false;setAttribute(Qt::WA_StaticContents);}
    void addline();
protected:
    void paintEvent(QPaintEvent *);
    void  mousePressEvent( QMouseEvent * );
    //void  mouseMoveEvent( QMouseEvent * );
    void  mouseReleaseEvent( QMouseEvent * );

};

1 ответов


QPicture записи QPainter команды. Также из его документации вы можете прочитать следующее:

обратите внимание, что список команд painter сбрасывается при каждом вызове Рисовальщика QPainter::начать() функция.

и QPainter конструктор с устройством paint вызывает begin(). Таким образом, каждый раз, когда старые записанные команды удаляются.

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

кроме того, не забудьте инициализировать pixmap, потому что по умолчанию он будет пустым, и вы не сможете рисовать на нем.

Canvas() : pic(width,height) {...}

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

EDIT: обратите внимание, что вы должны быть в состоянии предотвратить QPicture от потери содержимого, не вызывая begin() больше раза. Если вы создаете живописец, предназначенный только для рисования на нем в области класса, и вызываете begin в конструкторе, различные записанные операции рисования должны сохраняться. Но по мере увеличения их количества потребуется все больше времени, чтобы нарисовать QPicture в свой виджет. Вы можете обойти это, используя оба QPicture и QPixmap, и рисовать для обоих используйте изображение для записи действий и pixmap, чтобы избежать непрерывного перерисовки изображения, даже если вы сделаете двойную работу, она все равно будет более эффективной, в то время как вы все еще сохраняете возможность использовать изображение для повторной растеризации в другом разрешении или сохранения истории рисования. Но я сомневаюсь!--1--> будет хорошо, так как ваше приложение для рисования начинает принимать форму фактического приложения для рисования, например, когда вы начинаете использовать трафареты pixmap brushe и такие.