我正在使用 PySide6 6.6.2 和 Python 3.11.8 开发一个应用程序。一切正常,mypy 很高兴。然而,如下图所示,Pylance(在 VSCode 上)不断抱怨无法访问
self.tr()
,尽管实际上任何 QtCore.QObject
都应该可以访问它(因此,QtWidgets.QWidget
)。事实上,应用程序运行没有错误,pyside6-lupdate
或 pyside6-lrelease
也很高兴。
这里是示例代码:
from PySide6 import QtWidgets
class TestWidget(QtWidgets.QWidget):
def __init__(self):
super(TestWidget, self).__init__()
self.setLayout(QtWidgets.QVBoxLayout())
self.layout().addWidget(QtWidgets.QLabel(self.tr("Hello World!")))
AFAIK,Qt 存根与库捆绑在一起。有什么原因导致只有这种特定方法不起作用?为什么我需要为单个方法手动添加存根,而整个包都经过正确的类型检查(例如,请注意
self.setLayout
和 self.layout()
都经过正确的类型检查)?这让我认为我使用 QTranslator 的方式出了问题,而不是库本身出了问题。
我尝试这样手动实现
self.tr()
:
from PySide6 import QtWidgets, QtCore
class TestWidget(QtWidgets.QWidget):
def __init__(self):
super(TestWidget, self).__init__()
self.setLayout(QtWidgets.QVBoxLayout())
self.layout().addWidget(QtWidgets.QLabel(self.tr("Hello World!")))
def tr(self, text: str) -> str:
return QtCore.QCoreApplication.translate("TestWidget", text)
这让 Pylance 很高兴,应用程序仍然有效。然而,很奇怪的是,我需要手动实现这个方法,而 documentation 本身使用它们(如果我只是下载该示例,则会出现相同的错误)。
有人可以帮助我了解发生了什么事吗?
QObject.tr()
是 QObject
的 C++ 静态方法,并且文档明确指出:
不幸的是,由于 Qt 实现 tr() 的方式,PyQt6 不可能准确地重现其行为。 [...] PyQt6 的行为并不令人满意,将来可能会改变。建议优先使用
而不是translate()
。这保证可以与当前和未来版本的 PyQt6 配合使用,并使在 Python 和 C++ 代码之间共享消息文件变得更加容易。tr()
因此,我编写的实现也许是可行的方法,使用
QtCore.QCoreApplication.translate()
,如果需要,可以为您的类手动实现 self.tr()
。
这是上面链接中的示例:
from PySide6 import QtCore
class A(QtCore.QObject):
def hello(self):
return QtCore.QCoreApplication.translate('A', "Hello")
a = A()
a.hello() # Correctly translated