使用 currentIndexChanged 调用函数发出信号

Signal emitting with currentIndexChanged invoking function

拥有三个 classes。 Class Table QTableWidget 以及一个信号和一个通过单击事件获取行号的函数。传输并发送给另外两个 classes。这部分脚本很有前途。

class Table(QtWidgets.QWidget):
    rownumber = QtCore.pyqtSignal(int)
    def __init__(self, parent=None):
        super(Table, self).__init__(parent)
        self.tableWidget = QtWidgets.QTableWidget(0, 3)

        self.tableWidget.cellClicked.connect(self.cellClick)

    def cellClick(self, row, column):  
        self.rownumber.emit(row)

    def currentrow(self):
        return self.tableWidget.currentRow()

第二个 Combo class 带有 QComboBox 和一个信号以及两个向第三个 class 发送和传输信息的函数,QComboBox 中的值已更改。要检查信号是否发出,打印 Signal emitted 。这部分脚本似乎也工作正常,因为执行了打印代码。

class Combo(QtWidgets.QWidget):
    Toupdatedata = QtCore.pyqtSignal()
    def __init__(self, parent=None):
        super(Combo, self).__init__(parent)
        self.combo = QtWidgets.QComboBox()
        self.combo.addItems(["1","2","3","4"])

        self.combo.activated.connect(self.setdatastrength)

    @QtCore.pyqtSlot(int)
    def setdatastrength(self, index):
        value = self.combo[index]
        self.dataupdate()

    def dataupdate(self):
        self.Toupdatedata.emit()
        print('Signal emitted')

    def get_data(self):
        return tuple([self.combo.currentText()])

第三个 class Tab 带有 QTabWidget 和两个函数以及一个连接,第一个函数从第一个 class Table 接收行数,第二个函数应该并且应该运行 并在第二个 class Combocombobox 的索引发生变化时执行。检查它是否可以打印字符串文本 I am executing。但它没有按预期工作?!当 QComboBox 的值改变时,函数 updatedata() 永远不会 运行s!

