【问题标题】:PyQt5 closeEvent: How do I use it correctly? [closed]PyQt5 closeEvent:如何正确使用它? [关闭]
【发布时间】:2020-09-08 16:32:16
【问题描述】:

当用户单击“X”时,我的 GUI 中有一个线程正在运行,我想正确关闭它。 “尝试使用 closeEvent!”,我想,但事实证明这对我来说并不容易。 我尝试了几件事,我在 stackoverflow 上找到了这些,但对我没有用。

from PyQt5 import QtCore, QtGui, QtWidgets
import threading


class Ui_MainWindow(object):   # I also tried QtWidgets.QMainWindow, makes no difference

     def __init__(self):
          self.update_thread = threading. Thread(target=self.update)
          self.update_thread._stop_event = threading.Event()
          self.update_thread.start()

     def setupUi(self, MainWindow):
          # a lot of stuff going on here
          MainWindow.setObjectName("MainWindow")
          MainWindow.resize(400, 400)
          self.centralwidget = QtWidgets.QWidget(MainWindow)
          self.centralwidget.setObjectName("centralwidget")

     def update(self):
          # do something, not really relevant
          pass

     def closeEvent(self, event):
          print("test")
          self.update_thread._stop_event.set()
          self.update_thread.join()
          event.accept()


if __name__ == "__main__":
     import sys
     app = QtWidgets.QApplication(sys.argv)
     MainWindow = QtWidgets.QMainWindow()
     ui = Ui_MainWindow()
     ui.setupUi(MainWindow)
     MainWindow.show()
     sys.exit(app.exec_())

我省略了整个 ui 部分,因为它只是在做...... ui 的东西。 我在这里做错了什么?

感谢每一个建议。

【问题讨论】:

    标签: python multithreading qt user-interface


    【解决方案1】:

    不确定您的代码是否有任何问题,但这是一个可行的版本

    # -*- coding: utf-8 -*-
    
    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    # UI Layout
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(800, 872)
    
    
    # Main window class
    class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
        def __init__(self, *args, obj=None, **kwargs):
            super(MainWindow, self).__init__(*args, **kwargs)
            self.setupUi(self)
    
        def closeEvent(self, event):
            print("Close clicked")
            # Ask for confirmation
            answer = QtWidgets.QMessageBox.question(self,
            "Confirm Exit...",
            "Are you sure you want to exit?\nAll data will be lost.",
            QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
    
            event.ignore()
            if answer == QtWidgets.QMessageBox.Yes:
                event.accept()
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
    
        win = MainWindow()
        win.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 非常感谢!我会重写我的代码,让它像你的一样工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 2021-02-15
    • 2012-10-29
    • 2014-11-11
    • 2021-04-22
    • 1970-01-01
    相关资源
    最近更新 更多