gui - Qt4 ¿Cómo dibujar dentro de un widget?
qt creator tutorial c++ pdf (2)
Qt4, QtCreator
Intento dibujar dentro de Widget:
void Widget::on_pushButton_clicked()
{
QPainter painter;
painter.begin(ui->label);
QRectF rectangle(10.0, 20.0, 80.0, 60.0);
int startAngle = 30 * 16;
int spanAngle = 120 * 16;
painter.drawArc(rectangle, startAngle, spanAngle);
painter.end();
}
Pero cuando presiono el botón no pasa nada.
¿Cómo hacer esto de manera correcta?
Si sobrescribe el método de pintura descrito por Arnold Spence, debe llamar al paintEvent del padre o terminar con un widget que solo muestra su rectángulo sobre un fondo blanco.
Debes anular paintEvent () y pintar allí. Realmente no necesitas el begin()
y el end()
. Declara al pintor con
QPainter painter(this);
El constructor manejará begin()
, y end()
se invocará cuando el objeto del painter
salga del alcance y se destruya.
Tampoco necesitará el evento click para activar la pintura. paintEvent()
siempre que el widget necesite dibujarse a sí mismo. Puede usar el botón de clic para alternar un valor booleano que paintEvent()
comprueba para determinar si debe o no mostrar el rectángulo y el arco. Solo asegúrese de llamar a update()
después de alternar la variable.
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);
}
}
ACTUALIZAR:
Para evitar tener que anular el paintEvent()
de un widget, podría usar un QLabel
y asignarle un mapa de bits y pintarlo. Nota: Por lo que puedo decir, tendrá que establecer el mapa de píxeles cada vez que lo modifique.
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);
}