【问题标题】:PyQt application crashes the second time it calls error messagePyQt 应用程序在第二次调用错误消息时崩溃
【发布时间】:2018-04-29 03:13:02
【问题描述】:

背景: 我正在使用 QtDesigner 和 PyCharm 创建一个 GUI。当主窗口 (win1) 通过 QPushButton 调用第二个窗口 (win2),然后由于缺少用户输入而打开错误消息时,就会出现我遇到的问题。我正在使用外部文件(main.py)来处理所有窗口的逻辑和事件,而不是编辑 QtDesigner 生成的代码。

问题: 我设置的方式,用户需要从组合框中选择一个选项,根据用户的选择,应用程序启动 win2 或 win3

用户未从组合框中选择任何选项 --> 错误消息
用户选择选项 1 --> win2 打开,win1 关闭
用户选择选项 2 --> win3 打开,win1 关闭
用户退出win 2/3回到win1后出现问题
用户选择选项 1/2 --> 正确的窗口打开,没有问题
用户未选择任何选项 --> 错误消息 --> 用户关闭错误 消息 --> 崩溃(或应用程序突然退出)
注意: 崩溃不会产生错误/警告

这是我用来处理打开/关闭的代码:

class win1(QtGui.QMainWindow, pg1.Ui_MainWindow):
    def __init__(self, parent=None):
        super(win1, self).__init__(parent)
        self.setupUi(self)
        self.btn1.clicked.connect(self.checkuserselection)
        self.addnew = win2(self)

    def checkuserselection(self):
        user_str = str(self.comboBox.currentText())
        if user_str == "Select Option":
            self.errMsg()
        elif user_str == "Option 1":
            self.runaddnew("Window title for option 1")
        else:
            self.runaddnew("window title for option 2")

    def runaddnew(self, title):
        self.addnew.setWindowTitle(title)
        self.addnew.show()
        self.hide()

    @staticmethod
    def errMsg():
        w = QtGui.QMessageBox()
        QtGui.QMessageBox.critical(w, "No Option Selected!")

win2的代码:

class win2(QtGui.QMainWindow, pg2.Ui_MainWindow):
    def __init__(self, parent=None):
        super(win2, self).__init__(parent)
        self.setupUi(self)
        self.actionExit.triggered.connect(self.closeWindow)

    def closeWindow(self):
        self.close()
        w = win1(self)
        w.show()

用户可以多次收到错误消息而不会突然退出应用程序,只要他们没有打开其他窗口之一。这使我认为问题出在win2中的closeWindow方法上。我对 python/pyQt 的了解有限,所以我不知道这是否确实是问题所在。

【问题讨论】:

  • 你将'self'传递给win1,它指的是一个关闭的窗口。 Qt 可能只是不显示关闭窗口的后代窗口。尝试在没有父母的情况下启动它
  • 我刚刚这样做了,应用程序现在在 win2 上的 actionExit 被触发后立即退出,win1 根本没有出现。我还尝试颠倒顺序:w = win1()、w.show()、self.close()。那也没有用。我也刚刚尝试了 w=win1(没有括号),它返回一个错误,因为 win1 不再被标识为 QWidget,因此没有 .show() 方法
  • 如果w 没有父级,则需要保留对其的显式引用,否则将在closeWindow 返回时立即进行垃圾回收。
  • @ekhumoro,你能详细说明一下吗?保持明确的参考是什么意思?这样的引用在代码中的什么位置?
  • @YazMajeed。实际上,看起来您根本不需要创建另一个 win1。只需执行self.parent().show(); self.close() 并摆脱其他两行。

标签: python user-interface pyqt


【解决方案1】:

感谢@ekhumoro,我将在此处发布有效的回复,以防其他人遇到此问题。
在win2的代码中:

def closeWindow(self):
    self.parent().show()
    self.close()

这是因为在创建 win2 时 win1 将 self 传递给了 win2

【讨论】:

  • 感谢您对此的提醒,看来由于某种原因我只能在 5 小时内完成此操作,我会记下回到这里并执行此操作
猜你喜欢
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
相关资源
最近更新 更多