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 и end.
Тело класса:
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
команды. Также из его документации вы можете прочитать это:
Обратите внимание, что список команд рисования сбрасывается при каждом вызове функции QPainter::begin().
И QPainter
конструктор с устройством рисования делает вызов begin()
, Поэтому каждый раз старые записанные команды удаляются.
Может показаться заманчивым использовать его, поскольку он говорит, например, несколько хороших вещей, что он не зависит от разрешения, но это не то, как приложения для рисования работают в реальности. Переключиться на QPixmap
и ваши рисунки сохранятся.
Кроме того, не забудьте инициализировать растровое изображение, потому что по умолчанию оно будет пустым, и вы не сможете рисовать на нем.
Canvas() : pic(width,height) {...}
Кроме того, если вы хотите ввести понятие кистей, как в художественных кистях, а не QBrush
Возможно, вы захотите взглянуть на этот подход, чтобы нарисовать линию.
РЕДАКТИРОВАТЬ: Обратите внимание, что вы должны быть в состоянии предотвратить QPicture
от потери своего содержания, не звоня begin()
на этом не раз. Если вы создаете рисовальщик, предназначенный только для рисования на нем в области видимости класса, и вызываете begin в конструкторе, различные записанные операции рисования должны сохраняться. Но по мере того, как их число возрастает, потребуется все больше и больше времени для QPicture
на ваш виджет. Вы можете обойти это, используя оба QPicture
и QPixmap
и нарисуйте к обоим, используйте изображение для записи действий и растровое изображение, чтобы избежать непрерывного перерисовывания изображения, даже если вы удвоите объем работы, оно все равно будет более эффективным, но у вас все еще будет возможность использовать изображение для -Растеризировать в другом разрешении или сохранить историю рисунков. Но я сомневаюсь QPicture
преуспеет, когда ваше приложение для рисования начнет обретать форму фактического приложения для рисования, например, когда вы начнете использовать растровые трафареты для растровых изображений и тому подобное.