Запрос делает таблицу с QTableView и QSqlTableModel недоступной для редактирования - PullRequest
0 голосов
/ 25 марта 2019

Мне нужно выполнить запрос, чтобы ограничить строки, отображаемые в таблице. Я выбрал 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_())

1 Ответ

0 голосов
/ 26 марта 2019

@ eyllanesc Спасибо, что привели меня к использованию setFilter.

Я создал что-то, что, кажется, работает.Я преобразовал результаты запроса в строку.Затем я использовал эту строку для создания аргумента SQL, который будет использоваться с setFilter.

Elegant?Pythonic?Я не уверен.

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_())
...