【问题标题】:PyQt application freezes if dialog rejected如果对话框被拒绝,PyQt 应用程序将冻结
【发布时间】:2014-07-23 00:29:26
【问题描述】:

我有一个小型应用程序,需要在启动前登录。 但是如果用户拒绝登录(按取消按钮),应用程序不会关闭,它只是冻结。

这是简化的代码:

import sys

from PyQt5 import QtWidgets, QtCore


class LoginWindow(QtWidgets.QDialog):

    def __init__(self, parent=None):
        super(LoginWindow, self).__init__(parent)
        self.resize(250, 150)
        self.move(500, 500)
        self.setWindowTitle('Login')
        self.login_input = QtWidgets.QLineEdit(self)
        self.login_input.move(10, 10)
        self.password_input = QtWidgets.QLineEdit(self)
        self.password_input.move(10, 50)
        self.password_input.setEchoMode(QtWidgets.QLineEdit.Password)
        self.button_box = QtWidgets.QDialogButtonBox(self)
        self.button_box.move(10, 80)
        self.button_box.setOrientation(QtCore.Qt.Horizontal)
        self.button_box.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel |
                                           QtWidgets.QDialogButtonBox.Ok)

        self.button_box.accepted.connect(self.login)
        self.button_box.rejected.connect(self.reject)

    def login(self):
        self.accept()

    def cancel(self):
        self.reject()


class MainWindow(QtWidgets.QDialog):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.resize(250, 150)
        self.move(500, 500)
        self.setWindowTitle('Main')
        self.input = QtWidgets.QLineEdit(self)
        self.input.move(10, 10)
        self.show()

def main():
    app = QtWidgets.QApplication([])
    l = LoginWindow()
    l.show()
    login_result = l.exec_()
    print(login_result)
    if login_result == QtWidgets.QDialog.Accepted:
        m = MainWindow()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

我做错了什么? 我使用 python 3 和 PyQt5

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

    这是因为 PySide 没有处理它的任何事件。

    app.exec_()
    

    这会启动主事件循环,持续处理每个 GUI 交互。这应该在您执行任何 GUI 代码之前调用,以便可以从事件队列中正确处理事件。

    QDialog.exec_() 是一个阻塞操作,阻止代码在得到响应之前继续运行。

    如果您想查看对话框项目,那么您可以绕过这个问题。

    QtGui.QApplication.processEvents()
    

    这会处理事件队列中的所有事件,因此您可能必须继续调用此方法。

    此外,在初始化主窗口后,您还必须显示主窗口。

    【讨论】:

      【解决方案2】:

      我找到了避免这个错误的方法:

      我改变了主要功能:

      def main():
          app = QtWidgets.QApplication([])
          if LoginWindow().exec_() == QtWidgets.QDialog.Accepted:
              m = MainWindow()
              sys.exit(app.exec_())
      

      它工作正常,但仍然无法理解问题的根本原因是什么

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-07
        • 1970-01-01
        • 2017-06-02
        • 1970-01-01
        相关资源
        最近更新 更多