Как отсортировать QTableView и раскрывающийся список, который использует QSqlRelationalTableModel, QSqlRelationalDelegate, PyQt5 - PullRequest
0 голосов
/ 03 мая 2019

Мне нужно отсортировать записи, отображаемые в QTableView, который использует QSqlRelationalTableModel с QSqlRelationalDelegate. Я хочу, чтобы значения в выпадающем списке и табличном виде были отсортированы.

Я провел большой поиск, но не нашел примеров, использующих QSortFilterProxyModel с QSqlRelationalTableModel и QSqlRelationalDelegate. Мои попытки не обеспечили сортировку и отключили функцию чтения-записи, которая мне требуется от QSqlRelationalTableModel, а также отключили раскрывающийся список.

Можно ли отсортировать таблицу и раскрывающийся список?

import sys
from PyQt5.QtCore import QSortFilterProxyModel
from PyQt5.QtWidgets import QApplication, QDialog, QTableView, QHBoxLayout
from PyQt5.QtSql import (QSqlDatabase, QSqlTableModel, QSqlRelationalTableModel, 
                        QSqlQuery, QSqlRelation, QSqlRelationalDelegate)

def createDb():
    db = QSqlDatabase.addDatabase("QSQLITE")
    db.setDatabaseName(":memory:")
    if not db.open():
        print("Cannot establish a database connection.")
        return False

    query = QSqlQuery()
    query.exec("DROP TABLE IF EXISTS zoos")
    query.exec("CREATE TABLE zoos (id INTEGER PRIMARY KEY, zoo_name CHAR)")
    query.exec("INSERT INTO zoos (zoo_name) VALUES ('Animal Town')")
    query.exec("INSERT INTO zoos (zoo_name) VALUES ('Wild Things')")
    query.exec("INSERT INTO zoos (zoo_name) VALUES ('Creatures Everywhere')")

    query.exec("DROP TABLE IF EXISTS animals")
    query.exec("CREATE TABLE animals (id INTEGER PRIMARY KEY, animal_type CHAR)")
    query.exec("INSERT INTO animals(animal_type) VALUES('cougar')")
    query.exec("INSERT INTO animals(animal_type) VALUES('cobra')")
    query.exec("INSERT INTO animals(animal_type) VALUES('buzzard')")
    query.exec("INSERT INTO animals(animal_type) VALUES('anteater')")
    query.exec("INSERT INTO animals(animal_type) VALUES('baboon')")
    query.exec("INSERT INTO animals(animal_type) VALUES('aardvark')")
    query.exec("INSERT INTO animals(animal_type) VALUES('skunk')")
    query.exec("INSERT INTO animals(animal_type) VALUES('sheep')")
    query.exec("INSERT INTO animals(animal_type) VALUES('skink')")
    query.exec("INSERT INTO animals(animal_type) VALUES('ferret')")
    query.exec("INSERT INTO animals(animal_type) VALUES('swallow')")
    query.exec("INSERT INTO animals(animal_type) VALUES('swan')")
    query.exec("INSERT INTO animals(animal_type) VALUES('gecko')")
    query.exec("INSERT INTO animals(animal_type) VALUES('gerbil')")

    query.exec("DROP TABLE IF EXISTS residences")
    query.exec("CREATE TABLE residences (id INTEGER PRIMARY KEY, "
                "zoo_id INTEGER, animal_id INTEGER, "
                "FOREIGN KEY (zoo_id) REFERENCES zoo(id), "
                "FOREIGN KEY (animal_id) REFERENCES animals(id))")
    query.exec("INSERT INTO residences(zoo_id, animal_id) VALUES (1,1)")
    query.exec("INSERT INTO residences(zoo_id, animal_id) VALUES (1,2)")
    query.exec("INSERT INTO residences(zoo_id, animal_id) VALUES (1,3)")
    query.exec("INSERT INTO residences(zoo_id, animal_id) VALUES (1,4)")
    query.exec("INSERT INTO residences(zoo_id, animal_id) VALUES (2,5)")
    query.exec("INSERT INTO residences(zoo_id, animal_id) VALUES (2,6)")
    query.exec("INSERT INTO residences(zoo_id, animal_id) VALUES (2,7)")
    query.exec("INSERT INTO residences(zoo_id, animal_id) VALUES (2,8)")
    query.exec("INSERT INTO residences(zoo_id, animal_id) VALUES (3,9)")
    query.exec("INSERT INTO residences(zoo_id, animal_id) VALUES (3,10)")
    query.exec("INSERT INTO residences(zoo_id, animal_id) VALUES (3,11)")
    query.exec("INSERT INTO residences(zoo_id, animal_id) VALUES (3,12)")
    return True

class MainForm(QDialog):
    def __init__(self):
        super().__init__()

        self.zoosModel = QSqlTableModel(self)
        self.zoosModel.setTable("zoos")
        self.zoosModel.select()

        self.zoosView = QTableView()
        self.zoosView.setModel(self.zoosModel)
        self.zoosView.setColumnHidden(0, True)
        self.zoosView.selectionModel().currentRowChanged.connect(self.zoosRowChanged)

        self.residencesModel = QSqlRelationalTableModel()
        self.residencesModel.setTable("residences")
        # self.sort_animals = QSortFilterProxyModel(self)
        # self.sort_animals.setSourceModel(self.residencesModel)
        # self.sort_animals.sort(1)
        self.residencesModel.setRelation(2, QSqlRelation("animals", "id", "animal_type"))
        self.residencesModel.select()

        self.residencesView = QTableView()
        self.residencesView.setModel(self.residencesModel)
        # self.residencesView.setModel(self.sort_animals)

        self.residencesView.setItemDelegate(QSqlRelationalDelegate(self.residencesView))
        self.residencesView.setColumnHidden(0, True)
        self.residencesView.setColumnHidden(1, True)

        hbox = QHBoxLayout()
        hbox.addWidget(self.zoosView)
        hbox.addWidget(self.residencesView)
        self.setLayout(hbox)

    def zoosRowChanged(self, index):
        if index.isValid():
            record = self.zoosModel.record(index.row())
            id = int(record.value("id"))
            self.residencesModel.setFilter("zoo_id = {}".format(id))
        else:
            self.info_detailsModel.setFilter("zoo_id = -1")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    createDb()
    w = MainForm()
    w.show()
    sys.exit(app.exec_())
...