繁体   English   中英

pyside2 通过窗口“X”连接到自定义退出方法

[英]pyside2 connect close by Window "X" to custom exit method

我使用 Qt Designer 进行 GUI 布局,并在 QUILoader 的帮助下将 .ui 文件加载到 python 中。

我设法将“退出”按钮连接到我的“quit_app”方法。

我的问题是,如果用户尝试使用“X”关闭窗口,如何连接此方法。

提前致谢!

---> 蟒蛇代码 <---

import sys
from PySide2.QtUiTools import QUiLoader
from PySide2.QtWidgets import QApplication
from PySide2.QtCore import QFile

class main_w(object):
    def __init__(self):
        # load ui; create w
        self.file = QFile("simple_quit.ui")
        self.file.open(QFile.ReadOnly)
        self.loader = QUiLoader()
        self.w = self.loader.load(self.file)

        # connections

        # Quit Button
        self.w.QUITButton.clicked.connect(self.quit_app)

        # ??? Window's X Button ???
        # THROWS ERROR:
        self.w.closeEvent.connect(self.quit_app)

    def quit_app(self):
        # some actions to perform before actually quitting:
        print('CLEAN EXIT')
        app.exit()

    def show(self):
        self.w.show()

app = QApplication(sys.argv)
w = main_w()
w.show()
sys.exit(app.exec_())

---> UI XML <---

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QPushButton" name="QUITButton">
    <property name="geometry">
     <rect>
      <x>100</x>
      <y>100</y>
      <width>75</width>
      <height>23</height>
     </rect>
    </property>
    <property name="text">
     <string>quit</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

在 Qt 中有 2 个概念:信号和事件,信号连接到一个插槽,但在事件的情况下你不能,然后你有后者。 在信号的情况下,知道谁是接收者,因为它是在连接中声明的,但事件不是,这是通过QObject的父子关系树发送的,可以根据案子。

所以这就是为什么你有这个问题。


通常的解决方案是覆盖 closeEvent 方法:

C++ 版本:

void MainWindow::closeEvent(QCloseEvent *event)
{
    if (maybeSave()) {
        writeSettings();
        event->accept();
    } else {
        event->ignore();
    }
}

蟒蛇版本:

def closeEvent(self, event):
    if maybeSave():
        writeSettings()
        event.accept()
    else:
        event.ignore()

但是为此,有必要从类继承,但在您的情况下这是不可能的,因此有另一种解决方案,安装事件过滤器:

import sys
from PySide2 import QtCore, QtWidgets, QtUiTools


class Manager(QtCore.QObject):
    def __init__(self):
        super(Manager, self).__init__()
        # load ui; create w
        file = QtCore.QFile("simple_quit.ui")
        file.open(QtCore.QFile.ReadOnly)
        loader = QtUiTools.QUiLoader()
        self.w = loader.load(file)

        # connections
        # Quit Button
        self.w.QUITButton.clicked.connect(self.quit_app)

        self.w.installEventFilter(self)

    def eventFilter(self, obj, event):
        if obj is self.w and event.type() == QtCore.QEvent.Close:
            self.quit_app()
            event.ignore()
            return True
        return super(Manager, self).eventFilter(obj, event)

    @QtCore.Slot()
    def quit_app(self):
        # some actions to perform before actually quitting:
        print('CLEAN EXIT')
        self.w.removeEventFilter(self)
        app.quit()

    def show(self):
        self.w.show()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = Manager()
    w.show()
    sys.exit(app.exec_())
def closeEvent(self, event):
    if pendingChanges == True: #write your required condition/check 
        self.save()            #include required your functionality(eg. self.save())         
        event.accept()
    else:
        event.ignore()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM