0

我需要对使用 QSqlRelationalTableModel 和 QSqlRelationalDelegate 的 QTableView 中显示的记录进行排序。我希望对下拉列表和表格视图中的值进行排序。

我做了很多搜索,但没有找到将 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_())
4

1 回答 1

0

您可以在数据库中创建查询,而不是使用模型中的表。sql 语句选择表的所有条目,并有一个带有您希望排序的 order by 子句。将此查询放入模型中,而不是表中。

于 2021-11-28T10:29:46.223 回答