PyQt5 returnPressed.connect“在函数中找不到引用‘connect’”

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

只是一个迂腐的问题,但我在 PyCharm 中收到“无法在函数中找到引用‘connect’”警告。 (与我的 returnPressed.connect 有关)这只是 PyCharm 的错误还是该功能已被弃用,我在网上找不到这方面的信息。

我只在“returnPressed”上收到此 .connect 错误,其余的都很好。 这是我唯一剩下的警告,它让我烦透了。

class Login(QWidget):
    switch_window = QtCore.pyqtSignal()

    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        ...

        self.password = QLineEdit(self)
        self.password.setGeometry(QRect(50, 368, 200, 25))
        self.password.setFont(QtGui.QFont("Times", 13))
        self.password.setAlignment(QtCore.Qt.AlignCenter)
        self.password.setEchoMode(QLineEdit.Password)
        self.password.setStyleSheet("QLineEdit {border-radius: 10px}")
        self.password.setPlaceholderText("Password")
        self.password.returnPressed.connect(self.authenticate)
        ...

    def authenticate(self):
        ...
        self.switch_window.emit()
        ...
python-3.x pycharm pyqt5
3个回答
9
投票

这似乎是 PyQt5 存根文件“QtCore.pyi”的问题。这里有 2 个替代解决方案来解决这个问题:

解决方案1:

您可以忽略 pyqtBoundSignal 的 connect 方法的任何实例。为此,请转到“设置 > 编辑器 > 检查 > Python > 未解析的引用”,并将“PyQt5.QtCore.pyqtBoundSignal.connect”添加到“忽略引用”下的列表

解决方案2:

此处所述,您可以修改名为“QtCore.pyi”的存根文件,该文件可以在 PyCharm 的树视图中的“\site-packages\PyQt5”下找到。

打开 QtCore.pyi 后,确保您看到下面的两条“def connect”行和两条“def emit”行。如果缺少,您可以添加它们,相关的 PyCharm 警告就会消失。

# Support for new-style signals and slots.
class pyqtSignal:

    signatures = ...    # type: typing.Tuple[str, ...]

    def __init__(self, *types: typing.Any, name: str = ...) -> None: ...

    @typing.overload
    def __get__(self, instance: None, owner: typing.Type['QObject']) -> 'pyqtSignal': ...

    @typing.overload
    def __get__(self, instance: 'QObject', owner: typing.Type['QObject']) -> 'pyqtBoundSignal': ...

    def connect(self, slot: 'PYQT_SLOT') -> 'QMetaObject.Connection': ...
    def emit(self, *args: typing.Any) -> None: ...


class pyqtBoundSignal:

    signal = ...        # type: str

    def __getitem__(self, key: object) -> 'pyqtBoundSignal': ...

    def connect(self, slot: 'PYQT_SLOT') -> 'QMetaObject.Connection': ...

    @typing.overload
    def disconnect(self) -> None: ...

    @typing.overload
    def disconnect(self, slot: typing.Union['PYQT_SLOT', 'QMetaObject.Connection']) -> None: ...

    def emit(self, *args: typing.Any) -> None: ...

7
投票

我也有这种奇怪的警告。它也让我烦恼,因为我的代码工作得很好(也在使用 pyinstaller 的导出版本中,所以它的有效性不依赖于 IDE)。 因此,我完全忽略它,我认为你可以这样做。我完全同意musicamante的评论。

但是,为了完整起见,这是我更彻底的分析。

这是我的两个示例,其中 connect 在 PyCharm Community 2020.3.3(Python 3.9 和 PyQt5)中产生以下警告:

def setupConfirmPID(self):
    r"""Build the MessageBox instance that will confirm default PID values setting."""
    self.msgConfirmDefaultPID = QMessageBox()
    ...
    self.msgConfirmDefaultPID.setStandardButtons(QMessageBox.Cancel | QMessageBox.Ok)
    self.msgConfirmDefaultPID.buttonClicked.connect(self.defaultPIDConfirmation)

# ----------------------
# Other example within an other class of the same package

    # Declare rxWorker and rxThread then assign RxWorker instance to rxThread
    self.rxWorker = RxWorker(...)
    self.rxThread = QThread()
    self.rxWorker.moveToThread(self.rxThread)

    # Signal/Slot connections for inter-thread communication
    self.rxThread.started.connect(self.rxWorker.run)

以上两者都会触发以下警告消息:

Cannot find reference 'connect' in 'function | pyqtBoundSignal'

经过一番研究,我发现显示这样的警告是因为信号对象实际上是 pyQtBoundSignal,而不是 pyQtSignal。也许这种微妙之处只在 PyQt5 中表现出来? 我能发现的唯一区别是,当信号是实例的参数(从 init() 中创建)时,会创建“绑定”pyqtSignal 并将其保留为“常规”信号(无需连接即可连接)警告),我需要将其实现为类属性(在 init() 之前)。

因此,为了完全消除您的警告,除了向 JetBrains(PyCharm 编辑器)发出错误报告之外,我看到的唯一一件事就是覆盖您想要连接其信号的类并确保声明了信号作为类属性,而不是实例属性。 但这就太过分了。


0
投票

正如上面那位朋友所说,用他提供的代码完成QtCore.pyi。此外,此处还给出了更改生效的正确导航。

© www.soinside.com 2019 - 2024. All rights reserved.