[英]Call a function from another class by clicking a button PyQt4
我有一個復選框和一個運行按鈕。 當復選框被選中時,我想通過單擊按鈕來運行一些功能。 問題是該函數位於按鈕類之外的另一個類中。 我的示例代碼如下。
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class Tab1Widget1(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.Tab1Widget1initUI()
def Tab1Widget1initUI(self):
self.setLayout(QGridLayout())
self.T1W1checkBox1 = QCheckBox('a', self)
self.layout().addWidget(self.T1W1checkBox1, 1, 0)
def run(self):
if self.T1W1checkBox1.isChecked() == True:
pass
class Tab1Layout(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.setLayout(QGridLayout())
self.group1 = Tab1Widget1(self)
self.layout().addWidget(self.group1, 0, 0)
btn = QPushButton('Run', self)
self.layout().addWidget(btn, 1, 0)
btn.clicked.connect(Tab1Widget1().run()) ##the problem is in this line.
class Page1(QTabWidget):
def __init__(self, parent=None):
super(Page1, self).__init__(parent)
self.tab1 = Tab1Layout()
self.addTab(self.tab1, "Tab1")
self.tab2 = QWidget()
self.tab3 = QWidget()
self.addTab(self.tab2, "Tab2")
self.addTab(self.tab3, "Tab3")
self.tab2_initUI()
self.tab3_initUI()
def tab2_initUI(self):
grid = QGridLayout()
self.tab2.setLayout(grid)
def tab3_initUI(self):
grid = QGridLayout()
self.tab3.setLayout(grid)
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setGeometry(300, 200, 600, 370)
self.startPage1()
def startPage1(self):
x = Page1(self)
self.setWindowTitle("Auto Benchmark")
self.setCentralWidget(x)
self.show()
def main():
app = QApplication(sys.argv)
main = MainWindow()
main.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
如您所見,我想在“Tab1Widget1”類中運行“run”函數。 但是,該按鈕位於“Tab1Layout”類中。 當我運行代碼時,它返回給我“TypeError:connect() 槽參數應該是可調用的或信號,而不是‘NoneType’”
如果有人知道如何解決這個問題,請告訴我。 贊賞!
不管它在什么對象中,將任何可調用對象連接到按鈕單擊都沒有問題。但是您的代碼有兩個特定問題。 你寫
btn.clicked.connect(Tab1Widget1().run())
這里的第一個問題是Tab1Widget1()
正在創建一個新的Tab1Widget1
但大概你不想要那樣。 你想調用run
在Tab1Widget1
您已經創建並存儲在self.group
。
第二個問題是,當您連接信號時,您需要將其連接到可調用對象:您要調用的方法。 相反,您在連接時調用run
方法並嘗試連接到該調用的結果(即None
)。 所以你試圖將信號連接到None
這當然會失敗。 您需要引用該方法而不調用它:只需刪除調用方括號即可。
把它放在一起:
btn.clicked.connect(self.group1.run)
這似乎有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.