首页 > 解决方案 > AttributeError:“QCoreApplication”对象没有属性“setQuitOnLastWindowClosed”

问题描述

当我尝试退出 Qt 事件循环时,有时会收到此错误。使用代码示例代码,

from PyQt5 import QtCore, QtSerialPort

maxcounts = 10
counter = []

app = QtCore.QCoreApplication([]) 

serial_port = QtSerialPort.QSerialPort('COM3')

serial_port.setBaudRate(QtSerialPort.QSerialPort.Baud115200)
serial_port.open(QtCore.QIODevice.ReadWrite) 

serial_port.setDataTerminalReady(1)
serial_port.setDataTerminalReady(0)
serial_port.setDataTerminalReady(1)

def handle_ready_read(): 

    while serial_port.canReadLine():
        resp = serial_port.readLine().data().decode().strip()

        if len(counter) == maxcounts:
            print('closing')
            serial_port.setDataTerminalReady(0)
            serial_port.setDataTerminalReady(1)
            serial_port.setDataTerminalReady(0)
            serial_port.close()
            app.quit() 

        counter.append(1)

        if resp == 'end':
            print('closing')
            serial_port.setDataTerminalReady(0)
            serial_port.setDataTerminalReady(1)
            serial_port.setDataTerminalReady(0)
            serial_port.close()
            app.quit()             

serial_port.readyRead.connect(handle_ready_read) 
 
app.exec_()

有什么想法会输出此错误响应吗?

ERROR:tornado.application:Exception in callback functools.partial(<function Kernel.enter_eventloop.<locals>.advance_eventloop at 0x000001DD311F8280>)
Traceback (most recent call last):
  File "C:\Users\me\Anaconda3\lib\site-packages\tornado\ioloop.py", line 741, in _run_callback
    ret = callback()
  File "C:\Users\me\Anaconda3\lib\site-packages\ipykernel\kernelbase.py", line 314, in advance_eventloop
    eventloop(self)
  File "C:\Users\me\Anaconda3\lib\site-packages\ipykernel\eventloops.py", line 131, in loop_qt5
    return loop_qt4(kernel)
  File "C:\Users\me\Anaconda3\lib\site-packages\ipykernel\eventloops.py", line 117, in loop_qt4
    kernel.app.setQuitOnLastWindowClosed(False)
AttributeError: 'QCoreApplication' object has no attribute 'setQuitOnLastWindowClosed'

我没有使用任何窗户。但它不会每次都发生,运行一次后我通常不会再次看到错误。

编辑:可能是将 spyder 首选项 ipython 控制台图形后端设置为可能使用 Qt 的“自动”导致此错误,而不是将其设置为“内联”。我发现在注释掉时使用app = QtWidgets.QApplication([])with让我们在使用自动设置时显示情节,没有错误。app.setQuitOnLastWindowClosed(True)app.quit()

标签: pythonpyqtpyqt5qtserialportqcoreapplication

解决方案


似乎您正在使用一些特殊的环境(似乎是 Spyder),开发人员假设您正在使用 QGuiApplication 或 QApplication 作为具有该setQuitOnLastWindowClosed方法的事件循环。一种解决方法是创建一个继承自QCoreApplication该方法并具有该方法的类。

class CoreApplication(QtCore.QCoreApplication):
    def setQuitOnLastWindowClosed(self, quit):
        pass


maxcounts = 10
counter = []

app = CoreApplication([])
# ...

推荐阅读