Pylance 抱怨 self.tr() 方法

问题描述 投票:0回答:1

我正在使用 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 本身使用它们(如果我只是下载该示例,则会出现相同的错误)。

有人可以帮助我了解发生了什么事吗?

python qt typechecking pyside6 pylance
1个回答
0
投票

正如 @musicamante 在回复中指出的,

QObject.tr()
QObject
的 C++ 静态方法,并且文档明确指出:

不幸的是,由于 Qt 实现 tr() 的方式,PyQt6 不可能准确地重现其行为。 [...] PyQt6 的行为并不令人满意,将来可能会改变。建议优先使用

translate()
而不是
tr()
。这保证可以与当前和未来版本的 PyQt6 配合使用,并使在 Python 和 C++ 代码之间共享消息文件变得更加容易。

因此,我编写的实现也许是可行的方法,使用

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
© www.soinside.com 2019 - 2024. All rights reserved.