Нужно что-то вроде готового сигнала от QWidget
Я ищу что-то вроде готового сигнала от QDialog
, только для QWidget
. Причина в том, что я отключу свою панель инструментов после появления виджета (что совсем не проблема), и я хочу, чтобы панель инструментов снова включалась после закрытия виджета.
Я также не могу переопределить закрытие этого виджета, потому что тогда у нас будет GUI-код в бизнес-классах.
Ответы
Ответ 1
Вы можете установить виджет, который будет удален при закрытии, а затем прослушать его сигнал destroyed
:
widget->setAttribute( Qt::WA_DeleteOnClose );
connect( widget, SIGNAL(destroyed(QObject*)), this, SLOT(widgetDestroyed(QObject*)) );
Это работает, только если вас не интересует содержимое виджета. В точке испускания точки destroyed()
виджет больше не является QWidget
, а QObject
(поскольку destroyed()
испускается из ~QObject
), поэтому вы не можете использовать аргумент QObject*
для QWidget
больше.
Простой альтернативой может быть обернуть ваш виджет с помощью QDialog
.
Ответ 2
В вашем классе 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();
}
Ответ 3
QWidget не имеет большого количества сигналов на самом деле, в соответствии с документацией он имеет общую сумму 2. Однако это не означает, что вы не можете сами определить сигнал и использовать его, что, вероятно, является лучшим методом.