[我使用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
。
答案 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())