Нужно что-то типа готового сигнала от QWidget

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

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


person LarissaGodzilla    schedule 28.10.2011    source источник
comment
Излучать сигнал от виджета? Или поймать сигнал destroyed()?   -  person RedX    schedule 28.10.2011
comment
Твоя последняя строчка вообще не имеет смысла. Виджет — это элемент графического интерфейса, его событие закрытия — это код графического интерфейса. Почему переопределение этого вызовет смешение графического интерфейса и бизнес-логики?   -  person Mat    schedule 28.10.2011


Ответы (3)


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

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

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

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

person Frank Osterfeld    schedule 30.10.2011
comment
Привет, Фрэнк, как реализовать слот widgetDestroyed? - person SexyBeast; 13.11.2014
comment
Это зависит от того, что вы хотите сделать, когда виджет уничтожен, нет общего ответа, что делать в слоте. - person Frank Osterfeld; 14.11.2014

В своем классе 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();
}
person Liz    schedule 28.10.2011
comment
Я уже сделал это, но по какой-то причине, которую я, возможно, не так хорошо понял, как я думал, мой руководитель команды не хотел этого. Но я поговорю с ним об этом, видя, что другие возможные пути имеют гораздо меньше смысла. - person LarissaGodzilla; 31.10.2011

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

person Nicholas Smith    schedule 28.10.2011