2011-10-28 9 views
12

Estoy buscando algo así como la señal de QDialog, solo para QWidget. La razón es que deshabilito mi barra de herramientas una vez que aparece el widget (que no es un problema en absoluto) y quiero que la barra de herramientas se habilite nuevamente, una vez que se cierra el widget.Necesita algo así como una señal terminada de QWidget

Tampoco puedo anular el evento cerrado de ese widget, porque entonces tendríamos código GUI en clases de negocios.

+1

¿Emitir una señal desde el widget? O atrapa la señal 'destroy()'? – RedX

+2

Su última línea realmente no tiene sentido. Un widget es un elemento de la GUI, su evento cercano es el código GUI. ¿Por qué la anulación de esa causa una mezcla de GUI y lógica de negocios? – Mat

Respuesta

14

Puede configurar el widget que desea borrar el cierre y vuelva a escuchar su señal destroyed:

widget->setAttribute(Qt::WA_DeleteOnClose); 
connect(widget, SIGNAL(destroyed(QObject*)), this, SLOT(widgetDestroyed(QObject*))); 

Eso sólo funciona si no estás interesado en el contenido del widget. En el punto destroyed() se emite, el widget ya no es un QWidget, solo un QObject (como destroyed() se emite desde ~QObject), por lo que ya no puede convertir el argumento QObject* en QWidget.

Una alternativa simple podría ser envolver su widget con un QDialog.

+0

ese primero funciona bastante bien, gracias. – LarissaGodzilla

+0

Hola Frank, ¿cómo implemento la ranura 'widgetDestroyed'? – SexyBeast

+0

Eso depende de lo que quieras hacer cuando se destruye el widget, no hay una respuesta genérica sobre qué hacer en la ranura. –

0

QWidget realmente no tiene muchas señales, según la documentación tiene un total de 2. Sin embargo, eso no significa que no pueda especificar una señal usted mismo y usarla, que es probablemente el mejor método .

9

En la clase de su Widget, puede agregar su propia señal a la que otros pueden conectarse. Luego, anule el método closeEvent(). No se preocupe por anular este método, este tipo de situación es exactamente la razón correcta para hacerlo.

class MyCustomWidget: public QWidget 
{ 
    Q_OBJECT 

    ... 

    signals: 
     void WidgetClosed(); 

    protected: 

    //=============================================================== 
    // Summary: Overrides the Widget close event 
    // Allows local processing before the window is allowed to close. 
    //=============================================================== 
    void closeEvent(QCloseEvent *event); 

    } 

En el método closeEvent desencadenar la señal:

void MyCustomWidget::closeEvent(QCloseEvent *event) 
{ 
     emit WidgetClosed(); 
     event->accept(); 
} 
+0

Ya lo hice, pero por alguna razón que podría no haber entendido tan bien como pensé que lo haría, mi jefe de equipo no quería que fuera así. Pero hablaré con él sobre eso, viendo que otras formas posibles tienen mucho menos sentido. – LarissaGodzilla

Cuestiones relacionadas