class Tab(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super( Tab, self).__init__()
        self.tab = QtWidgets.QTabWidget()
        self.Table = Table()
        self.combo = [Combo(), Combo()]
        self.datacombo = []
        self.Row = 0

        self.tab.addTab( self.Table, 'Tables')

        self.Table.rownumber.connect(self.rowselected_tables)
        self.combo[self.Row].Toupdatedata.connect(self.updatedata)

        # Alternative calling function currentrow.
#      self.combo[self.Table.currentrow()].Toupdatedata.connect(self.updatedata)


    @QtCore.pyqtSlot(int) 
    def rowselected_tables(self, row):
        self.Row = row
        if row > 0:
            self.Tab.addTab(self.combo[row], 'Combo')
            a1 = self.combo[row].get_data()
            self.datacombo[row] = a1

    @QtCore.pyqtSlot()               
    def updatedata(self):
        self.datacombo[self.Table.currentrow()] = self.combo[self.Table.currentrow()].get_data()
        print('I am executing', self.datagroup)

我想知道,我做错了什么?

更新:

import sys
from PyQt5 import QtCore, QtWidgets, QtGui
class Table(QtWidgets.QWidget):
    rownumber = QtCore.pyqtSignal(int)
    rowCount = QtCore.pyqtSignal(int)
    def __init__(self, parent=None):
        super(Table, self).__init__(parent)
        self.tableWidget = QtWidgets.QTableWidget(3, 3)
        self.lay = QtWidgets.QHBoxLayout(self)
        self.lay.addWidget(self.tableWidget)
        self.tableWidget.cellClicked.connect(self.cellClick)

    def cellClick(self, row, column):  
        self.rownumber.emit(row)

    def currentrow(self):
        return self.tableWidget.currentRow()

    def getrow(self):
        count = self.tableWidget.rowCount()
        self.rowCount.emit(count)

class Combo(QtWidgets.QWidget):
    Toupdatedata = QtCore.pyqtSignal()
    def __init__(self, parent=None):
        super(Combo, self).__init__(parent)
        self.combo = QtWidgets.QComboBox()
        self.combo.addItems(["1","2","3","4"])

        self.hbox = QtWidgets.QHBoxLayout()
        self.con = QtWidgets.QLabel("Number: ")
        self.hbox.addWidget(self.con)
        self.hbox.addWidget(self.combo)
        self.setLayout(self.hbox)
        self.combo.activated.connect(self.setdatastrength)

    @QtCore.pyqtSlot(int)
    def setdatastrength(self, index):
        self.dataupdate()

    def dataupdate(self):
        self.Toupdatedata.emit()
        print('Signal emitted')

    def get_data(self):
        return tuple([self.combo.currentText()])

class Tab(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super( Tab, self).__init__()
        self.tab = QtWidgets.QTabWidget()
        self.Table = Table()
        self.combo = []
        self.datacombo = []
        self.Row = 0

        self.tab.addTab( self.Table, 'Tables')    
        self.Table.rowCount.connect(self.addrow)
        self.Table.getrow()
        self.Table.rownumber.connect(self.rowselected_tables)
        self.combo[self.Row].Toupdatedata.connect(self.updatedata)

        self.lay = QtWidgets.QHBoxLayout(self)
        self.lay.addWidget(self.tab)

        # Alternative calling function currentrow.
#      self.combo[self.Table.currentrow()].Toupdatedata.connect(self.updatedata)

    @QtCore.pyqtSlot(int) 
    def addrow(self, count):
        for row in range(count):
            self.combo.append(Combo())
            self.datacombo.append(Combo().get_data())

    @QtCore.pyqtSlot(int) 
    def rowselected_tables(self, row):
        self.Row = row
        if row > 0:
            while self.tab.count() > 1:
                self.tab.removeTab( self.tab.count()-1 )
            self.tab.addTab(self.combo[row], 'Combo')
            a1 = self.combo[row].get_data()
            self.datacombo[row] = a1
        else:
            for n in [1]:
                self.tab.removeTab( n )

    @QtCore.pyqtSlot()               
    def updatedata(self):
        self.datacombo[self.Table.currentrow()] = self.combo[self.Table.currentrow()].get_data()
        print('I am executing', self.datagroup)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = Tab()
    w.show()
    sys.exit(app.exec_())

在我看来,您将信号 self.combo[self.Row].Toupdatedata.connect (self.updatedata) 连接到了错误的位置。 我注意到进行更改的文本。试一试:

import sys
from PyQt5 import QtCore, QtWidgets, QtGui

class Table(QtWidgets.QWidget):
    rownumber = QtCore.pyqtSignal(int)
    rowCount  = QtCore.pyqtSignal(int)

    def __init__(self, parent=None):
        super(Table, self).__init__(parent)
        self.tableWidget = QtWidgets.QTableWidget(3, 3)
        self.lay = QtWidgets.QHBoxLayout(self)
        self.lay.addWidget(self.tableWidget)
        self.tableWidget.cellClicked.connect(self.cellClick)

    def cellClick(self, row, column):  
        self.rownumber.emit(row)

    def currentrow(self):
        return self.tableWidget.currentRow()

    def getrow(self):
        count = self.tableWidget.rowCount()
        self.rowCount.emit(count)

class Combo(QtWidgets.QWidget):
    Toupdatedata = QtCore.pyqtSignal(int)                                    # + int

    def __init__(self, rowTable, parent=None):                               # + rowTable
        super(Combo, self).__init__(parent)
        self.rowTable = rowTable                                             # +
#@        print(rowTable, '------')

        self.combo = QtWidgets.QComboBox()
        self.combo.addItems(["item1", "item2", "item3", "item4"])

        self.hbox = QtWidgets.QHBoxLayout()
        self.con = QtWidgets.QLabel("Number: ")
        self.hbox.addWidget(self.con)
        self.hbox.addWidget(self.combo)
        self.setLayout(self.hbox)
        self.combo.activated.connect(self.setdatastrength)

    @QtCore.pyqtSlot(int)
    def setdatastrength(self, index):
        self.dataupdate()

    def dataupdate(self):
        print('+ Signal emitted ->', self.rowTable)
        self.Toupdatedata.emit(self.rowTable)                                 # + self.rowTable

    def get_data(self):
        return tuple([self.combo.currentText()])

class Tab(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super( Tab, self).__init__()

        self.tab = QtWidgets.QTabWidget()
        self.Table = Table()

        self.combo = []
        self.datacombo = []
        self.Row = 0

        self.tab.addTab( self.Table, 'Tables')    
        self.Table.rowCount.connect(self.addrow)
        self.Table.getrow()
        self.Table.rownumber.connect(self.rowselected_tables)
#-        self.combo[self.Row].Toupdatedata.connect(self.updatedata)

        self.lay = QtWidgets.QHBoxLayout(self)
        self.lay.addWidget(self.tab)

        # Alternative calling function currentrow.
# ?      self.combo[self.Table.currentrow()].Toupdatedata.connect(self.updatedata)

    @QtCore.pyqtSlot(int) 
    def addrow(self, count):
        for row in range(count):
            cb = Combo(row)                                                                      # + row
            self.combo.append(cb) 
            self.datacombo.append(cb.get_data()[0])                                              # get_data()[0]

            self.combo[row].Toupdatedata.connect(lambda rowTable=row: self.updatedata(rowTable)) # <===== !!!

    @QtCore.pyqtSlot(int) 
    def rowselected_tables(self, row):
        self.Row = row
        if row > 0:
            while self.tab.count() > 1:
                self.tab.removeTab( self.tab.count()-1 )
            self.tab.addTab(self.combo[row], 'Combo')
            a1 = self.combo[row].get_data()[0]                                                    # + [0]
            self.datacombo[row] = a1
        else:
            for n in [1]:
                self.tab.removeTab( n )

    @QtCore.pyqtSlot()               
    def updatedata(self, rowTable):                                                               # + rowTable
#        self.datacombo[self.Table.currentrow()] = self.combo[self.Table.currentrow()].get_data()
        self.datacombo[rowTable] = self.combo[rowTable].get_data()[0]                             # [0]
        print('I am executing', self.datacombo )                                            # ? self.datagroup

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = Tab()
    w.show()
    sys.exit(app.exec_())