PyQt5 TabWidget tabBarClicked TypeError: native Qt signal is not callable

PyQt5 TabWidget tabBarClicked TypeError: native Qt signal is not callable

我正在尝试使用 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)

显然 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")

你的代码有两个问题:

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

更改为:

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

然后:

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

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