Вернуть несколько столбцов в QComboBox - PullRequest
0 голосов
/ 23 февраля 2020

Я использую QComboBox в качестве делегата в таблице для установки столбца базовой таблицы sql. Для поля со списком устанавливается значение QProxyFilterModel, которое затем устанавливается для модели QTableView, поскольку информация в поле со списком существует в другой таблице sql.

Что я хотел бы сделать, это вместо этого вернуть несколько столбцов только один, когда поле со списком нажата. Я знаю, что путь к go - это конкатенация строк, но я не уверен, где это реализовать.

Поскольку я создал подкласс QTableView, я думаю, что мог бы создать пользовательскую роль, которая объединяет определенные столбцы c и возвращает их в модель Proxy, но я не знаю, как передать роль из прокси-модели. Должен ли я переопределить метод data в прокси-модели?

Другим очевидным выбором будет создание подкласса QComboBox и объединение нужных мне столбцов, но я считаю, что это худший вариант.

Есть идеи, как реализовать вышеизложенное?

1 Ответ

2 голосов
/ 23 февраля 2020

Что я понимаю, так это то, что QComboBox использует модель с несколькими столбцами, и вы хотите, чтобы во всплывающем окне отображалось 2 или более сцепленных столбцов, если так, самый простой вариант - установить sh пользовательский делегат для QComboBox.

В следующем примере столбцы 0 и 1 объединены, также существует QTableView, целью которого является показать, что модель состоит из нескольких столбцов:

from PyQt5 import QtGui, QtWidgets


class Delegate(QtWidgets.QStyledItemDelegate):
    def initStyleOption(self, option, index):
        super().initStyleOption(option, index)
        columns = (0, 1)
        text = "\t".join([index.sibling(index.row(), c).data() for c in columns])
        option.text = text


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    model = QtGui.QStandardItemModel(0, 2)
    for i in range(10):
        it1 = QtGui.QStandardItem("col1-{}".format(i))
        it2 = QtGui.QStandardItem("col2-{}".format(i))
        model.appendRow([it1, it2])

    combo = QtWidgets.QComboBox()
    delegate = Delegate(combo)
    combo.setItemDelegate(delegate)
    combo.setModel(model)

    view = QtWidgets.QTableView()
    view.setModel(model)

    w = QtWidgets.QWidget()
    lay = QtWidgets.QVBoxLayout(w)
    lay.addWidget(combo)
    lay.addWidget(view)
    w.resize(640, 480)
    w.show()

    sys.exit(app.exec_())
...