Вам нужно переопределить paintEvent () и сделать там рисование. Вам не нужны begin()
и end()
. Объявить художника с
QPainter painter(this);
Конструктор будет обрабатывать begin()
, и end()
будет вызываться, когда объект painter
выходит из области видимости и уничтожается.
Вам также не понадобится событие щелчка, чтобы вызвать рисование. paintEvent()
будет вызываться всякий раз, когда виджет должен нарисовать себя. Вы можете использовать нажатие кнопки, чтобы переключить логическое значение, которое paintEvent()
проверяет, чтобы определить, должно ли оно отображать прямоугольник или дугу. Просто убедитесь, что вы вызываете update()
после переключения переменной.
void Widget::on_pushButton_clicked()
{
drawShapes = !drawShapes;
update();
}
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
if(drawShapes)
{
QRectF rectangle(10.0, 20.0, 80.0, 60.0);
int startAngle = 30 * 16;
int spanAngle = 120 * 16;
painter.drawArc(rectangle, startAngle, spanAngle);
}
}
UPDATE:
Чтобы избежать необходимости переопределять paintEvent()
виджета, вы можете использовать QLabel
, назначить ему растровое изображение и нарисовать его. Примечание. Насколько я могу судить, вам необходимо устанавливать растровое изображение каждый раз, когда вы его изменяете.
void MainForm::slot_buttonClick()
{
QPixmap pixmap(100,100);
pixmap.fill(QColor("transparent"));
QPainter painter(&pixmap);
painter.setBrush(QBrush(Qt::black));
painter.drawRect(10, 10, 100, 100);
label.setPixmap(pixmap);
}