Нужно что-то вроде готового сигнала от QWidget - PullRequest
13 голосов
/ 28 октября 2011

Я ищу что-то вроде готового сигнала от QDialog, только для QWidget.Причина в том, что я отключаю свою панель инструментов, как только всплывающий виджет (что совсем не проблема), и я хочу, чтобы панель инструментов была снова включена, когда виджет закрыт.

Я также не могупереопределите close-Event этого виджета, потому что тогда у нас будет GUI-код в бизнес-классах.

Ответы [ 3 ]

18 голосов
/ 30 октября 2011

Вы можете настроить удаление виджета при закрытии, а затем прослушать его сигнал destroyed:

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

Это работает, только если вас не интересует содержимое виджета.В момент выдачи destroyed() виджет больше не является QWidget, просто QObject (так как ~QObject испускается destroyed()), поэтому вы не можете привести аргумент QObject* кQWidget больше.

Простая альтернатива может заключаться в том, чтобы обернуть ваш виджет QDialog.

11 голосов
/ 29 октября 2011

В своем классе Widget вы можете добавить свой собственный сигнал, к которому могут подключиться другие. Затем переопределите метод closeEvent(). Не беспокойтесь о переопределении этого метода, такая ситуация - правильная причина.

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

    }

В методе closeEvent сработает ваш сигнал:

void MyCustomWidget::closeEvent(QCloseEvent *event)
{
      emit WidgetClosed();
      event->accept();
}
0 голосов
/ 28 октября 2011

QWidget на самом деле не имеет много сигналов, в соответствии с документацией он имеет общее количество 2. Однако это не означает, что вы не можете сами указать сигнал и использовать его, что, вероятно, является лучшим методом.

...