这似乎是一个非常简单的问题,但我想在QMainWindow
关闭时转储一些数据,所以我使用了以下代码:
QObject::connect(MainWindow.centralwidget, SIGNAL(destroyed()), this, SLOT(close()));
但这似乎没有让它调用close()
。我做错了吗?。中央人员是不是应该被摧毁?。
或者可以在调用close()
之前关闭应用程序?。
其他任何方式呢?
答案 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)
在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)
如何将转储代码添加到主窗口的析构函数中?