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([]) 时使用 app.setQuitOnLastwindowClosed(True)app.quit() 让我们在使用自动设置时显示情节,没有错误

解决方法

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

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


maxcounts = 10
counter = []

app = CoreApplication([])
# ...