获取一个QTableWidget的行的索引知道它的元素(Get the index of a QTa

2019-10-22 15:56发布

[我使用PyQt4的,但我认为这Qt4的问题没有具体的Python]

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

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

这里接受的答案表明,从这个项目通过回调QTableWidgetItem的一个实例,在该行,然后获取行号在删除时间。

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

我想不出解决的办法。

我能以某种方式适合我的元素融入到一个QTableWidgetItem之一? 我应该在某种隐藏的列中添加QTableWidgetItem?

我们当前实现使用indexAt(QtGui.qApp.focusWidget())看到问题上面提到的其他答案),它看起来像一个抱歉的变通方法给我。

如果我有一个可检查的QTableWidgetItem这样更换按钮

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

我有一个QTableWidgetItem我可以用它来找回行索引。 但我不知道如何捕捉“检查”或从“点击”事件就像我与按钮做。 所有我发现是itemClicked的信号QTableWidget ,但后来我不得不所有其他部件过滤掉。

必须有明显的东西我失踪。

编辑

从我读这里 ,我可以setCellWidget同一小区的同时添加与setItem QTableWidgetItem和一个按钮控件。 这似乎不那么自然的我,但显然它的工作原理(现在不能测试)。

我想我会做到这一点。 添加按钮,再加上在同一小区的虚拟QTableWidgetItem传递作为该行的引用。

这是它是如何意思是什么?

编辑2

或者,也许QTableWidget不正确的Widget,我应该使用一个Layout ,如建议在这里 。

Answer 1:

看来,使用布局而不是表可能是最“正确”的答案,但可能会用它自己的困难,在我回答这个问题看出:

  • 如何删除网格布局控件

如果您希望继续使用一个表,一个比增加虚拟物品有些清洁的解决方案是使用一个持久模型索引 :

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


Answer 2:

如果我没有理解你的问题:

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


文章来源: Get the index of a QTableWidget row knowing its elements