Минимальный SQLite в виде таблицы в PyQt5


Я только начал копаться в PyQt5 для того, чтобы написать небольшой GUI для редактирования лексической базе. Прежде чем я копать глубже в этом, я хотел бы иметь обратную связь о прогрессе. Каких-то конкретных точек, обратите внимание, перечислены ниже.

  • Я предвижу, используйте случаи, когда два окна и окно разного типа каждого показать различные части базовой таблицы, который является, почему я использовал QSortFilterProxyModel вместо фильтрации непосредственно в базе данных. Для моего производства данные, у меня около 50000 строк по 10 столбцов, значит ли это, что я должен изменить? Вижу этот вопрос
  • Внедрение деталей, что FilterDialog и FilterModel посмотрите, как будет меняться, но это сообщение разумно? Я получаю данные из пользовательского ввода (здесь QLineEdit в FilterDialog) в фильтр, прочитав содержимое входного виджет и писать атрибутом FilterModel прежде чем рассказать все, что модель изменилась, это то, что я должен делать или я должен сделать что-то еще?
  • Я действительно никогда не делал GUI-программированием, так что я не знаю, лучшие практики о том, как структурировать такие проекты – и я уверен, что я не знаю много других вещей. Как мне гарантировать, что этот проект может вырасти в нечто ремонтопригодны?

Код следующий, он принимает один аргумент командной строки, которая содержит путь к базе данных SQLite 3 со столом под названием “FormTable”.

import sys

from PyQt5.QtGui import *
from PyQt5.QtSql import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *


class FilterDialog(QDialog):
    def __init__(self, parent):
        super().__init__(parent)
        self.init_elements()

    def init_elements(self):
        cancelButton = QPushButton("Cancel")
        cancelButton.clicked.connect(self.reject)

        okButton = QPushButton("OK")
        okButton.setDefault(True)
        okButton.clicked.connect(self.accept)

        hbox = QHBoxLayout()
        hbox.addStretch(1)
        hbox.addWidget(cancelButton)
        hbox.addWidget(okButton)

        self.regex = QLineEdit()

        vbox = QVBoxLayout()
        vbox.addWidget(self.regex)
        vbox.addStretch(1)
        vbox.addLayout(hbox)

        self.setLayout(vbox)

        self.setWindowTitle('Filter Column')


class FilterModel(QSortFilterProxyModel):
    def __init__(self, filters):
        super().__init__()
        self.filters = filters

    def filterAcceptsRow(self, row, modelindex):
        for i, filter in enumerate(self.filters):
            if filter not in str(self.sourceModel().index(row, i).data()):
                return False
        return True


class WordListViewer(QMainWindow):
    def __init__(self, path):
        super().__init__()
        self.dbpath = path
        self.init_elements()

    def init_elements(self):
        exitAct = QAction(QIcon.fromTheme('exit'), 'Exit', self)
        exitAct.setShortcut('Ctrl+Q')
        exitAct.triggered.connect(qApp.quit)

        self.toolbar = self.addToolBar('Exit')
        self.toolbar.addAction(exitAct)

        self.statusBar().showMessage(self.dbpath)

        self.init_table()

        self.setCentralWidget(self.table)

        self.setGeometry(200, 100, 800, 600)
        self.setWindowTitle('FormTable viewer')

        self.show()

    def init_table(self):
        db = QSqlDatabase.addDatabase("QSQLITE")
        db.setDatabaseName(self.dbpath)
        if not db.open():
            raise Error("Could not open the database")

        self.model = QSqlTableModel(self, db)
        self.model.setTable("FormTable")
        self.model.EditStrategy(QSqlTableModel.OnManualSubmit)
        self.model.select()

        self.table = QTableView()
        self.table.setSortingEnabled(True)
        self.add_filter_functionality()
        self.table.show()

    def add_filter_functionality(self):
        def show_filter(logical_index):
            dialog = FilterDialog(self)
            if not dialog.exec_():
                return
            filter = dialog.regex.text()
            self.filters.filters[logical_index] = filter
            print(self.filters.filters)
            self.filters.modelReset.emit()

        self.filters = FilterModel([""] * self.model.columnCount())
        self.filters.setSourceModel(self.model)
        self.table.setModel(self.filters)
        self.filters.modelReset.emit()

        header = self.table.horizontalHeader()
        header.sectionDoubleClicked.connect(show_filter)


if __name__ == '__main__':
    app = QApplication(sys.argv)

    ex = WordListViewer(sys.argv[1])

    sys.exit(app.exec_())


1819
4
задан 23 февраля 2018 в 02:02 Источник Поделиться
Комментарии