Используя QSqlTableModel и модель QTableView и макет представления, возможно ли иметь Столбец в моей таблице, чтобы скрыть строки - PullRequest
1 голос
/ 10 июня 2019

Используя QSqlTableModel и QTableView, возможно ли иметь Column (int) в моей таблице, и когда я ввожу «1» в строке в этом столбце, эта строка затем скрывается из таблицы, но не удаляется из БД,Я пытаюсь добиться временной ситуации, когда строка скрыта и еще не удалена из БД, и ее можно удерживать в этой позиции до тех пор, пока (если она все еще потребуется) скрытая строка не будет скрыта или (не нужна) строка будет удаленанавсегда из БД, что-то вроде отмененной ситуации.

Я посмотрел на sqlite3, чтобы посмотреть, есть ли способ пометить строку, чтобы она не отображалась при вызове qt, я также посмотрел на другие частиQT, но не так много информации в сети или каких-либо новых современных книг для изучения, я спрашиваю, если кто-нибудь знает об обходном пути или пробовал этот метод с другой функцией QT, я не знаю, сколько из этих функцийработа.

1 Ответ

1 голос
/ 11 июня 2019

Одним из возможных решений является использование QSortFilterProxyModel, чтобы скрыть строку:

import random
import string
from functools import partial

from PyQt5 import QtCore, QtWidgets, QtSql


def randomString(stringLength=10):
    """Generate a random string of fixed length """
    letters = string.ascii_lowercase
    return "".join(random.sample(letters, stringLength))


def createConnection():
    db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
    db.setDatabaseName(":memory:")
    if not db.open():
        QtSql.QMessageBox.critical(
            None,
            QtWidgets.qApp.tr("Cannot open database"),
            QtWidgets.qApp.tr(
                "Unable to establish a database connection.\n"
                "This example needs SQLite support. Please read "
                "the Qt SQL driver documentation for information "
                "how to build it.\n\n"
                "Click Cancel to exit."
            ),
            QtWidgets.QMessageBox.Cancel,
        )
        return False

    query = QtSql.QSqlQuery()
    query.exec_(
        """
        CREATE TABLE "mytable" (
            "id"    INTEGER PRIMARY KEY AUTOINCREMENT,
            "col1"  TEXT,
            "col2"  TEXT,
            "col3"  TEXT,
            "col4"  TEXT,
            "hide"  INTEGER
        );
    """
    )

    for _ in range(10):
        query = QtSql.QSqlQuery()
        query.prepare(
            """INSERT INTO mytable (col1, col2, col3, col4) VALUES(?, ?, ?, ?);"""
        )
        for _ in range(4):
            query.addBindValue(randomString())
        query.exec_()
    return True


FILTER_VALUE = 1


class HideProxyModel(QtCore.QSortFilterProxyModel):
    def filterAcceptsRow(self, sourceRow, sourceParent):
        col = self.sourceModel().fieldIndex("hide")
        ix = self.sourceModel().index(sourceRow, col, sourceParent)
        return ix.data() != FILTER_VALUE


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        button = QtWidgets.QPushButton("Hide", clicked=self.onClicked)
        self.m_view = QtWidgets.QTableView(
            selectionBehavior=QtWidgets.QAbstractItemView.SelectRows
        )
        self.m_model = QtSql.QSqlTableModel()
        self.m_model.setTable("mytable")
        self.m_model.select()

        self.m_proxy = HideProxyModel()
        self.m_proxy.setSourceModel(self.m_model)
        self.m_view.setModel(self.m_proxy)

        lay = QtWidgets.QVBoxLayout(self)
        lay.addWidget(button)
        lay.addWidget(self.m_view)

    @QtCore.pyqtSlot()
    def onClicked(self):
        rows = set(
            self.m_proxy.mapToSource(ix).row()
            for ix in self.m_view.selectedIndexes()
        )
        self.m_view.clearSelection()
        col = self.m_model.fieldIndex("hide")
        for row in rows:
            rec = self.m_model.record(row)
            rec.setValue(col, FILTER_VALUE)
            self.m_model.setRecord(row, rec)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    if not createConnection():
        sys.exit(-1)

    w = Widget()
    w.resize(640, 480)
    w.show()

    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...