AttributeError: 'QCoreApplication' object has no attribute 'setQuitOnLastWindowClosed'

AttributeError: 'QCoreApplication' object has no attribute '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'

我没有使用任何 windows。不过,这种情况并非每次都发生,在 运行 之后,我通常不会再看到错误。

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

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

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


maxcounts = 10
counter = []

app = CoreApplication([])
# ...