我一直在寻找解决方案或示例,以将我的table1
与我的table2
的列排序同步,table1
的值与table2
相关联,行数相同,仅对table1
进行排序,但是table2
可能包含一些按钮。我找到了一个示例here,但不幸的是它确实在C++
中,但我没有。如何在将table1
的行与table2
保持同步的同时对table1
进行排序?我正在使用QTableWidget
。
____________ ______________
| table1 | | table2 |
|----------| |-------------|
|DDD | |data of DDD |
|----------| |-------------|
|AAAA | |data of AAAA |
|----------| |-------------|
|CCCC | |data of CCCC |
|__________| |_____________|
我使用两个表是因为我将table1
用作frozen
列。
我可以在table2
中使用隐藏列,该列的值可以用作id
或引用以重新同步table2
,但我想避免这种情况,一种非常慢的排序方式。
答案 0 :(得分:0)
一种可能的解决方案是将QTableViews与模型和QSortFilterProxyModel一起使用,因此在订购QTableView时将订购模型,这将通知另一个QTableView。
此解决方案节省资源,因为它只订购一个元素:模型。
from PyQt4 import QtCore, QtGui
class Widget(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
model = QtGui.QStandardItemModel()
proxy = QtGui.QSortFilterProxyModel()
proxy.setSourceModel(model)
table1 = QtGui.QTableView()
table1.setModel(proxy)
table1.setSortingEnabled(True)
table2 = QtGui.QTableView()
table2.setModel(proxy)
for i in range(100):
for j, w in enumerate([QtGui.QLineEdit, QtGui.QPushButton, QtGui.QCheckBox]):
text = "{}-{}".format(i,j)
it = QtGui.QStandardItem()
if j == 0:
it.setText(text)
model.setItem(i, j, it)
ix = model.indexFromItem(it)
widget = w(text)
table2.setIndexWidget(proxy.mapFromSource(ix), widget)
for i in range(1, proxy.columnCount()):
table1.setColumnHidden(i, True)
lay = QtGui.QVBoxLayout(self)
splitter = QtGui.QSplitter()
splitter.addWidget(table1)
splitter.addWidget(table2)
lay.addWidget(splitter)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())