我对 Python 相当陌生,但已经设置并使用它视觉工作室代码 https://code.visualstudio.com/(注:这是not与 Visual Studio 相同)。
我正在使用 PySide2 包完成 Qt for Python 的 GUI 教程。大多数符号都通过 VS Code 的 Microsoft Python 扩展的 Intellisense 功能为我提供代码补全,但 PySide2.QtCore.Qt 模块却没有。
Intellisense 仍然给出了一些符号,但它们都是开头和结尾带有双下划线的符号,其中一个名为mro
。举个例子,工作PySide2.QtCore.Qt.AlignHCenter
编译和工作正常的符号不会显示制表符补全/智能感知。
如果我直接输入QtCore.Qt.AlignHCenter
,它被接受并且工作正常。
Question
如何让 Intellisense/tab 完成功能适用于 PySide2 包中的 PySide2.QtCore.Qt 模块?
更多信息
PySide2 是 Qt 的开源 Python 适配器。 Qt 有一个几乎相同的单独 Python 绑定 PyQt5,主要区别在于许可(请参阅PyQt5 和 PySide2 有什么区别 https://www.learnpyqt.com/blog/pyqt5-vs-pyside2/).
Qt 模块似乎是虚拟模块,至少在 PySide2 中,每这个答案 https://stackoverflow.com/a/39317267/6501141,这可能是问题的一部分,尽管用 PyQt5.Qt 代替 PySide2.QtCore.Qt 似乎也不起作用(即 Intellisense 似乎对于两个绑定项目都损坏了)。
我在 VS Code 中安装了以下看起来相关的扩展(还有更多用于通用事物的扩展,还安装了其他语言):
Python 2019.9.34474
-
Python Extension Pack 1.6.0
(包含 Python、MagicPython、Jinja、Django、VS IntelliCode)
-
Qt for Python 0.4.1
(PyQt5 和 PySide2 支持)
我尝试过的事情
我有工作代码,发布在下面。这QtCore.Qt.AlignHCenter
第 27 行中的元素不会提供任何智能感知Qt
symbol.
我尝试以各种方式导入 Qt 模块,包括直接从 PyQt5 导入:
import PyQt5.Qt
(NOTE:根据评论,PyQt5 是与 PySide2 不同的项目,但大多数 API 是相同的,并且 Qt for Python VS Code 扩展支持 Qt 的两种绑定集)
这似乎什么也没做。
我尝试了其他方法来获取要导入的特定元素,例如:
from PySide2.QtCore import Qt
from PySide2.QtCore.Qt import *
The second line here fails, saying there is an unresolved import:
第一行导入Qt
致力于提供 Qt 作为已知模块,因此我可以输入Qt.xxx
而不是QtCore.Qt.xxx
,但智能感知仍然以同样的方式失败:
代码:
### 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()