AttributeError:“QCoreApplication”对象没有属性“setQuitOnLastWindowClosed”

Posted

技术标签:

【中文标题】AttributeError:“QCoreApplication”对象没有属性“setQuitOnLastWindowClosed”【英文标题】:AttributeError: 'QCoreApplication' object has no attribute 'setQuitOnLastWindowClosed' 【发布时间】:2021-04-12 21:12:04 【问题描述】:

当我尝试退出 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() 让我们在使用自动设置时显示情节,没有错误。

【问题讨论】:

你在使用任何IDE或特殊环境吗? 来自 anaconda 的 Spyder,基础环境 我将 spyder 首选项 ipython 控制台图形后端设置为“自动”,它创建了一个与绘图交互的窗口,尽管我在这里没有绘制任何东西。我将其改回“内联”,但我还没有看到错误。一些设置也是 Qt4 和 Qt5,我猜可以使用自动设置来选择。我不确定错误是否来自此。 我认为这是错误的原因 【参考方案1】:

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

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


maxcounts = 10
counter = []

app = CoreApplication([])
# ...

【讨论】:

以上是关于AttributeError:“QCoreApplication”对象没有属性“setQuitOnLastWindowClosed”的主要内容,如果未能解决你的问题,请参考以下文章

AttributeError:“字节”对象没有属性“告诉”

AttributeError: 'RDD' 对象没有属性 'show'

AttributeError:“NumpyArrayIterator”对象没有属性“类”

AttributeError:模块 'dbus' 没有属性 'lowlevel'

AttributeError:模块'keras'没有属性'initializers'

AttributeError:“会话”对象没有属性“会话”