【问题标题】:How to properly setup vscode with pyside? Missing suggestions如何使用 pyside 正确设置 vscode?缺少建议
【发布时间】:2021-08-03 18:11:21
【问题描述】:

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

  • 操作系统:Linux
  • 安装了 pyside2 的 Virtualenv
  • 使用ms-python.pythonms-python.vscode-pylance
  • ui/MainWindow.ui 文件和对应生成的ui/MainWindow_ui.ui 文件与pyside2-uic

【问题讨论】:

  • 由于您是 pyside 的新手,而且 Qt6 还很新(一些类和功能甚至被暂时删除,并且到处都有一些错误),我会考虑使用 PySide2 对现在如果我是你。
  • @musicamante 我测试了这个确切的设置,除了使用 pyside2 并且问题仍然存在。生病更新问题。谢谢!
  • 不幸的是我不使用 vscode,所以我无法帮助你。但是考虑到信号不是实际的函数,它们是绑定到实例的对象,这可能是它们没有被正确识别为完成的原因。
  • @musicamante 我基本上遵循this 教程,他似乎完成了clicked,这就是为什么我想知道为什么我不明白。我也不知道这是否是“正确”的做法,因为我没有经验。我唯一能说的是,clicked 实际上是一个对象,clicked.connect() 是一个成员函数(也没有完成)。
  • @musicamante 我也不确定这是否是 vscode 的问题。我查看了定义,似乎clicked 没有任何定义。我尝试重新安装 pyside2/6 并没有弹出。实际上没有弹出任何字段。

标签: python visual-studio-code pyside pyside2


【解决方案1】:

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

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

键入不正确或无法与 PyLance 配合使用的库。我拥有的最好的,也许是最著名的例子是 PySide2(但请参阅早期帖子中的其他库的问题):大量错误以获取正确的工作代码,这使得发现真正的错误变得困难。 PyQt5 中的相同代码(基本上是 PySide2 的孪生兄弟)不会引起 PyLance 的任何抱怨,所以我假设问题出在 PySide2 的打字上。虽然我知道 PySide2 的输入和 PyLance 的分析结果都不一定不正确,但事实是大多数报告的错误都不应该存在,所以为了简单起见,我将其称为不正确。

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

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

【讨论】:

  • 感谢您的回答。它解释了为什么切换到 PyQt5 “解决了”我的问题。知道哪种语言服务器可以与 pyside2 一起使用吗?
  • 我之前尝试过其中的几个 - 没有运气。但是使用 vscode 信息重新打开 this 错误报告应该会有所帮助。因为这也显示了 PyCharm 如何做到这一点:)
【解决方案2】:

您可以通过运行手动生成存根

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())

【讨论】:

    【解决方案3】:

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

    我们的存根是通过自省自动生成的,不包括信号。目前,我们需要讨论我们应该如何支持信号。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 1970-01-01
      • 1970-01-01
      • 2016-07-31
      • 1970-01-01
      • 2018-03-03
      相关资源
      最近更新 更多