PyQt5 TabWidget tabBarClicked TypeError: native Qt signal is not callable

Posted

技术标签:

【中文标题】PyQt5 TabWidget tabBarClicked TypeError: native Qt signal is not callable【英文标题】: 【发布时间】:2021-12-21 06:51:48 【问题描述】:

我正在尝试使用 PyQt5 制作用户界面。如果我单击第 5 个索引选项卡 userSettings() 函数将调用。但是程序引发了这个错误:

self.tabWidget.tabBarClicked(5).connect(self.userSettings())
TypeError: native Qt signal is not callable

我该如何解决?

import sys
import PyQt5.QtCore
from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QTabBar, QWidget
from PyQt5.QtWidgets import QMessageBox
from numpy import *
from alfa_gui import Ui_MainWindow
    
class MainWindow(QMainWindow, Ui_MainWindow):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        QMainWindow.__init__(self)
        self.setupUi(self)
        self.tabWidget.tabBarClicked(5).connect(self.userSettings())

    def userSettings(self):
        
        if self.lineEdit.text() == "cogal" and self.lineEdit_2.text() == "cogal":
            print("Success!")
        else:
            msg = QMessageBox()
            msg.setWindowTitle("Hatalı Giriş!")
            msg.setText("Wrong Password Or Username")
            x = msg.exec_()  
            msg.setIcon(QMessageBox.Critical)

    if __name__ == '__main__':
        app = QApplication(sys.argv)
        window = MainWindow()
        window.setWindowTitle('ALFA')
        window.show()
        exit_code = app.exec_()
        sys.exit(exit_code)

【问题讨论】:

为了将来参考,请尝试将您的代码缩减为minimal reproducible example:存在不需要的导入(numpy),它依赖于您未提供的 UI 文件。另外,请阅读更多关于formatting code 【参考方案1】:

显然tabWidget.tabBarClicked 是不可调用的。

我会将听众连接到tabWidgetonchange

self.tabWidget.currentChanged.connect(self.function_to_run)

然后你可以写你的function_to_run来检查currentIndex()

...
self.tabs.currentChanged.connect(self.function_to_run)
...
def function_to_run(self):
    if self.tabWidget.currentIndex() == 5:
        print("Do stuff")

【讨论】:

不仅仅是tabBarClicked 是不可调用的:no 信号是完全可调用的。 OP 仍然可以使用tabBarClicked 信号,问题是它不应该被调用,并且连接参数必须是可调用的。【参考方案2】:

你的代码有两个问题:

    信号文档中显示的参数是从它们所连接的函数接收到的参数; 信号连接需要对可调用对象的引用,而您正在调用所需的函数(带括号),这会在函数返回 None 时引发 TypeError;

改为:

    self.tabWidget.tabBarClicked.connect(self.userSettings)

然后:

def userSettings(self, tabIndex):
    if tabIndex != 5:
        return
    # ...

请注意,您应该连接到currentChanged 信号,而不是tabBarClicked 信号,因为即使单击的选项卡已经是当前选项卡,它也会被触发。

【讨论】:

tabIndex 参数如何通过connect 传递给userSettings @MSH 这就是信号和插槽的工作方式:每个信号文档中显示的 argument 是传递给连接函数的内容。在这种情况下,tabBarClicked 有一个 index 参数,这是传递给 userSettings 的内容。参数可以忽略,但由于它们是提供的(并且它们通常是被调用函数所必需的),因此您应该使用它们而不是为相同的参数值调用“getter”函数。 哇。这对我来说是新事物。显然我需要阅读更多。 :) 成功了,谢谢!

以上是关于PyQt5 TabWidget tabBarClicked TypeError: native Qt signal is not callable的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 TabWidget tabBarClicked TypeError: native Qt signal is not callable

PyQt5 Tab Widget:如何在鼠标单击时获取活动选项卡窗口的索引?

如何仅隐藏 QTabWidget 栏 PyQt5 [关闭]

PyQt5-Qt Designer工具箱(QToolBox)控件的使用

android之TabWidget选项卡

C/C++ Qt TabWidget 实现多窗体创建