C++ Qt QMainWindow处于关闭状态

C++ Qt QMainWindow处于关闭状态,c++,qt,C++,Qt,这似乎是一个非常简单的问题,但我想在QMainWindow关闭时转储一些数据,因此我使用了以下代码: QObject::connect(MainWindow.centralwidget, SIGNAL(destroyed()), this, SLOT(close())); 但这似乎并不能使它调用close()。我做错了吗?难道中央监狱不应该被摧毁吗 或者,应用程序可能在调用close()之前关闭 那么还有其他方法吗?你能为你的QMainWindow实现这个功能并把你的代码放在那里吗?你最初的问

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

QObject::connect(MainWindow.centralwidget, SIGNAL(destroyed()), this, SLOT(close()));
但这似乎并不能使它调用
close()
。我做错了吗?
难道中央监狱不应该被摧毁吗

或者,应用程序可能在调用
close()
之前关闭


那么还有其他方法吗?

你能为你的
QMainWindow
实现这个功能并把你的代码放在那里吗?

你最初的问题和代码不匹配。如果要在
QMainWindow
上执行某些操作,请创建一个子类并重新实现,或连接到
MainWindow::destroyed()
。但是,请参见第3段的注释

但您的代码显示的似乎是第三类,它将
主窗口的子窗口
连接到某个名为
close()
的插槽
centralwidget
将在主窗口已销毁后销毁,因此这很可能对您没有任何帮助


此外,这取决于您如何创建主窗口(堆栈或堆)以及是否正确地销毁它。理想情况下,您应该创建
QMainWindow
的子类(如果您使用的是设计器,您可能已经有了该子类)。

您最好在主
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
}

祝你好运。

我会试试。

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

在类中实现
QMainWindow::closeEvent(QCloseEvent*)
。然后实现一个名为
closing()
的新信号,并从
QMainWindow::closeEvent()
的实现中发出它。然后你可以连接到那个信号,在窗户关上之前做点什么。您还可以直接使用
closeEvent
执行需要执行的操作,如保存状态、同步数据或其他任何操作。

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

此在
QObject
层次结构中的位置如何?它可能是在信号发送之前被删除的。当然我不会太担心,因为到目前为止给出的答案中有更好的选择。你不能用你展示的代码转储数据。。。另外,您的问题是否是如何在QMainWindow关闭之前转储数据?或者为什么QMainwindow没有关闭?一定要弄清楚……我想在单击“x”关闭主窗口后编写XML文件。它似乎无法与上面的代码或QApplication::lastWindowClosed()或QApplication::aboutToQuit()一起工作。。。我没有尝试过QCloseEvent,但为了保持MVC结构,我宁愿不尝试。我使用的类不是QMainWindow,而是通过编译designer中的ui文件获得的文件。您可以通过覆盖closeEvent来发出信号来保持MVC。不起作用,必须意味着它在接受该信号之前被销毁?但这很奇怪,因为类的析构函数似乎没有输出任何东西(通过std::cerr),请确保带有插槽的对象不是QMainWindow的子对象。QWidgets会在孩子们倒下时毁掉他们所有的孩子。@Cenoc:Post您的
main
函数,它可以帮助清理正在发生的事情。呜呜,抓到了,它成功了!万分感谢!绝对不会在QApplication中查找这个。你不能在destructor或主窗口的析构函数中访问I/O-你终于在你的Application析构函数中了,所有东西都被销毁了。改为使用closeEvent()。最好完成覆盖。IE:in-closeEvent()调用QMainWindow::closeEvent(事件);在函数的末尾。请参见此处saveState()函数文档中的示例:虽然Ph0t0n不一定是错误的,但实际的
closeEvent()
实现通常调用
event.accept()
event.ignore()
,具体取决于是否存在未保存的更改<代码>QMainWindow::closeEvent(事件)通常不被调用。另一个有用的例子请参见。