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
是不可调用的。
我会将听众连接到tabWidget
的onchange
:
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:如何在鼠标单击时获取活动选项卡窗口的索引?