Qt QMainWindow at Close

时间:2010-06-10 17:32:01

标签: c++ qt

这似乎是一个非常简单的问题,但我想在QMainWindow关闭时转储一些数据,所以我使用了以下代码:

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

但这似乎没有让它调用close()。我做错了吗?。中央人员是不是应该被摧毁?。

或者可以在调用close()之前关闭应用程序?。

其他任何方式呢?

7 个答案:

答案 0 :(得分:22)

您最好在主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
}
祝你好运。

答案 1 :(得分:10)

答案 2 :(得分:4)

您是否可以为QMainWindow实施closeEvent功能并将代码放在那里?

答案 3 :(得分:1)

您的初始问题和代码不匹配。如果您想在QMainWindow上执行某项操作,请创建子类并重新实施closeEvent或连接到MainWindow::destroyed()。但请参阅第3段以获取注释。

但是你的代码显示了一个似乎是第3类的东西,它将被销毁的MainWindow的子项连接到名为close()的某个插槽。在MainWindow已被销毁之后,centralwidget将被销毁,所以这很可能无论如何都无法帮助你。

此外,这取决于您创建MainWindow(堆栈或堆)的方式以及是否正确破坏它。理想情况下,您应该创建一个QMainWindow的子类(如果您使用的是您可能已经拥有的设计器)。

答案 4 :(得分:1)

在班级中实施QMainWindow::closeEvent(QCloseEvent *)。然后实现一个名为closing()的新信号,并从QMainWindow::closeEvent()的实现中发出它。然后,您可以连接到该信号,以便在窗口关闭之前执行某些操作。您也可以直接使用closeEvent来执行您需要执行的操作,例如保存状态,同步数据等等。

答案 5 :(得分:1)

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(..)函数时窗口仍然可见,但在退出该函数后却没有。

答案 6 :(得分:-1)

如何将转储代码添加到主窗口的析构函数中?