Python Pyqt Sync сортировка между двумя таблицами - PullRequest
0 голосов
/ 04 июля 2018

Я пытался найти решение или пример для синхронизации сортировки столбцов моего table1 с моими table2, table1 связанными значениями с table2, их число строк одинаково и только table1 будет отсортировано, но table2 может содержать некоторые кнопки. Я нашел пример здесь , но, к сожалению, он есть в 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 голосов
/ 04 июля 2018

Одним из возможных решений является использование 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_())
...