PyQt QTableView 获取跨越多列的单元格的起始索引?
PyQt QTableView get start index of cell spanning multiple columns?
我有一个带有单元格的 QTableView,我在其上设置了 1、2 和 4 的列跨度。我试图做到这一点,以便当一个单元格被 selected 时,它上面的所有单元格也是自动 selected,因此在下面的示例中单击 x
将 select 所有这些单元格:
我尝试通过遍历所有 selected 索引,然后 selecting 上面一行的单元格来做到这一点,但是看起来 selecting 一个跨越多个单元格columns 仅在您 select 最左边的索引时才有效。在我的示例中,selecting index(1,1) 或 index(0,2) 什么都不做。所以我需要能够 select 给定单元格跨越的任何索引的单元格。我怎样才能做到这一点?例如给定 index(0,2) 或 index(0,3) 这些都是列跨度为 4 的相同单元格,我如何以编程方式确定此单元格从 index(0,0)
开始
您必须在 QAbstractItemView::MultiSelection
中将其设置为 selection 模式,而对于 select 您必须使用 setSelection()
将属于的矩形传递给它QModelIndex
:
from PyQt5 import QtCore, QtGui, QtWidgets
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self._model = QtGui.QStandardItemModel(3, 8)
self._table = QtWidgets.QTableView(
selectionMode=QtWidgets.QAbstractItemView.MultiSelection,
clicked=self.on_clicked,
)
self._table.setModel(self._model)
self.fill_table()
self.setCentralWidget(self._table)
def fill_table(self):
data = [
('A', (0, 0), (1, 4)),
('B', (0, 4), (1, 4)),
('one', (1, 0), (1, 2)),
('two', (1, 2), (1, 2)),
('three', (1, 4), (1, 2)),
('four', (1, 6), (1, 2)),
('x', (2, 0), (1, 1)),
('y', (2, 1), (1, 1)),
('x', (2, 2), (1, 1)),
('y', (2, 3), (1, 1)),
('x', (2, 4), (1, 1)),
('y', (2, 5), (1, 1)),
('x', (2, 6), (1, 1)),
('y', (2, 7), (1, 1)),
]
for text, (r, c), (rs, cs) in data:
it = QtGui.QStandardItem(text)
self._model.setItem(r, c, it)
self._table.setSpan(r, c, rs, cs)
@QtCore.pyqtSlot('QModelIndex')
def on_clicked(self, ix):
self._table.clearSelection()
row, column = ix.row(), ix.column()
sm = self._table.selectionModel()
indexes = [ix]
for i in range(row):
ix = self._model.index(i, column)
indexes.append(ix)
for ix in indexes:
r = self._table.visualRect(ix)
self._table.setSelection(r, QtCore.QItemSelectionModel.Select)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
我有一个带有单元格的 QTableView,我在其上设置了 1、2 和 4 的列跨度。我试图做到这一点,以便当一个单元格被 selected 时,它上面的所有单元格也是自动 selected,因此在下面的示例中单击 x
将 select 所有这些单元格:
我尝试通过遍历所有 selected 索引,然后 selecting 上面一行的单元格来做到这一点,但是看起来 selecting 一个跨越多个单元格columns 仅在您 select 最左边的索引时才有效。在我的示例中,selecting index(1,1) 或 index(0,2) 什么都不做。所以我需要能够 select 给定单元格跨越的任何索引的单元格。我怎样才能做到这一点?例如给定 index(0,2) 或 index(0,3) 这些都是列跨度为 4 的相同单元格,我如何以编程方式确定此单元格从 index(0,0)
开始您必须在 QAbstractItemView::MultiSelection
中将其设置为 selection 模式,而对于 select 您必须使用 setSelection()
将属于的矩形传递给它QModelIndex
:
from PyQt5 import QtCore, QtGui, QtWidgets
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self._model = QtGui.QStandardItemModel(3, 8)
self._table = QtWidgets.QTableView(
selectionMode=QtWidgets.QAbstractItemView.MultiSelection,
clicked=self.on_clicked,
)
self._table.setModel(self._model)
self.fill_table()
self.setCentralWidget(self._table)
def fill_table(self):
data = [
('A', (0, 0), (1, 4)),
('B', (0, 4), (1, 4)),
('one', (1, 0), (1, 2)),
('two', (1, 2), (1, 2)),
('three', (1, 4), (1, 2)),
('four', (1, 6), (1, 2)),
('x', (2, 0), (1, 1)),
('y', (2, 1), (1, 1)),
('x', (2, 2), (1, 1)),
('y', (2, 3), (1, 1)),
('x', (2, 4), (1, 1)),
('y', (2, 5), (1, 1)),
('x', (2, 6), (1, 1)),
('y', (2, 7), (1, 1)),
]
for text, (r, c), (rs, cs) in data:
it = QtGui.QStandardItem(text)
self._model.setItem(r, c, it)
self._table.setSpan(r, c, rs, cs)
@QtCore.pyqtSlot('QModelIndex')
def on_clicked(self, ix):
self._table.clearSelection()
row, column = ix.row(), ix.column()
sm = self._table.selectionModel()
indexes = [ix]
for i in range(row):
ix = self._model.index(i, column)
indexes.append(ix)
for ix in indexes:
r = self._table.visualRect(ix)
self._table.setSelection(r, QtCore.QItemSelectionModel.Select)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())