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

Fra*_*ins 11 pycharm python-3.x pyqt5

只是一个有点迂腐的问题,但我在 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()
        ...
Run Code Online (Sandbox Code Playgroud)

Sco*_*iss 13

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

解决方案一:

您可以忽略 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: ...
Run Code Online (Sandbox Code Playgroud)

  • 关于解决方案 1:对我来说,只有在将 `PyQt5.QtCore.pyqtSignal.connect` 和 `PyQt5.QtCore.pyqtBoundSignal.connect` 添加到忽略引用列表中后,警告才消失。(PyCharm 2022.3.2 社区版) (3认同)

小智 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)
Run Code Online (Sandbox Code Playgroud)

上述两种情况都会触发以下警告消息:

Cannot find reference 'connect' in 'function | pyqtBoundSignal'
Run Code Online (Sandbox Code Playgroud)

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

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