知道其元素的QTableWidget行的索引

时间:2015-04-14 17:03:31

标签: python qt4 pyqt4 qtablewidget qtablewidgetitem

[我使用PyQt4,但我认为这个Qt4问题不是特定于Python的。]

我有QTableWidget。在每一行中,第一列包含一个按钮。单击时,该行将被删除。

要删除行,我使用removeRow(int row)方法,该方法将行的索引作为参数。连接信号时,我无法知道行的索引,因为它可能会在此期间发生变化(例如,如果第一行被删除,则所有行索引都会更改)。

The accepted answer here建议在回调中传递回调QTableWidgetItem的一个实例,然后在删除时从该项中获取行号。

这很好,除了行的所有元素都不是QTableWidgetItem。元素是按钮本身和一些组合框。

我无法找到解决方法。

我可以以某种方式将我的一个元素放入QTableWidgetItem吗?我应该在某种隐藏列中添加QTableWidgetItem吗?

我们当前的实施使用indexAt(QtGui.qApp.focusWidget())(请参阅上面提到的问题的其他答案),这对我来说看起来很遗憾。

如果我用像这样的可检查的QTableWidgetItem替换按钮

rm_item = QtGui.QTableWidgetItem()
rm_item.setFlags(QtCore.Qt.ItemIsUserCheckable |
                 QtCore.Qt.ItemIsEnabled)

我有一个QTableWidgetItem我可以用来返回行索引。但我不知道如何抓住"检查"或者"点击"它的事件就像我用按钮做的那样。我找到的只是itemClicked的{​​{1}}信号,但我必须过滤掉所有其他小部件。

我必须有一些显而易见的东西。

修改

从我读到的here开始,我可以将带有setItem的QTableWidgetItem和带有setCellWidget的Button小部件添加到同一个单元格中。这对我来说并不是那么自然,但显然它有效(现在不能测试)。

我想我会这样做。在同一单元格上添加Button和一个虚拟QTableWidgetItem,作为对该行的引用传递。

这是它的意思吗?

修改2

或者QTableWidget可能不是正确的Widget,我应该按照建议here使用QTableWidget

2 个答案:

答案 0 :(得分:2)

似乎使用布局而不是表格可能是最“正确”的答案,但这可能伴随着它自身的困难,正如我对这个问题的回答所示:

如果你想继续使用表格,比添加虚拟物品更简洁的解决方案是使用persistent model index

            button = QtGui.QPushButton(text, self.table)
            self.table.setCellWidget(row, column, button)
            index = QtCore.QPersistentModelIndex(
                self.table.model().index(row, column))
            button.clicked.connect(
                lambda *args, index=index: self.handleButton(index))

    def handleButton(self, index):
        print('button clicked:', index.row())
        if index.isValid():
            self.table.removeRow(index.row())

答案 1 :(得分:0)

如果我理解你的问题:

def set_button(self, row, col):
    # create a push button 
    btn = QtGui.QPushButton('Remove row')
    # connect to action
    btn.clicked.connect(self.remove_row)
    # set in cell 
    self.setCellWidget(row, col, btn)


def remove_row(self):
    # find what is clicked 
    clicked = QtGui.qApp.focusWidget()
    # position 
    idx = self.indexAt(clicked.pos())
    # remove this row
    self.removeRow(idx.row())