如何将多个QPushButtons添加到QTableView?

时间:2014-06-10 19:04:40

标签: python pyside

我有QTableView我希望为每行设置QPushButton。我在QWidget派生的类中按照下面的示例here执行以下操作:

 for index in range(number_rows):
        btn_sell = QPushButton("Edit", self)
        btn_sell.clicked.connect(self.button_edit)
        table_view.setIndexWidget(table_view.model().index(index, 4), btn_sell)

如果绘制了表格,我点击其中一个QPushButton调用方法self.button_edit - 但是哪一个?它似乎不是一个“事件”。任何类型的self.button_edit,我如何找到QPushButton方法中点击的button_edit的行索引?

也许有一种不同的方法可以为表格的每一行添加一个按钮?

2 个答案:

答案 0 :(得分:7)

您的事件处理程序将类似于:

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())

这使用indexAt函数来获取按钮的位置。

为清楚起见,我的脚本如下所示:

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 = ['row1','row2','row3','row4']
        data2 = ['1','2.0','3.00000001','3.9999999']

        self.table.setRowCount(4)

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

    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())

这会产生一个像这样的小GUI:

small gui

单击Edit按钮时,它会打印到控制台:

(0, 2)
(1, 2)
(2, 2)
(3, 2)

第一个元素是你的行索引,第二个是你的列(记住它是基于0的,这就是为什么它显示2,而不是3 - 尽管有列标题)。

答案 1 :(得分:0)

创建自定义按钮。

class IndexedButtonWidget(QPushButton):
def __init__(self, parent=None):
    super(QPushButton, self).__init__(parent=parent)
    self.button_row = 0
    self.button_column = 0

然后创建一个按钮对象。

self.btn_sell = IndexedButtonWidget('Edit')
self.btn_sell.button_row = row
self.btn_sell.button_column = column
self.btn_sell.clicked.connect(self.handleButtonClicked)

def handleButtonClicked(self):
    button = self.sender()
    print(button.button_row)
    print(button.button_column)

示例:

class IndexedButtonWidget(QPushButton):
    def __init__(self, parent=None):
    super(QPushButton, self).__init__(parent=parent)
    self.button_row = 0
    self.button_column = 0

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 = ['row1','row2','row3','row4']
        data2 = ['1','2.0','3.00000001','3.9999999']

        self.table.setRowCount(4)

        for index in range(4):
            item1 = QtGui.QTableWidgetItem(data1[index])
            self.table.setItem(index,0,item1)
            item2 = QtGui.QTableWidgetItem(data2[index])
            self.table.setItem(index,1,item2)
            self.btn_sell = IndexedButtonWidget('Edit')
            self.btn_sell.button_row = index
            self.btn_sell.button_column = 2
            self.btn_sell.clicked.connect(self.handleButtonClicked)
            self.table.setCellWidget(index,2,self.btn_sell)

    def handleButtonClicked(self):
        button = self.sender()
        print(button.button_row)
        print(button.button_column)