首页 > 解决方案 > 如何使用 VS Code 编辑器在 Python 包 PySide2.QtCore.Qt 模块上获得 Intellisense / tab-completion?

问题描述

我对 Python 还很陌生,但已经在Visual Studio Code中设置和工作(注意:这Visual Studio 不同)。

我正在使用 PySide2 包完成 Qt for Python 的 GUI 教程。大多数符号通过 VS Code 的 Microsoft Python 扩展的 Intellisense 功能为我提供代码完成功能,但其中之一是 PySide2.QtCore.Qt 模块不是。

Intellisense 仍然给出了一些符号,但它们都是在开头和结尾带有双下划线的符号,并且一个名为mro. 例如,PySide2.QtCore.Qt.AlignHCenter编译和工作正常的工作符号不会出现在制表符完成/智能感知中。

在此处输入图像描述

如果我直接输入QtCore.Qt.AlignHCenter,它会被接受并且工作正常。

问题

如何让 Intellisense/tab 完成以适用于 PySide2 包中的 PySide2.QtCore.Qt 模块?

更多信息

PySide2 是 Qt 的开源 Python 适配器。对于 Qt,PyQt5 有一个几乎相同的单独 Python 绑定,主要区别在于许可(请参阅PyQt5 和 PySide2 之间的区别是什么)。

Qt 模块似乎是一个虚拟模块,至少在 PySide2 中,根据这个答案,这可能是问题的一部分,尽管用 PyQt5.Qt 代替 PySide2.QtCore.Qt 似乎也不起作用(即 Intellisense 似乎两个绑定项目都损坏了)。

我在 VS Code 中安装了以下看起来相关的扩展(对于通用事物和其他语言还安装了更多):

我尝试过的事情

我有工作代码,发布在下面。第27 行是在符号QtCore.Qt.AlignHCenter下不提供任何 Intellisense 的元素。Qt

我尝试以各种方式导入 Qt 模块,包括直接从 PyQt5:

import PyQt5.Qt

注意:根据评论,PyQt5 是与 PySide2 不同的项目,但大多数 API 是相同的,并且 Qt for Python VS Code 扩展支持 Qt 的两个绑定集)

这似乎什么也没做。

我尝试了其他方法来获取要导入的特定元素,例如:

from PySide2.QtCore import Qt
from PySide2.QtCore.Qt import *

这里的第二行失败了,说有一个未解决的导入: 在此处输入图像描述

第一行导入Qt工作以提供 Qt 作为已知模块,所以我可以输入 justQt.xxx而不是QtCore.Qt.xxx,但 Intellisense 仍然以同样的方式失败:

编码:

### PyDownloader
# Simple GUI to Download a file from a URL
#
# Can test with this URL:
# - https://github.com/gitextensions/gitextensions/raw/master/.nuget/NuGet.exe
# which is an ~ 5Mb file

import sys
from PySide2 import QtWidgets, QtGui, QtCore

import urllib.request

class Downloader(QtWidgets.QDialog):
    
    def __init__(self, parent=None):
        QtWidgets.QDialog.__init__(self)

        self.url = QtWidgets.QLineEdit()
        self.save_location = QtWidgets.QLineEdit()
        self.progress = QtWidgets.QProgressBar()
        download = QtWidgets.QPushButton("Download")

        self.url.setPlaceholderText("URL")
        self.save_location.setPlaceholderText("File save location")

        self.progress.setValue(0)
        self.progress.setAlignment(QtCore.Qt.AlignHCenter)

        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(self.url)
        layout.addWidget(self.save_location)
        layout.addWidget(self.progress)
        layout.addWidget(download)
        self.setLayout(layout)

        self.setWindowTitle("PyDownloader")
        self.setFocus()

        download.clicked.connect(self.download)
    
    def download(self):
        url = self.url.text()
        save_location = self.save_location.text()
        urllib.request.urlretrieve(url, save_location, self.report)
        # Assume success
        self.progress.setValue(100)

    def report(self, blocknum, blocksize, totalsize):
        readsofar = blocknum * blocksize
        if totalsize > 0:
            percent = readsofar * 100 / totalsize
        else:
            # Just have it progress continuously as each block comes in
            percent = (blocknum % 100)
        self.progress.setValue(int(percent))


def main():
    app = QtWidgets.QApplication(sys.argv)
    dialog = Downloader()
    dialog.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

标签: pythonvisual-studio-codepyside2

解决方案


推荐阅读