下面的代码是一个工作的 QTableView,它使用 QAbstractTableModel,它使用 QSortFilterProxyModel。我已经设法弄清楚如何从选定行的single cell中获取数据,但不是一次获取整个行(例如作为字符串列表)。请问我可以尝试一些建议吗?
(我正在使用Python,但如果有人知道如何用另一种语言来做这件事,我会尝试翻译它......)
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
class CustomTableModel(QAbstractTableModel):
def __init__(self, cells=[[]], headers=[]):
super(CustomTableModel, self).__init__()
self._cells = cells
self._headers = headers
def data(self, index, role):
if index.isValid() and (role == Qt.DisplayRole):
return self._cells[index.row()][index.column()]
def rowCount(self, parent=None):
return len(self._cells)
def columnCount(self, parent=None):
return len(self._headers)
def flags(self, index):
return Qt.ItemIsEnabled | Qt.ItemIsSelectable
class CustomSortFilterProxyModel(QSortFilterProxyModel):
def __init__(self):
super(CustomSortFilterProxyModel, self).__init__()
def get_selected_row(self):
# Unsure what to put here??
pass
def table_clicked():
selected_indexes = table_view.selectionModel().selectedRows()
first_cell_selected = proxy_model.data(proxy_model.index(selected_indexes[0].row(), 0), Qt.DisplayRole).toString()
print(first_cell_selected)
# But rather than the above I would like to be able to do something like:
print(proxy_model.get_selected_row())
# and for it to print out everything in the row e.g. ['Cell 1', 'Cell 2', 'Cell 3']
app = QApplication(sys.argv)
table_data = [["Cell 1", "Cell 2", "Cell 3"], ["Cell 4", "Cell 5", "Cell 6"]]
table_headers = ["Header 1", "Header 2", "Header 3"]
model = CustomTableModel(table_data, table_headers)
proxy_model = CustomSortFilterProxyModel()
proxy_model.setDynamicSortFilter(True)
proxy_model.setSourceModel(model)
table_view = QTableView()
table_view.setModel(proxy_model)
table_view.setSelectionBehavior(QAbstractItemView.SelectRows)
table_view.setSelectionMode(QAbstractItemView.SingleSelection)
table_view.setSortingEnabled(True)
table_view.clicked.connect(table_clicked)
table_view.show()
sys.exit(app.exec_())
可能与如何从源模型获取索引行号
有关没有现成的方法来获取整行的数据。 您必须循环遍历现有列。
所以基本上,您可以改造现有的生产线:
first_cell_selected = proxy_model.data(proxy_model.index(selected_indexes[0].row(), 0), Qt.DisplayRole).toString()
进入列表理解以获取每个单元格的内容:
row = selected_indexes[0].row()
row_data = [proxy_model.index(row, col).data().toString()
for col in xrange(proxy_model.columnCount())]
顺便说一句:
QModelIndex
还提供了data()
方法,Qt.DisplayRole
是这里的默认角色。所以你可以简化
proxy_model.data(proxy_model.index(row, col), Qt.DisplayRole)
到
proxy_model.index(row, col).data()
这更容易阅读。