如何向QTableView添加多个qpushbutton?

2024-05-02 21:33:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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任何类型的“事件”,所以如何找到在button_edit方法中单击的QPushButton的行索引?

也许有一种完全不同的方法可以将按钮添加到表的每一行?


Tags: 方法selfview示例forindexheretable
1条回答
网友
1楼 · 发布于 2024-05-02 21:33:10

您的事件处理程序将如下所示:

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

这使用^{}函数来获取按钮的位置。

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

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——尽管列标题是这样的)。

相关问题 更多 >