获取知道其元素的 QTableWidget 行的索引
Get the index of a QTableWidget row knowing its elements
[我正在使用 PyQt4,但我认为这个 Qt4 问题不是 Python 特定的。]
我有一个QTableWidget
。在每一行中,第一列都有一个按钮。单击后,该行将被删除。
为了删除该行,我使用了 removeRow(int row)
方法,该方法将行的索引作为参数。连接信号时,我不知道行的索引,因为它可能同时发生变化(例如,如果删除第一行,则所有行索引都会更改)。
The accepted answer here 建议在行中向回调传递一个 QTableWidgetItem 的实例,然后在删除时从该项目中获取行号。
这很好,除了行中的 none 个元素是 QTableWidgetItem
。元素是按钮本身和一些组合框。
我想不出解决这个问题的方法。
我能否以某种方式将我的元素之一放入 QTableWidgetItem 中?我应该在某种隐藏列中添加 QTableWidgetItem 吗?
我们当前的实现使用 indexAt(QtGui.qApp.focusWidget())
(请参阅上述问题的其他答案),这对我来说似乎是一个遗憾的解决方法。
如果我用这样的可检查 QTableWidgetItem 替换按钮
rm_item = QtGui.QTableWidgetItem()
rm_item.setFlags(QtCore.Qt.ItemIsUserCheckable |
QtCore.Qt.ItemIsEnabled)
我有一个 QTableWidgetItem 可用于返回行索引。但是我不知道如何像使用按钮那样从中捕获 "checked" 或 "clicked" 事件。我发现的只是 QTableWidget
的 itemClicked
信号,但我必须过滤掉所有其他小部件。
一定是我遗漏了什么。
编辑
根据我的阅读here,我可以将带有 setItem 的 QTableWidgetItem 和带有 setCellWidget 的 Button 小部件添加到同一个单元格。这对我来说似乎不太自然,但显然它有效(现在无法测试)。
我想我会那样做。添加按钮,在同一单元格上加上一个虚拟 QTableWidgetItem,以作为对行的引用传递。
这就是它的本意吗?
编辑 2
或者 QTableWidget
可能不是合适的 Widget,我应该使用 Layout
,按照建议 here。
如果我正确理解你的问题:
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())
似乎使用布局而不是 table 可能是最 "correct" 的答案,但这可能有其自身的困难,正如我对这个问题的回答所示:
- How to delete widgets from gridLayout
如果您想继续使用 table,比添加虚拟项目更简洁的解决方案是使用 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())
[我正在使用 PyQt4,但我认为这个 Qt4 问题不是 Python 特定的。]
我有一个QTableWidget
。在每一行中,第一列都有一个按钮。单击后,该行将被删除。
为了删除该行,我使用了 removeRow(int row)
方法,该方法将行的索引作为参数。连接信号时,我不知道行的索引,因为它可能同时发生变化(例如,如果删除第一行,则所有行索引都会更改)。
The accepted answer here 建议在行中向回调传递一个 QTableWidgetItem 的实例,然后在删除时从该项目中获取行号。
这很好,除了行中的 none 个元素是 QTableWidgetItem
。元素是按钮本身和一些组合框。
我想不出解决这个问题的方法。
我能否以某种方式将我的元素之一放入 QTableWidgetItem 中?我应该在某种隐藏列中添加 QTableWidgetItem 吗?
我们当前的实现使用 indexAt(QtGui.qApp.focusWidget())
(请参阅上述问题的其他答案),这对我来说似乎是一个遗憾的解决方法。
如果我用这样的可检查 QTableWidgetItem 替换按钮
rm_item = QtGui.QTableWidgetItem()
rm_item.setFlags(QtCore.Qt.ItemIsUserCheckable |
QtCore.Qt.ItemIsEnabled)
我有一个 QTableWidgetItem 可用于返回行索引。但是我不知道如何像使用按钮那样从中捕获 "checked" 或 "clicked" 事件。我发现的只是 QTableWidget
的 itemClicked
信号,但我必须过滤掉所有其他小部件。
一定是我遗漏了什么。
编辑
根据我的阅读here,我可以将带有 setItem 的 QTableWidgetItem 和带有 setCellWidget 的 Button 小部件添加到同一个单元格。这对我来说似乎不太自然,但显然它有效(现在无法测试)。
我想我会那样做。添加按钮,在同一单元格上加上一个虚拟 QTableWidgetItem,以作为对行的引用传递。
这就是它的本意吗?
编辑 2
或者 QTableWidget
可能不是合适的 Widget,我应该使用 Layout
,按照建议 here。
如果我正确理解你的问题:
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())
似乎使用布局而不是 table 可能是最 "correct" 的答案,但这可能有其自身的困难,正如我对这个问题的回答所示:
- How to delete widgets from gridLayout
如果您想继续使用 table,比添加虚拟项目更简洁的解决方案是使用 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())