【问题标题】:Query makes table with QTableView and QSqlTableModel uneditable查询使带有 QTableView 和 QSqlTableModel 的表不可编辑
【发布时间】:2019-03-25 02:11:51
【问题描述】:

我需要执行查询来限制表中显示的行。我为读写功能选择了 QTableView/QSqlTableModel。不幸的是,我的查询使表格无法编辑。

编辑:这不是我真正的程序。我将使用几个表和一个关系除法查询来确定要显示的行。我确实需要使用查询。

如何执行查询并保留读写功能?

import sys
from PyQt5.QtWidgets import QApplication, QTableView
from PyQt5.QtSql import QSqlDatabase, QSqlTableModel, QSqlQuery

def createDb():
    db = QSqlDatabase.addDatabase("QSQLITE")
    db.setDatabaseName("temp.db")
    if not db.open():
        print("Cannot establish a database connection.")
        return False
    query = QSqlQuery()
    query.exec_("DROP TABLE IF EXISTS customers")
    query.exec_("CREATE TABLE customers (customer_id INTEGER PRIMARY KEY NOT NULL, "
                "customer CHAR NOT NULL)")
    query.exec_("INSERT INTO customers (customer) VALUES ('Customer 1')")
    query.exec_("INSERT INTO customers (customer) VALUES ('Customer 2')")
    query.exec_("INSERT INTO customers (customer) VALUES ('Customer 3')")
    query.exec_("INSERT INTO customers (customer) VALUES ('Customer 4')")

    return True

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

        self.model = QSqlTableModel(self)
        self.model.setTable("customers")

        # This query results in a non-editable table.
        self.query = QSqlQuery("SELECT customer FROM customers WHERE customer_id = 2")
        self.model.setQuery(self.query)

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

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

【问题讨论】:

  • 你说:这不是我真正的程序。我将使用几个表和一个关系除法查询来确定要显示的行。我确实需要使用查询。,那么您显示的代码不是 MCVE,因此如果您需要帮助,您应该努力工作并提供它。
  • 我是编程新手。我认真对待 MCVE。我按照 MCVE 的建议创建了一个新程序。我的程序是最小的。它是完整的(它运行了。)它是可验证的(你可以在它运行时看到问题。)
  • 我已经为您提供了针对您提供的 mcve 的解决方案,它解决了它,但它并没有解决您的背景问题,因此表明您的 mcve 不验证你的后台错误,明白吗?

标签: python sqlite pyqt pyqt5 qsqltablemodel


【解决方案1】:

@eyllanesc 感谢您引导我使用 setFilter。

我创建了一些似乎可以工作的东西。我将查询结果转换为字符串。然后,我使用该字符串构造一个 SQL 参数以与 setFilter 一起使用。

优雅?蟒蛇?我不确定。

import sys
from PyQt5.QtWidgets import QApplication, QTableView
from PyQt5.QtSql import QSqlDatabase, QSqlTableModel, QSqlQuery

def createDb():
    db = QSqlDatabase.addDatabase("QSQLITE")
    db.setDatabaseName("temp.db")
    if not db.open():
        print("Cannot establish a database connection.")
        return False
    query = QSqlQuery()
    query.exec_("DROP TABLE IF EXISTS customers")
    query.exec_("CREATE TABLE customers (customer_id INTEGER PRIMARY KEY NOT NULL, "
                "customer CHAR NOT NULL)")
    query.exec_("INSERT INTO customers (customer) VALUES ('Customer 1')")
    query.exec_("INSERT INTO customers (customer) VALUES ('Customer 2')")
    query.exec_("INSERT INTO customers (customer) VALUES ('Customer 3')")
    query.exec_("INSERT INTO customers (customer) VALUES ('Customer 4')")

    return True

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

        self.model = QSqlTableModel(self)
        self.model.setTable("customers")

        self.query = QSqlQuery()
        self.query.exec("SELECT customer_id FROM customers WHERE customer_id IN (2,4)")

        # Convert query results to string.
        self.ls = list()
        while self.query.next():
            self.ls.append(self.query.value(0))
        self.ls_string = ','.join(map(str, self.ls))

        # Create setFiler argument.
        self.filter_criteria = "customer_id IN " + "(" + self.ls_string + ")"

        self.model.setFilter(self.filter_criteria)
        self.model.select()

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

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

【讨论】:

    猜你喜欢
    • 2012-11-21
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 2023-03-09
    • 2011-01-24
    相关资源
    最近更新 更多