Qt QMainWindow при закрытии - PullRequest
       9

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

10 голосов
/ 10 июня 2010

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

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

Но это не похожечтобы сделать это, позвоните close().Я делаю это неправильно?.
Разве центральный виджет не предполагается уничтожить?.

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

Ответы [ 7 ]

22 голосов
/ 10 июня 2010

Вам лучше реализовать одну виртуальную функцию в вашем основном 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
}

Удачи.

10 голосов
/ 10 июня 2010

Я бы попробовал QGuiApplication :: lastWindowClosed () вместо.

4 голосов
/ 10 июня 2010

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

1 голос
/ 21 апреля 2017

enter image description here В 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 (..) , но не после выхода из этой функции.

1 голос
/ 28 декабря 2014

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

1 голос
/ 10 июня 2010

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

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

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

0 голосов
/ 10 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...