tutorial gui descargar creator qt graphics qt4 qt-creator

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); }