Подтвердить что ты не робот

Нужно что-то вроде готового сигнала от QWidget

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

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

4b9b3361

Ответ 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. Однако это не означает, что вы не можете сами определить сигнал и использовать его, что, вероятно, является лучшим методом.