PyCharm 无法调试 Qt5 (PySide2) 代码 - 错误 'Shiboken.ObjectType' 对象不可迭代

PyCharm fails to debug Qt5 (PySide2) code - Error 'Shiboken.ObjectType' object is not iterable

我有一些使用 Python 控制台应用程序的经验,现在正尝试从 Python 的 Qt(Qt 5.12、PySide2)开始。事实上,我正在尝试一些基本教程来了解它应该如何工作。

所以,我创建的很简单view.qml:

import QtQuick 2.0
import QtQuick.Controls 2.13

ApplicationWindow {
    visible: true

    Button {
        id: button
        text: qsTr("ClickOnMe")
    }

    Connections {
        target: button
        onClicked: con.say_hello()
    }
}

并具有以下 python 代码来使用它:

from PySide2.QtCore import QObject, Slot
from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import QQmlApplicationEngine

class Bridge(QObject):
    @Slot()
    def say_hello(context):
        print("Button clicked, Hello!", context)

app = QGuiApplication([])
engine = QQmlApplicationEngine()
bridge = Bridge()

context = engine.rootContext()
context.setContextProperty("con", bridge)
engine.load("view.qml")

engine.rootObjects()
exit(app.exec_())

当我简单地 运行 它时它工作正常 - 即我看到一个带有按钮的应用程序 window。我可能会单击一个按钮并在控制台中看到打印的消息。 但是当我尝试调试它时 - 它立即在 class Bridge(QObject): 行停止,但出现以下异常: <class 'tuple'>: (<class 'TypeError'>, TypeError("'Shiboken.ObjectType' object is not iterable"), <traceback object at 0x7fe195b23680>)

我在 Qt Creator 中尝试了同样的方法 - 工作正常,运行 和调试没有问题(小问题 - Qt Creator 控制台中的消息仅在应用程序终止后出现)。但我更喜欢 PyCharm,所以想了解如何解决这个问题并继续在 Qt 中使用 PyCharm。 如果它很重要 - 我 运行宁 ArchLinux。

几天前,Arch Linux 将其 Python 版本更新为 3.8,但 PySide2 还没有兼容版本,导致您指出的错误。正如他们在这份报告中指出的那样 PYSIDE-1140:

I'm keeping this open, but it will probably be solved for 5.14, since then Python 3.8 will be introduced as a new compatible Python version.

所以你有两个选择:

  • 等待与Python3.8兼容的PySide2发布。

  • 或从 aur 安装 Python3.7 or an old version(使用 yay),然后使用 pip 安装 PySide2。

这实际上是 Python 使用 Python 3.8 的 Qt 中的一个错误,但是它已经被解决 here

只需更新您的 qt:

pip install PyQt5