PyQt:获取QTableWidget单元格小部件的行/列值

1 投票
1 回答
4240 浏览
提问于 2025-04-18 00:57

我有一个 QTableWidget,它有以下属性:

        mytable.setEditTriggers(QtGui.QTableWidget.NoEditTriggers)
        mytable.setSelectionBehavior(QtGui.QTableWidget.SelectRows)
        mytable.setSelectionMode(QtGui.QTableWidget.SingleSelection)
        mytable.horizontalHeader().setStretchLastSection(True)
        mytable.verticalHeader().hide()

在我表格的每一行,我都有一个 QPushButton,它被设置为一个 CellWidget,像这样:

在这里输入图片描述

有没有办法在用户点击任何按钮时,获取这个 QPushButton 所在的表格行号呢?

举个例子,如果用户点击了表格中 第二行QPushButton,那么它应该返回一个值 2。

编辑 2

根据其中一个回答,我把代码更新成了这样:但是我还是没有得到任何结果。我哪里出错了?我尝试打印 self.table.itemAt(button.pos()) 的输出,结果是 None

from PyQt4 import QtGui,QtCore
import sys

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self,parent)
        self.table = QtGui.QTableWidget()
        self.table.setColumnCount(3)
        self.setCentralWidget(self.table)
        data1 = ['orange','apple','banana','lemon']
        data2 = ['3','4','5.5','2']

        self.table.setRowCount(4)

        for i in range(4):
            item1 = QtGui.QTableWidgetItem(data1[i])
            self.table.setItem(i,0,item1)
            item2 = QtGui.QTableWidgetItem(data2[i])
            self.table.setItem(i,1,item2)
            self.button = QtGui.QPushButton('TEST')
            self.button.clicked.connect(self.handleButtonClicked)
            self.table.setCellWidget(i,2,self.button)

    def handleButtonClicked(self):
        button = self.sender()
        item = self.table.itemAt(button.pos())
        if item is not None:
            print (item.row(),item.column())


def Main():
    app = QtGui.QApplication(sys.argv)
    main = MainWindow()
    main.show()
    app.exec_()

if __name__ == '__main__':
    Main()

1 个回答

2

如果你能获取到被点击的按钮的引用,那么就可以使用 indexAt 方法来获取对应的模型索引:

button.clicked.connect(self.handleButtonClicked)
...        

def handleButtonClicked(self):
    button = QtGui.qApp.focusWidget()
    # or button = self.sender()
    index = self.table.indexAt(button.pos())
    if index.isValid():
        print(index.row(), index.column())

问题中第二个例子的返回值为 None,是因为在按钮所在的单元格中没有设置 QTableWidgetItem。相比之下,indexAt 方法总是会返回一个模型索引(只有在视图的空白区域时,这个索引才会无效)。

撰写回答