PySide 关闭窗口函数传递自定义参数

0 投票
1 回答
718 浏览
提问于 2025-04-18 15:02

我在主函数里创建了一个Control类的实例和一个GuiWindow类的实例。这个GuiWindow对象有一些方法,这些方法需要之前提到的Control类的实例作为参数。不过,GuiWindow并没有把Control对象当作自己的属性!它是在主函数调用时,把Control对象作为参数传给自己的方法。所以一切都能正常工作,GuiWindow有事件监听器,根据这些监听器来调用Control,而Control则执行它需要做的事情……但是,当用户关闭GUI窗口时,Control需要做一些非常重要的事情!

我现在的closeEvent函数只做了以下这些:

def closeEvent(self, event):

    quit_msg = "Are you sure you want to exit the program?"
    reply = QtGui.QMessageBox.question(self, 'Exit',
            quit_msg, QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

    if reply == QtGui.QMessageBox.Yes:
        event.accept()
        exit()
    else:
        event.ignore()

如果我想把Control类的对象传给这个closeEvent函数,可以吗?这有可能吗?我不知道怎么重写closeEvent函数,让它知道需要调用Control的某个方法。如果我把Control类的对象放到closeEvent函数的参数里,那当然是行不通的……

有没有人有什么想法?我是不是应该使用某种信号和事件机制?

1 个回答

0

我成功地通过信号和事件机制来调用我控制类中的closeEvent函数。我创建了以下这个类:

class ExitApp(QtCore.QObject):
    exit_app_signal = QtCore.Signal(str)

    def __init__(self):
        QtCore.QObject.__init__(self)

    def exit_app(self, exit_message):
        self.exit_app_signal.emit(exit_message)

然后我把这个对象连接到了我控制类中想要调用的方法,并且我用以下方式来调用它:

def closeEvent(self, event):

    quit_msg = "Are you sure you want to exit the program?"
    reply = QtGui.QMessageBox.question(self, 'Exit',
            quit_msg, QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

    if reply == QtGui.QMessageBox.Yes:
        self.exit_app.exit_app('Properly exit.')
        event.accept()
        exit()
    else:
        event.ignore() 

撰写回答