2010-02-16 17 views
12

Tengo un QScrollArea que engendra mi asombroso widget de desplazamiento. Me gusta hacer actualizaciones sobre los contenidos en varias ocasiones.update() o repaint() no se activa paintEvent()

Para esto hice una anulación de paintEvent(QPaintEvent *). Luego, cada vez que quiero que lo haga, llamo al update() en el widget.

Problema:paintEvent() nunca se llama por esto!

Lo que intenté en la solución de problemas hasta el momento:

  • repaint() uso en lugar de update(). Debería llamarlo instantáneamente. Desafortunadamente no.
  • Prueba para isVisible() y updatesEnabled
  • Prueba si mi anulación es correcta. Cambiar el tamaño de la ventana llama a mi función. Solo fallan mis llamadas de actualización manual(), repaint().
  • Implemente un QTimer para activar la actualización() o vuelva a pintar() cada 500 ms. El disparador da salida de texto, la función no se llama.

¿Alguien tiene una idea de lo que debe comprobar a continuación? ¿Qué podría hacer volver a pintar() no llamar a paintEvent()?

+0

No dibujando en el QScrollArea, sino que su QLabel asignado me solucionó el problema. Obtengo la actualización() s para QLabel. – ypnos

+0

¿podría pegar en su encabezado/definición de clase? ¿Tiene todas sus macros Q_OBJECT allí? también proporcione un fragmento rápido sobre cómo está anulando su paintEvent() ... – bgs

Respuesta

22

La solución es llamar this->viewport()->repaint() o this->viewport()->update() de su clase QAbstractScrollArea derivada en lugar de sólo repaint() o update().

Más información se da en Qt documentation:

QWidget * QAbstractScrollArea::viewport() const

Devuelve el control de vista. Utilice la función QScrollArea::widget() para recuperar el contenido del widget de ventana gráfica.

Desde el contenido que tenemos en nuestra clase derivada QAbstractScrollArea se mostrarán en el control de vista, tiene sentido llamar a la actualización del control de vista o pintar dibujar nuestros datos de nuevo (tenemos nuestro paintEvent llama).

+0

Básicamente esta es la respuesta correcta. Mi error fue que creé mi widget personalizado desde QScrollArea y pensé que podría hacer mi dibujo individual allí. En cambio, tendría que anular la función de dibujo de la ventana gráfica, probablemente no sea posible. – ypnos

+0

Es posible anular la función de dibujo de la ventana gráfica. Lo único que debe cuidar dentro del paintEvent() reimplementado de viewport es: en lugar de pasar este puntero como normalmente haría al crear un objeto QPainter, pase this-> viewport(). QPainter (this-> viewport()) en lugar de QPainter (this). De lo contrario, se lanza el error "QPainter no está activo". – Abhiram

+0

Esto se aplica a cualquier widget 'elegante' que use un QAbstractScrollArea, como el QTableWidget. ¡Muchas gracias por señalar esto! – eresonance

Cuestiones relacionadas