簡體   English   中英

通過單擊按鈕 PyQt4 從另一個類調用函數

[英]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但大概你不想要那樣。 你想調用runTab1Widget1您已經創建並存儲在self.group

第二個問題是,當您連接信號時,您需要將其連接到可調用對象:您要調用的方法。 相反,您在連接時調用run方法並嘗試連接到該調用的結果(即None )。 所以你試圖將信號連接到None這當然會失敗。 您需要引用該方法而不調用它:只需刪除調用方括號即可。

把它放在一起:

  btn.clicked.connect(self.group1.run)

這似乎有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM