Qt QMainWindow при закрытии

это может показаться очень простым вопросом, но я хочу сбросить некоторые данные всякий раз, когда закрывается QMainWindow, поэтому я использовал следующий фрагмент кода:

QObject::connect(MainWindow.centralwidget, SIGNAL(destroyed()), this, SLOT(close()));

Но это, похоже, не вызывает вызов close(). Я делаю это неправильно?

Разве это не означает, что centralwidget будет уничтожен?

Или, возможно, приложение закрывается до того, как close() можно вызвать?.

Любые другие способы сделать это?

Ответ 2

Лучше повторить одну виртуальную функцию в своем основном классе MainWindow следующим образом:

class MainWindow : public QMainWindow {

    Q_OBJECT;

public:
    MainWindow();

protected:
     void closeEvent(QCloseEvent *event);
}

а затем объявите в исходном файле:

void MainWindow::closeEvent(QCloseEvent *event) {
     // do some data saves or something else
}

Удачи.

Ответ 3

Не удалось выполнить closeEvent для вашего QMainWindow и разместить там свой код?

Ответ 4

Ваш начальный вопрос и код не совпадают. Если вы хотите что-то сделать на QMainWindow, либо создайте подкласс и повторно выполните closeEvent или подключитесь к MainWindow::destroyed(), Однако см. Третий абзац для примечания.

Но ваш код показывает, что кажется третьим классом, который соединяет дочерний элемент MainWindow, который будет уничтожен в какой-либо слот под названием close(). centralwidget будет уничтожен ПОСЛЕ того, как MainWindow уже уничтожен, поэтому это, скорее всего, не поможет вам.

Кроме того, это зависит от того, как вы создали MainWindow (стек или кучу), и если вы правильно его разрушаете. В идеале вы должны создать подкласс QMainWindow (который, если вы уже использовали конструктор, у вас уже есть).

Ответ 5

Внесите QMainWindow::closeEvent(QCloseEvent *) в свой класс. Затем выполните новый сигнал с именем closing() и испустите его из вашей реализации QMainWindow::closeEvent(). Затем вы можете подключиться к этому сигналу, чтобы сделать что-то прямо перед закрытием окна. Вы также можете использовать closeEvent, чтобы делать то, что вам нужно, например сохранять состояние, синхронизировать данные и т.д.

Ответ 6

введите описание изображения здесь В Python (pyqt4 или pyqt5) вам нужно будет сделать следующее:

class MyWindow(QMainWindow):
    def __init__(self):
        super(MyWindow, self).__init__()
        #
        # My initializations...
        #

    ''''''

    def closeEvent(self, *args, **kwargs):
        #
        # Stuff I want to do when this
        # just before (!) this window gets closed...
        #

    ''''''

Интересно знать, что материал в функции closeEvent (..) запускается непосредственно перед окно закрывается. Вы можете проверить это со следующим тестом:

    # Test if the closeEvent(..) function
    # executes just before or just after the window closes.
    def closeEvent(self, *args, **kwargs):
        # 'self' is the QMainWindow-object.
        print(self)
        print(self.isVisible())

        # Print out the same stuff 2 seconds from now.
        QTimer.singleShot(2000, lambda: print(self))
        QTimer.singleShot(2100, lambda: print(self.isVisible()))

    ''''''

Это вывод в вашем терминале:

<myProj.MyWindow object at 0x000001D3C3B3AAF8>
True

<myProj.MyWindow object at 0x000001D3C3B3AAF8>
False

Это доказывает, что окно все еще было видимым при входе в функцию closeEvent (..), но не после выхода из этой функции.

Ответ 7

Как добавить код дампа в деструктор главного окна?