两张表之间的Python Pyqt同步排序

时间:2018-07-04 00:46:30

标签: python python-2.7 pyqt4

我一直在寻找解决方案或示例,以将我的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,但我想避免这种情况,一种非常慢的排序方式。

1 个答案:

答案 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_())