如何使用 pyside 正确设置 vscode?缺少建议

How to properly setup vscode with pyside? Missing suggestions

我对 pyside、qt 和 python 非常陌生。 我设法用一个基本的 window 和一个关闭应用程序的按钮设置了一个项目。 我的问题是,即使代码可以正常运行,vscode 也不会显示所有可用属性。 请注意除了信号 clicked 之外,其他一些属性是如何被建议的。如果我将鼠标悬停在 clicked 上,它会告诉我 clicked: Any 只有在调试期间,vscode 告诉我点击的是什么: 当前设置:

Pylance 尝试使用 PySide6 库的存根文件(您可以使用 Go 遍历定义)来提供智能感知功能。根据 Qt docs clicked 信号应该在 QAbstractButton class 中定义,但是在类型定义(存根)中我们看不到这个信号定义。如果你仔细观察 PyCharm 从链接视频中的 QAbstractButton class 收集它,但 Vs Code 中的 Pylance 在 QPushButton 中搜索它。

自 PySide2 以来,这是 Pylance 中的一个已知问题,但根据 Pylance repo,这可能源自 Qt,因为 Python 的类型定义不正确:

Libraries that have typing that's either incorrect or doesn't work well with PyLance. Best and maybe most known example I have is PySide2 (but see issues with other libraries in earlier posts): tons(!) of errors for correct, working code, which makes spotting real errors difficult. The same code in PyQt5 (which is basically a twin sibling to PySide2) doesn't raise any complaints from PyLance, so I'm assuming the problem is with PySide2's typing. While I'm aware that neither PySide2's typing nor PyLance's analysis results are necessarily incorrect, fact is that most of the reported errors should not be present, so for sake of simplicity I'll just call it incorrect.

它可以在运行时访问的原因是;我猜它是通过 shiboken QObject 类型创建的实例。我没有任何解决方法,但它不会打扰我,因为我更喜欢在查找 class 定义中可用的信号时遵循官方 Qt 文档。

编辑: 已解决 bug report 这就是 PyCharm 能够处理自动完成的原因。在 VS Code 上打开另一个应该会有帮助。

因为我遇到了完全相同的问题,所以我在 PySide 错误报告中发现了这条非常有用的评论:https://bugreports.qt.io/browse/PYSIDE-1603

Our stubs are auto-generated by introspection, signals are not included. At the moment, we need to discuss how we should support signals.

所以,不是错误,只是缺少的功能。

您可以通过 运行

手动生成存根
pyside6-genpyi all

PySide2 有相同的工具,它不仅适用于 PySide6。

我使用 PDM 来处理我的项目,我执行的最后一个:

pdm run pyside6-genpyi all

PyLance 检测到我所有的存根:

如果 Signal 出现错误,那是因为 Qt/PySide 做了一些魔术并将 Signal 转换为 SignalInstance。我的解决方案是施放 SignalInstance 以获得正确的提示。

from typing import cast
from PySide6.QtCore import Signal, SignalInstance

class ConnectionPanel(QtWidgets.QWidget):
    connected = cast(SignalInstance, Signal())
    disconnected = cast(SignalInstance, Signal())