【问题标题】:PyQt5: State change in Checkboxes from a QTableWidgetPyQt5:来自 QTableWidget 的复选框中的状态更改
【发布时间】:2019-01-21 14:57:34
【问题描述】:

我想知道是否有一种方法可以在您选中/取消选中 QTableWidget 中的单元格中的复选框时运行函数。现在我通过以下方式创建这些复选框:

for row in range(len(my_list)):
    self.item = QtWidgets.QTableWidgetItem()
    self.item.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
    self.item.setCheckState(QtCore.Qt.Checked)

是否有某种 item.stateChanged.connect() 方法可以解决这个问题? 我什至尝试,对于表格中的每次点击,检查所点击行中项目的状态,但每次都返回 2,就好像它总是被检查过一样:

if self.mytable.item(row,1).checkState() == QtCore.Qt.Checked:

谢谢

【问题讨论】:

    标签: python pyqt pyqt5 qtablewidget qtablewidgetitem


    【解决方案1】:

    没有信号可以直接获取,所以我会使用QTableWidgetcellChanged信号,我也会将之前的状态保存在一个角色中,以便与当前状态进行比较。

    from PyQt5 import QtCore, QtWidgets
    
    LastStateRole = QtCore.Qt.UserRole
    
    class MainWindow(QtWidgets.QMainWindow):
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
    
            self.tablewidget = QtWidgets.QTableWidget(4, 4)
            self.setCentralWidget(self.tablewidget)
    
            my_list = ["A", "B", "C", "D"]
            for row in range(len(my_list)):
                item = QtWidgets.QTableWidgetItem()
                item.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
                item.setCheckState(QtCore.Qt.Checked)
                item.setData(LastStateRole, item.checkState())
    
                self.tablewidget.setItem(row, 0, item)
    
            self.tablewidget.cellChanged.connect(self.onCellChanged)
    
        def onCellChanged(self, row, column):
            item = self.tablewidget.item(row, column)
            lastState = item.data(LastStateRole)
            currentState = item.checkState()
            if currentState != lastState:
                print("changed: ")
                if currentState == QtCore.Qt.Checked:
                    print("checked")
                else:
                    print("unchecked")
                item.setData(LastStateRole, currentState)
    
    
    if __name__ == '__main__':
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
        w = MainWindow()
        w.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 谢谢,该方法可能有效。我现在遇到的问题是,每当我单击带有print(self.mytable.item(selected_row,1).checkState()) 的复选框时,每次打印该单元格中项目的状态时,状态始终为2、2、2 ...知道为什么会这样吗?再次感谢!
    猜你喜欢
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多