Структура приложения в PySide(PyQt)
Создаю приложение используя PySide6 с CRUD операциями к базе Sqlite. Возник вопрос касаемо структуры приложения. Как правильно разбить и согласно какого паттерна приложение, в плане написани GUI, логики и работы с БД. Так сказать прошу сделать ревью кода
main.py
import sys
from PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtSql import QSqlTableModel
from ui_main import Ui_MainWindow
from connection import Data
class ExpenseTracker(QMainWindow):
def __init__(self):
super(ExpenseTracker, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.conn = Data()
self.view_data()
self.ui.btn_new_transaction.clicked.connect(self.conn.open_new_transaction)
self.ui.current_balance.setText(self.conn.total_balance())
def view_data(self):
self.model = QSqlTableModel(self)
self.model.setTable('expenses')
self.model.select()
self.ui.tableView.setModel(self.model)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = ExpenseTracker()
window.show()
sys.exit(app.exec())
connection.py
from PySide6 import QtWidgets, QtSql
from new_transaction import Ui_Dialog
class Data:
def __init__(self):
super(Data, self).__init__()
self.create_connection()
def create_connection(self):
db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('expense_db.db')
if not db.open():
QtWidgets.QMessageBox.critical(None, "Cannot open database",
"Click Cancel to exit.", QtWidgets.QMessageBox.Cancel)
return False
query = QtSql.QSqlQuery()
query.exec("""CREATE TABLE IF NOT EXISTS expenses (ID integer primary key AUTOINCREMENT,
Date VARCHAR(20),
Category VARCHAR(20),
Description VARCHAR(20),
Balance REAL,
Status VARCHAR(20))""")
return True
def open_new_transaction(self):
self.window = QtWidgets.QDialog()
self.ui = Ui_Dialog()
self.ui.setupUi(self.window)
self.window.show()
self.ui.btn_new_transaction.clicked.connect(self.add_new_transaction)
def add_new_transaction(self):
query = QtSql.QSqlQuery()
query.prepare("INSERT INTO expenses (Date, Category, Description, Balance, Status) VALUES (?, ?, ?, ?, ?)")
query.addBindValue(self.ui.dateEdit.text())
query.addBindValue(self.ui.cb_choose_category.currentText())
query.addBindValue(self.ui.le_description.text())
query.addBindValue(self.ui.le_balance.text())
query.addBindValue(self.ui.cb_status.currentText())
query.exec()
def total_balance(self):
query = QtSql.QSqlQuery()
query.exec("SELECT SUM(Balance) FROM expenses")
if query.next():
return str(query.value(0))
return -1
Источник: Stack Overflow на русском