├── .DS_Store ├── icons ├── call_received_white_24dp.svg ├── north_west_white_24dp.svg ├── delete_black_24dp.svg ├── delete_white_24dp.svg ├── edit_white_24dp.svg ├── list_white_24dp.svg ├── directions_car_white_24dp.svg ├── local_grocery_store_white_24dp.svg ├── post_add_white_24dp.svg └── sports_esports_white_24dp.svg ├── README.md ├── res-rs.qrc ├── connection.py ├── main.py ├── new_transaction.ui ├── new_transaction.py ├── res.py ├── ui_main.py └── ui_main.ui /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ithobbies/ExpenseTracker/HEAD/.DS_Store -------------------------------------------------------------------------------- /icons/call_received_white_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /icons/north_west_white_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /icons/delete_black_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /icons/delete_white_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ExpenseTracker - Трекер расходов 2 | Трекер расходов написанный на Python с использованием фреймворка PySide6 с хранением записей в БД SQLite 3 | 4 | ![Screenshot 2023-05-01 203531](https://user-images.githubusercontent.com/26361250/235498237-62d36f89-6f75-4d78-bc83-8dd0ab8b166f.jpg) 5 | -------------------------------------------------------------------------------- /icons/edit_white_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /icons/list_white_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /icons/directions_car_white_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /icons/local_grocery_store_white_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /icons/post_add_white_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /res-rs.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | icons/call_received_white_24dp.svg 4 | icons/delete_white_24dp.svg 5 | icons/directions_car_white_24dp.svg 6 | icons/edit_white_24dp.svg 7 | icons/list_white_24dp.svg 8 | icons/local_grocery_store_white_24dp.svg 9 | icons/north_west_white_24dp.svg 10 | icons/post_add_white_24dp.svg 11 | icons/sports_esports_white_24dp.svg 12 | 13 | 14 | -------------------------------------------------------------------------------- /icons/sports_esports_white_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /connection.py: -------------------------------------------------------------------------------- 1 | from PySide6 import QtWidgets, QtSql 2 | 3 | 4 | class Data: 5 | def __init__(self): 6 | super(Data, self).__init__() 7 | self.create_connection() 8 | 9 | def create_connection(self): 10 | db = QtSql.QSqlDatabase.addDatabase('QSQLITE') 11 | db.setDatabaseName('expense_db.db') 12 | 13 | if not db.open(): 14 | QtWidgets.QMessageBox.critical(None, "Cannot open database", 15 | "Click Cancel to exit.", QtWidgets.QMessageBox.Cancel) 16 | return False 17 | 18 | query = QtSql.QSqlQuery() 19 | query.exec("CREATE TABLE IF NOT EXISTS expenses (ID integer primary key AUTOINCREMENT, Date VARCHAR(20), " 20 | "Category VARCHAR(20), Description VARCHAR(20), Balance REAL, Status VARCHAR(20))") 21 | return True 22 | 23 | def execute_query_with_params(self, sql_query, query_values=None): 24 | query = QtSql.QSqlQuery() 25 | query.prepare(sql_query) 26 | 27 | if query_values is not None: 28 | for query_value in query_values: 29 | query.addBindValue(query_value) 30 | 31 | query.exec() 32 | 33 | return query 34 | 35 | def add_new_transaction_query(self, date, category, description, balance, status): 36 | sql_query = "INSERT INTO expenses (Date, Category, Description, Balance, Status) VALUES (?, ?, ?, ?, ?)" 37 | self.execute_query_with_params(sql_query, [date, category, description, balance, status]) 38 | 39 | def update_transaction_query(self, date, category, description, balance, status, id): 40 | sql_query = "UPDATE expenses SET Date=?, Category=?, Description=?, Balance=?, Status=? WHERE ID=?" 41 | self.execute_query_with_params(sql_query, [date, category, description, balance, status, id]) 42 | 43 | def delete_transaction_query(self, id): 44 | sql_query = "DELETE FROM expenses WHERE ID=?" 45 | self.execute_query_with_params(sql_query, [id]) 46 | 47 | def get_total(self, column, filter=None, value=None): 48 | sql_query = f"SELECT SUM({column}) FROM expenses" 49 | 50 | if filter is not None and value is not None: 51 | sql_query += f" WHERE {filter} = ?" 52 | 53 | query_values = [] 54 | 55 | if value is not None: 56 | query_values.append(value) 57 | 58 | query = self.execute_query_with_params(sql_query, query_values) 59 | 60 | if query.next(): 61 | return str(query.value(0)) + '$' 62 | 63 | return '0' 64 | 65 | def total_balance(self): 66 | return self.get_total(column="Balance") 67 | 68 | def total_income(self): 69 | return self.get_total(column="Balance", filter="Status", value="Income") 70 | 71 | def total_outcome(self): 72 | return self.get_total(column="Balance", filter="Status", value="Outcome") 73 | 74 | def total_groceries(self): 75 | return self.get_total(column="Balance", filter="Category", value="Grocery") 76 | 77 | def total_auto(self): 78 | return self.get_total(column="Balance", filter="Category", value="Auto") 79 | 80 | def total_entertainment(self): 81 | return self.get_total(column="Balance", filter="Category", value="Entertainment") 82 | 83 | def total_other(self): 84 | return self.get_total(column="Balance", filter="Category", value="Other") 85 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PySide6 import QtWidgets 4 | from PySide6.QtWidgets import QApplication, QMainWindow 5 | from PySide6.QtSql import QSqlTableModel 6 | 7 | from ui_main import Ui_MainWindow 8 | from new_transaction import Ui_Dialog 9 | from connection import Data 10 | 11 | 12 | class ExpenseTracker(QMainWindow): 13 | def __init__(self): 14 | super(ExpenseTracker, self).__init__() 15 | self.ui = Ui_MainWindow() 16 | self.ui.setupUi(self) 17 | self.conn = Data() 18 | self.view_data() 19 | self.reload_data() 20 | 21 | self.ui.btn_new_transaction.clicked.connect(self.open_new_transaction_window) 22 | self.ui.btn_edit_transaction.clicked.connect(self.open_new_transaction_window) 23 | self.ui.btn_delete_transaction.clicked.connect(self.delete_current_transaction) 24 | 25 | def reload_data(self): 26 | self.ui.current_balance.setText(self.conn.total_balance()) 27 | self.ui.income_balance.setText(self.conn.total_income()) 28 | self.ui.outcome_balance.setText(self.conn.total_outcome()) 29 | self.ui.total_groceries.setText(self.conn.total_groceries()) 30 | self.ui.total_auto.setText(self.conn.total_auto()) 31 | self.ui.total_entertainment.setText(self.conn.total_entertainment()) 32 | self.ui.total_other.setText(self.conn.total_other()) 33 | 34 | def view_data(self): 35 | self.model = QSqlTableModel(self) 36 | self.model.setTable('expenses') 37 | self.model.select() 38 | self.ui.tableView.setModel(self.model) 39 | 40 | def open_new_transaction_window(self): 41 | self.new_window = QtWidgets.QDialog() 42 | self.ui_window = Ui_Dialog() 43 | self.ui_window.setupUi(self.new_window) 44 | self.new_window.show() 45 | sender = self.sender() 46 | if sender.text() == "New transaction": 47 | self.ui_window.btn_new_transaction.clicked.connect(self.add_new_transaction) 48 | else: 49 | self.ui_window.btn_new_transaction.clicked.connect(self.edit_current_transaction) 50 | 51 | def add_new_transaction(self): 52 | date = self.ui_window.dateEdit.text() 53 | category = self.ui_window.cb_choose_category.currentText() 54 | description = self.ui_window.le_description.text() 55 | balance = self.ui_window.le_balance.text() 56 | status = self.ui_window.cb_status.currentText() 57 | 58 | self.conn.add_new_transaction_query(date, category, description, balance, status) 59 | self.view_data() 60 | self.reload_data() 61 | self.new_window.close() 62 | 63 | def edit_current_transaction(self): 64 | index = self.ui.tableView.selectedIndexes()[0] 65 | id = str(self.ui.tableView.model().data(index)) 66 | 67 | date = self.ui_window.dateEdit.text() 68 | category = self.ui_window.cb_choose_category.currentText() 69 | description = self.ui_window.le_description.text() 70 | balance = self.ui_window.le_balance.text() 71 | status = self.ui_window.cb_status.currentText() 72 | 73 | self.conn.update_transaction_query(date, category, description, balance, status, id) 74 | self.view_data() 75 | self.reload_data() 76 | self.new_window.close() 77 | 78 | def delete_current_transaction(self): 79 | index = self.ui.tableView.selectedIndexes()[0] 80 | id = str(self.ui.tableView.model().data(index)) 81 | 82 | self.conn.delete_transaction_query(id) 83 | self.view_data() 84 | self.reload_data() 85 | 86 | 87 | if __name__ == "__main__": 88 | app = QApplication(sys.argv) 89 | window = ExpenseTracker() 90 | window.show() 91 | 92 | sys.exit(app.exec()) 93 | -------------------------------------------------------------------------------- /new_transaction.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | Dialog 4 | 5 | 6 | 7 | 0 8 | 0 9 | 300 10 | 331 11 | 12 | 13 | 14 | Dialog 15 | 16 | 17 | font-family: Noto Sans SC; 18 | background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:0, y2:0, stop:0 rgba(81, 0, 135, 255), stop:0.427447 rgba(41, 61, 132, 235), stop:1 rgba(155, 79, 165, 255)); 19 | 20 | 21 | 22 | 23 | 24 | background-color: rgba(255, 255, 255, 30); 25 | border: 1px solid rgba(255,255,255,40); 26 | border-radius: 7px; 27 | 28 | 29 | QFrame::NoFrame 30 | 31 | 32 | QFrame::Raised 33 | 34 | 35 | 36 | -1 37 | 38 | 39 | 12 40 | 41 | 42 | 12 43 | 44 | 45 | 12 46 | 47 | 48 | 12 49 | 50 | 51 | 52 | 53 | 54 | Noto Sans SC 55 | 20 56 | true 57 | 58 | 59 | 60 | color: white; 61 | font-weight: bold; 62 | font-size: 20pt; 63 | background-color: none; 64 | border: none; 65 | 66 | 67 | New transaction 68 | 69 | 70 | Qt::AlignCenter 71 | 72 | 73 | 74 | 75 | 76 | 77 | QComboBox { 78 | font-size: 16pt; 79 | color: white; 80 | } 81 | 82 | QComboBox:item { 83 | color: black; 84 | } 85 | 86 | 87 | -1 88 | 89 | 90 | Choose category 91 | 92 | 93 | 94 | Work 95 | 96 | 97 | 98 | 99 | Auto 100 | 101 | 102 | 103 | 104 | Other 105 | 106 | 107 | 108 | 109 | Grocery 110 | 111 | 112 | 113 | 114 | Entertainment 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | font-size: 16pt; 123 | color: white; 124 | padding-left: 10px; 125 | 126 | 127 | Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 128 | 129 | 130 | QAbstractSpinBox::NoButtons 131 | 132 | 133 | 134 | 22 135 | 0 136 | 0 137 | 2022 138 | 12 139 | 31 140 | 141 | 142 | 143 | 0 144 | 145 | 146 | 147 | 148 | 149 | 150 | font-size: 16pt; 151 | color: white; 152 | padding-left: 10px; 153 | 154 | 155 | Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 156 | 157 | 158 | Description 159 | 160 | 161 | 162 | 163 | 164 | 165 | font-size: 16pt; 166 | color: white; 167 | padding-left: 10px; 168 | 169 | 170 | Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 171 | 172 | 173 | Balance 174 | 175 | 176 | 177 | 178 | 179 | 180 | QComboBox { 181 | font-size: 16pt; 182 | color: white; 183 | } 184 | 185 | QComboBox:item { 186 | color: black; 187 | } 188 | 189 | 190 | Choose status 191 | 192 | 193 | 194 | Income 195 | 196 | 197 | 198 | 199 | Outcome 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 230 209 | 50 210 | 211 | 212 | 213 | 214 | Noto Sans SC 215 | true 216 | 217 | 218 | 219 | QPushButton{ 220 | color: rgb(255, 255, 255); 221 | background-color:rgba(255,255,255,30); 222 | border: 1px solid rgba(255,255,255,40); 223 | border-radius:7px; 224 | width: 230; 225 | height: 50; 226 | } 227 | QPushButton:hover{ 228 | background-color:rgba(255,255,255,30); 229 | } 230 | QPushButton:pressed{ 231 | background-color:rgba(255,255,255,70); 232 | } 233 | 234 | 235 | Save new transaction 236 | 237 | 238 | 239 | :/icons/icons/post_add_white_24dp.svg:/icons/icons/post_add_white_24dp.svg 240 | 241 | 242 | 243 | 24 244 | 24 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | -------------------------------------------------------------------------------- /new_transaction.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ################################################################################ 4 | ## Form generated from reading UI file 'new_transaction.ui' 5 | ## 6 | ## Created by: Qt User Interface Compiler version 6.4.2 7 | ## 8 | ## WARNING! All changes made in this file will be lost when recompiling UI file! 9 | ################################################################################ 10 | 11 | from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, 12 | QMetaObject, QObject, QPoint, QRect, 13 | QSize, QTime, QUrl, Qt) 14 | from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, 15 | QFont, QFontDatabase, QGradient, QIcon, 16 | QImage, QKeySequence, QLinearGradient, QPainter, 17 | QPalette, QPixmap, QRadialGradient, QTransform) 18 | from PySide6.QtWidgets import (QAbstractSpinBox, QApplication, QComboBox, QDateEdit, 19 | QDialog, QFrame, QLabel, QLineEdit, 20 | QPushButton, QSizePolicy, QVBoxLayout, QWidget) 21 | import res 22 | 23 | class Ui_Dialog(object): 24 | def setupUi(self, Dialog): 25 | if not Dialog.objectName(): 26 | Dialog.setObjectName(u"Dialog") 27 | Dialog.resize(300, 331) 28 | Dialog.setStyleSheet(u"font-family: Noto Sans SC;\n" 29 | "background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:0, y2:0, stop:0 rgba(81, 0, 135, 255), stop:0.427447 rgba(41, 61, 132, 235), stop:1 rgba(155, 79, 165, 255));") 30 | self.verticalLayout = QVBoxLayout(Dialog) 31 | self.verticalLayout.setObjectName(u"verticalLayout") 32 | self.new_transaction = QFrame(Dialog) 33 | self.new_transaction.setObjectName(u"new_transaction") 34 | self.new_transaction.setStyleSheet(u"background-color: rgba(255, 255, 255, 30); \n" 35 | "border: 1px solid rgba(255,255,255,40);\n" 36 | "border-radius: 7px;") 37 | self.new_transaction.setFrameShape(QFrame.NoFrame) 38 | self.new_transaction.setFrameShadow(QFrame.Raised) 39 | self.verticalLayout_21 = QVBoxLayout(self.new_transaction) 40 | #ifndef Q_OS_MAC 41 | self.verticalLayout_21.setSpacing(-1) 42 | #endif 43 | self.verticalLayout_21.setObjectName(u"verticalLayout_21") 44 | self.verticalLayout_21.setContentsMargins(12, 12, 12, 12) 45 | self.lbl_new_transaction = QLabel(self.new_transaction) 46 | self.lbl_new_transaction.setObjectName(u"lbl_new_transaction") 47 | font = QFont() 48 | font.setFamilies([u"Noto Sans SC"]) 49 | font.setPointSize(20) 50 | font.setBold(True) 51 | self.lbl_new_transaction.setFont(font) 52 | self.lbl_new_transaction.setStyleSheet(u"color: white;\n" 53 | "font-weight: bold;\n" 54 | "font-size: 20pt;\n" 55 | "background-color: none;\n" 56 | "border: none;") 57 | self.lbl_new_transaction.setAlignment(Qt.AlignCenter) 58 | 59 | self.verticalLayout_21.addWidget(self.lbl_new_transaction) 60 | 61 | self.cb_choose_category = QComboBox(self.new_transaction) 62 | self.cb_choose_category.addItem("") 63 | self.cb_choose_category.addItem("") 64 | self.cb_choose_category.addItem("") 65 | self.cb_choose_category.addItem("") 66 | self.cb_choose_category.addItem("") 67 | self.cb_choose_category.setObjectName(u"cb_choose_category") 68 | self.cb_choose_category.setStyleSheet(u"QComboBox {\n" 69 | "font-size: 16pt;\n" 70 | "color: white;\n" 71 | "}\n" 72 | "\n" 73 | "QComboBox:item {\n" 74 | " color: black;\n" 75 | "}") 76 | 77 | self.verticalLayout_21.addWidget(self.cb_choose_category) 78 | 79 | self.dateEdit = QDateEdit(self.new_transaction) 80 | self.dateEdit.setObjectName(u"dateEdit") 81 | self.dateEdit.setStyleSheet(u"font-size: 16pt;\n" 82 | "color: white;\n" 83 | "padding-left: 10px;") 84 | self.dateEdit.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignVCenter) 85 | self.dateEdit.setButtonSymbols(QAbstractSpinBox.NoButtons) 86 | self.dateEdit.setDateTime(QDateTime(QDate(2022, 12, 31), QTime(22, 0, 0))) 87 | self.dateEdit.setCurrentSectionIndex(0) 88 | 89 | self.verticalLayout_21.addWidget(self.dateEdit) 90 | 91 | self.le_description = QLineEdit(self.new_transaction) 92 | self.le_description.setObjectName(u"le_description") 93 | self.le_description.setStyleSheet(u"font-size: 16pt;\n" 94 | "color: white;\n" 95 | "padding-left: 10px;") 96 | self.le_description.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignVCenter) 97 | 98 | self.verticalLayout_21.addWidget(self.le_description) 99 | 100 | self.le_balance = QLineEdit(self.new_transaction) 101 | self.le_balance.setObjectName(u"le_balance") 102 | self.le_balance.setStyleSheet(u"font-size: 16pt;\n" 103 | "color: white;\n" 104 | "padding-left: 10px;") 105 | self.le_balance.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignVCenter) 106 | 107 | self.verticalLayout_21.addWidget(self.le_balance) 108 | 109 | self.cb_status = QComboBox(self.new_transaction) 110 | self.cb_status.addItem("") 111 | self.cb_status.addItem("") 112 | self.cb_status.setObjectName(u"cb_status") 113 | self.cb_status.setStyleSheet(u"QComboBox {\n" 114 | "font-size: 16pt;\n" 115 | "color: white;\n" 116 | "}\n" 117 | "\n" 118 | "QComboBox:item {\n" 119 | " color: black;\n" 120 | "}") 121 | 122 | self.verticalLayout_21.addWidget(self.cb_status) 123 | 124 | self.btn_new_transaction = QPushButton(self.new_transaction) 125 | self.btn_new_transaction.setObjectName(u"btn_new_transaction") 126 | self.btn_new_transaction.setMinimumSize(QSize(230, 50)) 127 | font1 = QFont() 128 | font1.setFamilies([u"Noto Sans SC"]) 129 | font1.setBold(True) 130 | self.btn_new_transaction.setFont(font1) 131 | self.btn_new_transaction.setStyleSheet(u"QPushButton{\n" 132 | " color: rgb(255, 255, 255);\n" 133 | " background-color:rgba(255,255,255,30);\n" 134 | " border: 1px solid rgba(255,255,255,40);\n" 135 | " border-radius:7px;\n" 136 | "width: 230;\n" 137 | "height: 50;\n" 138 | "}\n" 139 | "QPushButton:hover{\n" 140 | "background-color:rgba(255,255,255,30);\n" 141 | "}\n" 142 | "QPushButton:pressed{\n" 143 | "background-color:rgba(255,255,255,70);\n" 144 | "}") 145 | icon = QIcon() 146 | icon.addFile(u":/icons/icons/post_add_white_24dp.svg", QSize(), QIcon.Normal, QIcon.Off) 147 | self.btn_new_transaction.setIcon(icon) 148 | self.btn_new_transaction.setIconSize(QSize(24, 24)) 149 | 150 | self.verticalLayout_21.addWidget(self.btn_new_transaction) 151 | 152 | 153 | self.verticalLayout.addWidget(self.new_transaction) 154 | 155 | 156 | self.retranslateUi(Dialog) 157 | 158 | self.cb_choose_category.setCurrentIndex(-1) 159 | 160 | 161 | QMetaObject.connectSlotsByName(Dialog) 162 | # setupUi 163 | 164 | def retranslateUi(self, Dialog): 165 | Dialog.setWindowTitle(QCoreApplication.translate("Dialog", u"Dialog", None)) 166 | self.lbl_new_transaction.setText(QCoreApplication.translate("Dialog", u"New transaction", None)) 167 | self.cb_choose_category.setItemText(0, QCoreApplication.translate("Dialog", u"Work", None)) 168 | self.cb_choose_category.setItemText(1, QCoreApplication.translate("Dialog", u"Auto", None)) 169 | self.cb_choose_category.setItemText(2, QCoreApplication.translate("Dialog", u"Other", None)) 170 | self.cb_choose_category.setItemText(3, QCoreApplication.translate("Dialog", u"Grocery", None)) 171 | self.cb_choose_category.setItemText(4, QCoreApplication.translate("Dialog", u"Entertainment", None)) 172 | 173 | self.cb_choose_category.setPlaceholderText(QCoreApplication.translate("Dialog", u"Choose category", None)) 174 | self.le_description.setPlaceholderText(QCoreApplication.translate("Dialog", u"Description", None)) 175 | self.le_balance.setPlaceholderText(QCoreApplication.translate("Dialog", u"Balance", None)) 176 | self.cb_status.setItemText(0, QCoreApplication.translate("Dialog", u"Income", None)) 177 | self.cb_status.setItemText(1, QCoreApplication.translate("Dialog", u"Outcome", None)) 178 | 179 | self.cb_status.setPlaceholderText(QCoreApplication.translate("Dialog", u"Choose status", None)) 180 | self.btn_new_transaction.setText(QCoreApplication.translate("Dialog", u"Save transaction", None)) 181 | # retranslateUi 182 | 183 | -------------------------------------------------------------------------------- /res.py: -------------------------------------------------------------------------------- 1 | # Resource object code (Python 3) 2 | # Created by: object code 3 | # Created by: The Resource Compiler for Qt version 6.4.2 4 | # WARNING! All changes made in this file will be lost! 5 | 6 | from PySide6 import QtCore 7 | 8 | qt_resource_data = b"\ 9 | \x00\x00\x00\xfc\ 10 | <\ 11 | svg xmlns=\x22http:\ 12 | //www.w3.org/200\ 13 | 0/svg\x22 height=\x222\ 14 | 4px\x22 viewBox=\x220 \ 15 | 0 24 24\x22 width=\x22\ 16 | 24px\x22 fill=\x22#FFF\ 17 | FFF\x22>\ 27 | \x00\x00\x03q\ 28 | <\ 29 | svg xmlns=\x22http:\ 30 | //www.w3.org/200\ 31 | 0/svg\x22 enable-ba\ 32 | ckground=\x22new 0 \ 33 | 0 24 24\x22 height=\ 34 | \x2224px\x22 viewBox=\x22\ 35 | 0 0 24 24\x22 width\ 36 | =\x2224px\x22 fill=\x22#F\ 37 | FFFFF\x22>\ 84 | \ 85 | \x00\x00\x00\xd2\ 86 | <\ 87 | svg xmlns=\x22http:\ 88 | //www.w3.org/200\ 89 | 0/svg\x22 height=\x222\ 90 | 4px\x22 viewBox=\x220 \ 91 | 0 24 24\x22 width=\x22\ 92 | 24px\x22 fill=\x22#FFF\ 93 | FFF\x22>\ 101 | \x00\x00\x02\x03\ 102 | <\ 103 | svg xmlns=\x22http:\ 104 | //www.w3.org/200\ 105 | 0/svg\x22 enable-ba\ 106 | ckground=\x22new 0 \ 107 | 0 24 24\x22 height=\ 108 | \x2224px\x22 viewBox=\x22\ 109 | 0 0 24 24\x22 width\ 110 | =\x2224px\x22 fill=\x22#F\ 111 | FFFFF\x22><\ 115 | g>\ 136 | \x00\x00\x01o\ 137 | <\ 138 | svg xmlns=\x22http:\ 139 | //www.w3.org/200\ 140 | 0/svg\x22 height=\x222\ 141 | 4px\x22 viewBox=\x220 \ 142 | 0 24 24\x22 width=\x22\ 143 | 24px\x22 fill=\x22#FFF\ 144 | FFF\x22>\ 161 | \x00\x00\x01\xca\ 162 | <\ 163 | svg xmlns=\x22http:\ 164 | //www.w3.org/200\ 165 | 0/svg\x22 height=\x222\ 166 | 4px\x22 viewBox=\x220 \ 167 | 0 24 24\x22 width=\x22\ 168 | 24px\x22 fill=\x22#FFF\ 169 | FFF\x22>\ 192 | \x00\x00\x01{\ 193 | <\ 194 | svg xmlns=\x22http:\ 195 | //www.w3.org/200\ 196 | 0/svg\x22 height=\x222\ 197 | 4px\x22 viewBox=\x220 \ 198 | 0 24 24\x22 width=\x22\ 199 | 24px\x22 fill=\x22#FFF\ 200 | FFF\x22><\ 203 | path d=\x22M0 0h24v\ 204 | 24H0V0z\x22 opacity\ 205 | =\x22.87\x22/>\ 218 | \x00\x00\x01\xbf\ 219 | <\ 220 | svg xmlns=\x22http:\ 221 | //www.w3.org/200\ 222 | 0/svg\x22 height=\x222\ 223 | 4px\x22 viewBox=\x220 \ 224 | 0 24 24\x22 width=\x22\ 225 | 24px\x22 fill=\x22#FFF\ 226 | FFF\x22><\ 243 | circle cx=\x227.5\x22 \ 244 | cy=\x2214.5\x22 r=\x221.5\ 245 | \x22/>\ 248 | \x00\x00\x00\xf4\ 249 | <\ 250 | svg xmlns=\x22http:\ 251 | //www.w3.org/200\ 252 | 0/svg\x22 enable-ba\ 253 | ckground=\x22new 0 \ 254 | 0 24 24\x22 height=\ 255 | \x2224px\x22 viewBox=\x22\ 256 | 0 0 24 24\x22 width\ 257 | =\x2224px\x22 fill=\x22#F\ 258 | FFFFF\x22>\ 266 | " 267 | 268 | qt_resource_name = b"\ 269 | \x00\x05\ 270 | \x00o\xa6S\ 271 | \x00i\ 272 | \x00c\x00o\x00n\x00s\ 273 | \x00\x15\ 274 | \x0f\x8f\xb3\x07\ 275 | \x00d\ 276 | \x00e\x00l\x00e\x00t\x00e\x00_\x00w\x00h\x00i\x00t\x00e\x00_\x002\x004\x00d\x00p\ 277 | \x00.\x00s\x00v\x00g\ 278 | \x00\x1d\ 279 | \x05\xc1_\x07\ 280 | \x00s\ 281 | \x00p\x00o\x00r\x00t\x00s\x00_\x00e\x00s\x00p\x00o\x00r\x00t\x00s\x00_\x00w\x00h\ 282 | \x00i\x00t\x00e\x00_\x002\x004\x00d\x00p\x00.\x00s\x00v\x00g\ 283 | \x00\x1c\ 284 | \x04\xa4\xea'\ 285 | \x00c\ 286 | \x00a\x00l\x00l\x00_\x00r\x00e\x00c\x00e\x00i\x00v\x00e\x00d\x00_\x00w\x00h\x00i\ 287 | \x00t\x00e\x00_\x002\x004\x00d\x00p\x00.\x00s\x00v\x00g\ 288 | \x00\x17\ 289 | \x02\xf7\xf0'\ 290 | \x00p\ 291 | \x00o\x00s\x00t\x00_\x00a\x00d\x00d\x00_\x00w\x00h\x00i\x00t\x00e\x00_\x002\x004\ 292 | \x00d\x00p\x00.\x00s\x00v\x00g\ 293 | \x00\x13\ 294 | \x0ad\xa6G\ 295 | \x00e\ 296 | \x00d\x00i\x00t\x00_\x00w\x00h\x00i\x00t\x00e\x00_\x002\x004\x00d\x00p\x00.\x00s\ 297 | \x00v\x00g\ 298 | \x00\x22\ 299 | \x05\xf3v\xc7\ 300 | \x00l\ 301 | \x00o\x00c\x00a\x00l\x00_\x00g\x00r\x00o\x00c\x00e\x00r\x00y\x00_\x00s\x00t\x00o\ 302 | \x00r\x00e\x00_\x00w\x00h\x00i\x00t\x00e\x00_\x002\x004\x00d\x00p\x00.\x00s\x00v\ 303 | \x00g\ 304 | \x00\x13\ 305 | \x08\x8c\xa6\x87\ 306 | \x00l\ 307 | \x00i\x00s\x00t\x00_\x00w\x00h\x00i\x00t\x00e\x00_\x002\x004\x00d\x00p\x00.\x00s\ 308 | \x00v\x00g\ 309 | \x00\x1d\ 310 | \x01\x14\x82\x07\ 311 | \x00d\ 312 | \x00i\x00r\x00e\x00c\x00t\x00i\x00o\x00n\x00s\x00_\x00c\x00a\x00r\x00_\x00w\x00h\ 313 | \x00i\x00t\x00e\x00_\x002\x004\x00d\x00p\x00.\x00s\x00v\x00g\ 314 | \x00\x19\ 315 | \x08\xc1\xd1'\ 316 | \x00n\ 317 | \x00o\x00r\x00t\x00h\x00_\x00w\x00e\x00s\x00t\x00_\x00w\x00h\x00i\x00t\x00e\x00_\ 318 | \x002\x004\x00d\x00p\x00.\x00s\x00v\x00g\ 319 | " 320 | 321 | qt_resource_struct = b"\ 322 | \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ 323 | \x00\x00\x00\x00\x00\x00\x00\x00\ 324 | \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ 325 | \x00\x00\x00\x00\x00\x00\x00\x00\ 326 | \x00\x00\x00\x00\x00\x02\x00\x00\x00\x09\x00\x00\x00\x03\ 327 | \x00\x00\x00\x00\x00\x00\x00\x00\ 328 | \x00\x00\x01\x94\x00\x00\x00\x00\x00\x01\x00\x00\x0c\x12\ 329 | \x00\x00\x01\x85\xb1=nv\ 330 | \x00\x00\x00\xbe\x00\x00\x00\x00\x00\x01\x00\x00\x05K\ 331 | \x00\x00\x01\x85\xb0\xd6;\xf0\ 332 | \x00\x00\x00\x80\x00\x00\x00\x00\x00\x01\x00\x00\x04u\ 333 | \x00\x00\x01\x85\xb0\xfd\xf5{\ 334 | \x00\x00\x00@\x00\x00\x00\x00\x00\x01\x00\x00\x01\x00\ 335 | \x00\x00\x01\x85\xb1=6\x12\ 336 | \x00\x00\x01\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x08\xc5\ 337 | \x00\x00\x01\x85\xb1=\xa13\ 338 | \x00\x00\x01h\x00\x00\x00\x00\x00\x01\x00\x00\x0a\x93\ 339 | \x00\x00\x01\x85\xb1?\x0d\xe4\ 340 | \x00\x00\x01\xd4\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xd5\ 341 | \x00\x00\x01\x85\xb0\xfd\xdde\ 342 | \x00\x00\x00\xf2\x00\x00\x00\x00\x00\x01\x00\x00\x07R\ 343 | \x00\x00\x01\x85\xb0\xda8\xb5\ 344 | \x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ 345 | \x00\x00\x01\x85\xb0\xd9`\xaa\ 346 | " 347 | 348 | def qInitResources(): 349 | QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) 350 | 351 | def qCleanupResources(): 352 | QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) 353 | 354 | qInitResources() 355 | -------------------------------------------------------------------------------- /ui_main.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ################################################################################ 4 | ## Form generated from reading UI file 'ui_main.ui' 5 | ## 6 | ## Created by: Qt User Interface Compiler version 6.4.2 7 | ## 8 | ## WARNING! All changes made in this file will be lost when recompiling UI file! 9 | ################################################################################ 10 | 11 | from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, 12 | QMetaObject, QObject, QPoint, QRect, 13 | QSize, QTime, QUrl, Qt) 14 | from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, 15 | QFont, QFontDatabase, QGradient, QIcon, 16 | QImage, QKeySequence, QLinearGradient, QPainter, 17 | QPalette, QPixmap, QRadialGradient, QTransform) 18 | from PySide6.QtWidgets import (QApplication, QFrame, QHBoxLayout, QHeaderView, 19 | QLabel, QMainWindow, QPushButton, QSizePolicy, 20 | QTableView, QVBoxLayout, QWidget) 21 | import res 22 | 23 | class Ui_MainWindow(object): 24 | def setupUi(self, MainWindow): 25 | if not MainWindow.objectName(): 26 | MainWindow.setObjectName(u"MainWindow") 27 | MainWindow.resize(803, 673) 28 | MainWindow.setMinimumSize(QSize(800, 600)) 29 | font = QFont() 30 | font.setFamilies([u"Noto Sans SC"]) 31 | MainWindow.setFont(font) 32 | MainWindow.setStyleSheet(u"font-family: Noto Sans SC;\n" 33 | "background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:0, y2:0, stop:0 rgba(81, 0, 135, 255), stop:0.427447 rgba(41, 61, 132, 235), stop:1 rgba(155, 79, 165, 255));\n" 34 | "") 35 | self.centralwidget = QWidget(MainWindow) 36 | self.centralwidget.setObjectName(u"centralwidget") 37 | self.verticalLayout_2 = QVBoxLayout(self.centralwidget) 38 | self.verticalLayout_2.setObjectName(u"verticalLayout_2") 39 | self.horizontalLayout_2 = QHBoxLayout() 40 | self.horizontalLayout_2.setObjectName(u"horizontalLayout_2") 41 | self.balances_frame = QFrame(self.centralwidget) 42 | self.balances_frame.setObjectName(u"balances_frame") 43 | self.balances_frame.setStyleSheet(u"background-color: rgba(255, 255, 255, 30); \n" 44 | "border: 1px solid rgba(255,255,255,40);\n" 45 | "border-radius: 7px;") 46 | self.balances_frame.setFrameShape(QFrame.NoFrame) 47 | self.balances_frame.setFrameShadow(QFrame.Raised) 48 | self.verticalLayout_21 = QVBoxLayout(self.balances_frame) 49 | self.verticalLayout_21.setSpacing(0) 50 | self.verticalLayout_21.setObjectName(u"verticalLayout_21") 51 | self.verticalLayout_21.setContentsMargins(12, 12, 12, 12) 52 | self.lbl_current_balance = QLabel(self.balances_frame) 53 | self.lbl_current_balance.setObjectName(u"lbl_current_balance") 54 | font1 = QFont() 55 | font1.setFamilies([u"Noto Sans SC"]) 56 | font1.setPointSize(20) 57 | font1.setBold(True) 58 | self.lbl_current_balance.setFont(font1) 59 | self.lbl_current_balance.setStyleSheet(u"color: white;\n" 60 | "font-weight: bold;\n" 61 | "font-size: 20pt;\n" 62 | "background-color: none;\n" 63 | "border: none;") 64 | 65 | self.verticalLayout_21.addWidget(self.lbl_current_balance) 66 | 67 | self.current_balance = QLabel(self.balances_frame) 68 | self.current_balance.setObjectName(u"current_balance") 69 | font2 = QFont() 70 | font2.setFamilies([u"Noto Sans SC"]) 71 | font2.setPointSize(30) 72 | font2.setBold(False) 73 | font2.setItalic(False) 74 | font2.setKerning(True) 75 | self.current_balance.setFont(font2) 76 | self.current_balance.setStyleSheet(u"color: white;\n" 77 | "font-size: 30pt;\n" 78 | "background-color: none;\n" 79 | "border: none;") 80 | self.current_balance.setLineWidth(0) 81 | 82 | self.verticalLayout_21.addWidget(self.current_balance) 83 | 84 | self.horizontalLayout_9 = QHBoxLayout() 85 | self.horizontalLayout_9.setObjectName(u"horizontalLayout_9") 86 | self.lbl_arrow_top = QLabel(self.balances_frame) 87 | self.lbl_arrow_top.setObjectName(u"lbl_arrow_top") 88 | self.lbl_arrow_top.setMaximumSize(QSize(24, 16777215)) 89 | font3 = QFont() 90 | font3.setFamilies([u"Noto Sans SC"]) 91 | font3.setPointSize(16) 92 | font3.setBold(True) 93 | self.lbl_arrow_top.setFont(font3) 94 | self.lbl_arrow_top.setStyleSheet(u"color: white;\n" 95 | "font-weight: bold;\n" 96 | "font-size: 16pt;\n" 97 | "background-color: none;\n" 98 | "border: none;\n" 99 | "padding-top: 10px;") 100 | self.lbl_arrow_top.setPixmap(QPixmap(u":/icons/icons/north_west_white_24dp.svg")) 101 | 102 | self.horizontalLayout_9.addWidget(self.lbl_arrow_top) 103 | 104 | self.lbl_income = QLabel(self.balances_frame) 105 | self.lbl_income.setObjectName(u"lbl_income") 106 | self.lbl_income.setFont(font3) 107 | self.lbl_income.setStyleSheet(u"color: white;\n" 108 | "font-weight: bold;\n" 109 | "font-size: 16pt;\n" 110 | "background-color: none;\n" 111 | "border: none;\n" 112 | "padding-top: 10px;") 113 | 114 | self.horizontalLayout_9.addWidget(self.lbl_income) 115 | 116 | 117 | self.verticalLayout_21.addLayout(self.horizontalLayout_9) 118 | 119 | self.income_balance = QLabel(self.balances_frame) 120 | self.income_balance.setObjectName(u"income_balance") 121 | font4 = QFont() 122 | font4.setFamilies([u"Noto Sans SC"]) 123 | font4.setPointSize(20) 124 | font4.setBold(False) 125 | font4.setItalic(False) 126 | font4.setKerning(True) 127 | self.income_balance.setFont(font4) 128 | self.income_balance.setStyleSheet(u"color: white;\n" 129 | "font-size: 20pt;\n" 130 | "background-color: none;\n" 131 | "border: none;") 132 | self.income_balance.setLineWidth(0) 133 | 134 | self.verticalLayout_21.addWidget(self.income_balance) 135 | 136 | self.horizontalLayout_10 = QHBoxLayout() 137 | self.horizontalLayout_10.setObjectName(u"horizontalLayout_10") 138 | self.lbl_arrow_bottom = QLabel(self.balances_frame) 139 | self.lbl_arrow_bottom.setObjectName(u"lbl_arrow_bottom") 140 | self.lbl_arrow_bottom.setMaximumSize(QSize(24, 16777215)) 141 | self.lbl_arrow_bottom.setFont(font3) 142 | self.lbl_arrow_bottom.setStyleSheet(u"color: white;\n" 143 | "font-weight: bold;\n" 144 | "font-size: 16pt;\n" 145 | "background-color: none;\n" 146 | "border: none;\n" 147 | "padding-top: 10px;") 148 | self.lbl_arrow_bottom.setPixmap(QPixmap(u":/icons/icons/call_received_white_24dp.svg")) 149 | 150 | self.horizontalLayout_10.addWidget(self.lbl_arrow_bottom) 151 | 152 | self.lbl_outcome = QLabel(self.balances_frame) 153 | self.lbl_outcome.setObjectName(u"lbl_outcome") 154 | self.lbl_outcome.setFont(font3) 155 | self.lbl_outcome.setStyleSheet(u"color: white;\n" 156 | "font-weight: bold;\n" 157 | "font-size: 16pt;\n" 158 | "background-color: none;\n" 159 | "border: none;\n" 160 | "padding-top: 10px;") 161 | 162 | self.horizontalLayout_10.addWidget(self.lbl_outcome) 163 | 164 | 165 | self.verticalLayout_21.addLayout(self.horizontalLayout_10) 166 | 167 | self.outcome_balance = QLabel(self.balances_frame) 168 | self.outcome_balance.setObjectName(u"outcome_balance") 169 | self.outcome_balance.setFont(font4) 170 | self.outcome_balance.setStyleSheet(u"color: white;\n" 171 | "font-size: 20pt;\n" 172 | "background-color: none;\n" 173 | "border: none;") 174 | self.outcome_balance.setLineWidth(0) 175 | 176 | self.verticalLayout_21.addWidget(self.outcome_balance) 177 | 178 | 179 | self.horizontalLayout_2.addWidget(self.balances_frame) 180 | 181 | self.balances_frame_2 = QFrame(self.centralwidget) 182 | self.balances_frame_2.setObjectName(u"balances_frame_2") 183 | self.balances_frame_2.setStyleSheet(u"background-color: rgba(255, 255, 255, 30); \n" 184 | "border: 1px solid rgba(255,255,255,40);\n" 185 | "border-radius: 7px;") 186 | self.balances_frame_2.setFrameShape(QFrame.NoFrame) 187 | self.balances_frame_2.setFrameShadow(QFrame.Raised) 188 | self.verticalLayout_20 = QVBoxLayout(self.balances_frame_2) 189 | self.verticalLayout_20.setSpacing(0) 190 | self.verticalLayout_20.setObjectName(u"verticalLayout_20") 191 | self.verticalLayout_20.setContentsMargins(12, 12, 12, 12) 192 | self.lbl_expenses_categories = QLabel(self.balances_frame_2) 193 | self.lbl_expenses_categories.setObjectName(u"lbl_expenses_categories") 194 | self.lbl_expenses_categories.setFont(font1) 195 | self.lbl_expenses_categories.setStyleSheet(u"color: white;\n" 196 | "font-weight: bold;\n" 197 | "font-size: 20pt;\n" 198 | "background-color: none;\n" 199 | "border: none;") 200 | 201 | self.verticalLayout_20.addWidget(self.lbl_expenses_categories) 202 | 203 | self.horizontalLayout_3 = QHBoxLayout() 204 | self.horizontalLayout_3.setObjectName(u"horizontalLayout_3") 205 | self.icon_groceries = QLabel(self.balances_frame_2) 206 | self.icon_groceries.setObjectName(u"icon_groceries") 207 | sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred) 208 | sizePolicy.setHorizontalStretch(0) 209 | sizePolicy.setVerticalStretch(0) 210 | sizePolicy.setHeightForWidth(self.icon_groceries.sizePolicy().hasHeightForWidth()) 211 | self.icon_groceries.setSizePolicy(sizePolicy) 212 | self.icon_groceries.setMaximumSize(QSize(24, 16777215)) 213 | font5 = QFont() 214 | font5.setFamilies([u"Noto Sans SC"]) 215 | font5.setPointSize(14) 216 | font5.setBold(True) 217 | self.icon_groceries.setFont(font5) 218 | self.icon_groceries.setStyleSheet(u"color: white;\n" 219 | "font-weight: bold;\n" 220 | "font-size: 14pt;\n" 221 | "background-color: none;\n" 222 | "border: none;") 223 | self.icon_groceries.setPixmap(QPixmap(u":/icons/icons/local_grocery_store_white_24dp.svg")) 224 | 225 | self.horizontalLayout_3.addWidget(self.icon_groceries) 226 | 227 | self.lbl_groceries = QLabel(self.balances_frame_2) 228 | self.lbl_groceries.setObjectName(u"lbl_groceries") 229 | self.lbl_groceries.setFont(font5) 230 | self.lbl_groceries.setStyleSheet(u"color: white;\n" 231 | "font-weight: bold;\n" 232 | "font-size: 14pt;\n" 233 | "background-color: none;\n" 234 | "border: none;") 235 | 236 | self.horizontalLayout_3.addWidget(self.lbl_groceries) 237 | 238 | self.total_groceries = QLabel(self.balances_frame_2) 239 | self.total_groceries.setObjectName(u"total_groceries") 240 | font6 = QFont() 241 | font6.setFamilies([u"Noto Sans SC"]) 242 | font6.setPointSize(16) 243 | font6.setBold(False) 244 | font6.setItalic(False) 245 | font6.setKerning(True) 246 | self.total_groceries.setFont(font6) 247 | self.total_groceries.setStyleSheet(u"color: white;\n" 248 | "font-size: 16pt;\n" 249 | "background-color: none;\n" 250 | "border: none;") 251 | self.total_groceries.setLineWidth(0) 252 | 253 | self.horizontalLayout_3.addWidget(self.total_groceries) 254 | 255 | 256 | self.verticalLayout_20.addLayout(self.horizontalLayout_3) 257 | 258 | self.horizontalLayout_4 = QHBoxLayout() 259 | self.horizontalLayout_4.setObjectName(u"horizontalLayout_4") 260 | self.icon_entertainment = QLabel(self.balances_frame_2) 261 | self.icon_entertainment.setObjectName(u"icon_entertainment") 262 | self.icon_entertainment.setMaximumSize(QSize(24, 16777215)) 263 | self.icon_entertainment.setFont(font5) 264 | self.icon_entertainment.setStyleSheet(u"color: white;\n" 265 | "font-weight: bold;\n" 266 | "font-size: 14pt;\n" 267 | "background-color: none;\n" 268 | "border: none;") 269 | self.icon_entertainment.setPixmap(QPixmap(u":/icons/icons/sports_esports_white_24dp.svg")) 270 | 271 | self.horizontalLayout_4.addWidget(self.icon_entertainment) 272 | 273 | self.lbl_entertainment = QLabel(self.balances_frame_2) 274 | self.lbl_entertainment.setObjectName(u"lbl_entertainment") 275 | self.lbl_entertainment.setFont(font5) 276 | self.lbl_entertainment.setStyleSheet(u"color: white;\n" 277 | "font-weight: bold;\n" 278 | "font-size: 14pt;\n" 279 | "background-color: none;\n" 280 | "border: none;") 281 | 282 | self.horizontalLayout_4.addWidget(self.lbl_entertainment) 283 | 284 | self.total_entertainment = QLabel(self.balances_frame_2) 285 | self.total_entertainment.setObjectName(u"total_entertainment") 286 | self.total_entertainment.setFont(font6) 287 | self.total_entertainment.setStyleSheet(u"color: white;\n" 288 | "font-size: 16pt;\n" 289 | "background-color: none;\n" 290 | "border: none;") 291 | self.total_entertainment.setLineWidth(0) 292 | 293 | self.horizontalLayout_4.addWidget(self.total_entertainment) 294 | 295 | 296 | self.verticalLayout_20.addLayout(self.horizontalLayout_4) 297 | 298 | self.horizontalLayout_5 = QHBoxLayout() 299 | self.horizontalLayout_5.setObjectName(u"horizontalLayout_5") 300 | self.icon_auto = QLabel(self.balances_frame_2) 301 | self.icon_auto.setObjectName(u"icon_auto") 302 | self.icon_auto.setMaximumSize(QSize(24, 16777215)) 303 | self.icon_auto.setFont(font5) 304 | self.icon_auto.setStyleSheet(u"color: white;\n" 305 | "font-weight: bold;\n" 306 | "font-size: 14pt;\n" 307 | "background-color: none;\n" 308 | "border: none;") 309 | self.icon_auto.setPixmap(QPixmap(u":/icons/icons/directions_car_white_24dp.svg")) 310 | 311 | self.horizontalLayout_5.addWidget(self.icon_auto) 312 | 313 | self.lbl_auto = QLabel(self.balances_frame_2) 314 | self.lbl_auto.setObjectName(u"lbl_auto") 315 | self.lbl_auto.setFont(font5) 316 | self.lbl_auto.setStyleSheet(u"color: white;\n" 317 | "font-weight: bold;\n" 318 | "font-size: 14pt;\n" 319 | "background-color: none;\n" 320 | "border: none;") 321 | 322 | self.horizontalLayout_5.addWidget(self.lbl_auto) 323 | 324 | self.total_auto = QLabel(self.balances_frame_2) 325 | self.total_auto.setObjectName(u"total_auto") 326 | self.total_auto.setFont(font6) 327 | self.total_auto.setStyleSheet(u"color: white;\n" 328 | "font-size: 16pt;\n" 329 | "background-color: none;\n" 330 | "border: none;") 331 | self.total_auto.setLineWidth(0) 332 | 333 | self.horizontalLayout_5.addWidget(self.total_auto) 334 | 335 | 336 | self.verticalLayout_20.addLayout(self.horizontalLayout_5) 337 | 338 | self.horizontalLayout_6 = QHBoxLayout() 339 | self.horizontalLayout_6.setObjectName(u"horizontalLayout_6") 340 | self.icon_other = QLabel(self.balances_frame_2) 341 | self.icon_other.setObjectName(u"icon_other") 342 | self.icon_other.setMaximumSize(QSize(24, 16777215)) 343 | self.icon_other.setFont(font5) 344 | self.icon_other.setStyleSheet(u"color: white;\n" 345 | "font-weight: bold;\n" 346 | "font-size: 14pt;\n" 347 | "background-color: none;\n" 348 | "border: none;") 349 | self.icon_other.setPixmap(QPixmap(u":/icons/icons/list_white_24dp.svg")) 350 | 351 | self.horizontalLayout_6.addWidget(self.icon_other) 352 | 353 | self.lbl_other = QLabel(self.balances_frame_2) 354 | self.lbl_other.setObjectName(u"lbl_other") 355 | self.lbl_other.setFont(font5) 356 | self.lbl_other.setStyleSheet(u"color: white;\n" 357 | "font-weight: bold;\n" 358 | "font-size: 14pt;\n" 359 | "background-color: none;\n" 360 | "border: none;") 361 | 362 | self.horizontalLayout_6.addWidget(self.lbl_other) 363 | 364 | self.total_other = QLabel(self.balances_frame_2) 365 | self.total_other.setObjectName(u"total_other") 366 | self.total_other.setFont(font6) 367 | self.total_other.setStyleSheet(u"color: white;\n" 368 | "font-size: 16pt;\n" 369 | "background-color: none;\n" 370 | "border: none;") 371 | self.total_other.setLineWidth(0) 372 | 373 | self.horizontalLayout_6.addWidget(self.total_other) 374 | 375 | 376 | self.verticalLayout_20.addLayout(self.horizontalLayout_6) 377 | 378 | 379 | self.horizontalLayout_2.addWidget(self.balances_frame_2) 380 | 381 | 382 | self.verticalLayout_2.addLayout(self.horizontalLayout_2) 383 | 384 | self.btn_frame = QFrame(self.centralwidget) 385 | self.btn_frame.setObjectName(u"btn_frame") 386 | self.btn_frame.setStyleSheet(u"background-color: transparent;") 387 | self.horizontalLayout = QHBoxLayout(self.btn_frame) 388 | #ifndef Q_OS_MAC 389 | self.horizontalLayout.setSpacing(-1) 390 | #endif 391 | self.horizontalLayout.setObjectName(u"horizontalLayout") 392 | self.horizontalLayout.setContentsMargins(0, 0, 0, 0) 393 | self.btn_new_transaction = QPushButton(self.btn_frame) 394 | self.btn_new_transaction.setObjectName(u"btn_new_transaction") 395 | self.btn_new_transaction.setMinimumSize(QSize(230, 50)) 396 | font7 = QFont() 397 | font7.setFamilies([u"Noto Sans SC"]) 398 | font7.setBold(True) 399 | self.btn_new_transaction.setFont(font7) 400 | self.btn_new_transaction.setStyleSheet(u"QPushButton{\n" 401 | " color: rgb(255, 255, 255);\n" 402 | " background-color:rgba(255,255,255,30);\n" 403 | " border: 1px solid rgba(255,255,255,40);\n" 404 | " border-radius:7px;\n" 405 | "width: 230;\n" 406 | "height: 50;\n" 407 | "}\n" 408 | "QPushButton:hover{\n" 409 | "background-color:rgba(255,255,255,30);\n" 410 | "}\n" 411 | "QPushButton:pressed{\n" 412 | "background-color:rgba(255,255,255,70);\n" 413 | "}") 414 | icon = QIcon() 415 | icon.addFile(u":/icons/icons/post_add_white_24dp.svg", QSize(), QIcon.Normal, QIcon.Off) 416 | self.btn_new_transaction.setIcon(icon) 417 | self.btn_new_transaction.setIconSize(QSize(24, 24)) 418 | 419 | self.horizontalLayout.addWidget(self.btn_new_transaction) 420 | 421 | self.btn_delete_transaction = QPushButton(self.btn_frame) 422 | self.btn_delete_transaction.setObjectName(u"btn_delete_transaction") 423 | self.btn_delete_transaction.setMinimumSize(QSize(230, 50)) 424 | self.btn_delete_transaction.setFont(font7) 425 | self.btn_delete_transaction.setStyleSheet(u"QPushButton{\n" 426 | " color: rgb(255, 255, 255);\n" 427 | " background-color:rgba(255,255,255,30);\n" 428 | " border: 1px solid rgba(255,255,255,40);\n" 429 | " border-radius:7px;\n" 430 | "width: 230;\n" 431 | "height: 50;\n" 432 | "}\n" 433 | "QPushButton:hover{\n" 434 | "background-color:rgba(255,255,255,30);\n" 435 | "}\n" 436 | "QPushButton:pressed{\n" 437 | "background-color:rgba(255,255,255,70);\n" 438 | "}") 439 | icon1 = QIcon() 440 | icon1.addFile(u":/icons/icons/delete_white_24dp.svg", QSize(), QIcon.Normal, QIcon.Off) 441 | self.btn_delete_transaction.setIcon(icon1) 442 | self.btn_delete_transaction.setIconSize(QSize(24, 24)) 443 | 444 | self.horizontalLayout.addWidget(self.btn_delete_transaction) 445 | 446 | self.btn_edit_transaction = QPushButton(self.btn_frame) 447 | self.btn_edit_transaction.setObjectName(u"btn_edit_transaction") 448 | self.btn_edit_transaction.setMinimumSize(QSize(230, 50)) 449 | self.btn_edit_transaction.setFont(font7) 450 | self.btn_edit_transaction.setStyleSheet(u"QPushButton{\n" 451 | " color: rgb(255, 255, 255);\n" 452 | " background-color:rgba(255,255,255,30);\n" 453 | " border: 1px solid rgba(255,255,255,40);\n" 454 | " border-radius:7px;\n" 455 | "width: 230;\n" 456 | "height: 50;\n" 457 | "}\n" 458 | "QPushButton:hover{\n" 459 | "background-color:rgba(255,255,255,30);\n" 460 | "}\n" 461 | "QPushButton:pressed{\n" 462 | "background-color:rgba(255,255,255,70);\n" 463 | "}") 464 | icon2 = QIcon() 465 | icon2.addFile(u":/icons/icons/edit_white_24dp.svg", QSize(), QIcon.Normal, QIcon.Off) 466 | self.btn_edit_transaction.setIcon(icon2) 467 | self.btn_edit_transaction.setIconSize(QSize(24, 24)) 468 | 469 | self.horizontalLayout.addWidget(self.btn_edit_transaction) 470 | 471 | 472 | self.verticalLayout_2.addWidget(self.btn_frame) 473 | 474 | self.tableView = QTableView(self.centralwidget) 475 | self.tableView.setObjectName(u"tableView") 476 | self.tableView.setStyleSheet(u"QTableView {\n" 477 | "background-color: rgba(255, 255, 255, 30); \n" 478 | "border: 1px solid rgba(255,255,255,40);\n" 479 | "border-bottom-right-radius: 7px; \n" 480 | "border-bottom-left-radius: 7px; \n" 481 | "color: white;\n" 482 | "}\n" 483 | "\n" 484 | "QHeaderView::section {\n" 485 | "background-color: rgb(53, 53, 53);\n" 486 | "color: white;\n" 487 | "border: none;\n" 488 | "height: 50px;\n" 489 | "font-size: 16pt;\n" 490 | "}\n" 491 | "\n" 492 | "QTableView::item {\n" 493 | " border-style: none;\n" 494 | " border-bottom: 1px solid rgba(255,255,255,50);\n" 495 | "}\n" 496 | "\n" 497 | "QTableView::item:selected{\n" 498 | " border: none;\n" 499 | " color: rgb(255, 255, 255);\n" 500 | " background-color: rgba(255, 255, 255, 50);\n" 501 | "}\n" 502 | "") 503 | self.tableView.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) 504 | self.tableView.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) 505 | self.tableView.setTextElideMode(Qt.ElideRight) 506 | self.tableView.setShowGrid(False) 507 | self.tableView.setSortingEnabled(True) 508 | self.tableView.horizontalHeader().setDefaultSectionSize(135) 509 | self.tableView.verticalHeader().setVisible(False) 510 | 511 | self.verticalLayout_2.addWidget(self.tableView) 512 | 513 | MainWindow.setCentralWidget(self.centralwidget) 514 | 515 | self.retranslateUi(MainWindow) 516 | 517 | QMetaObject.connectSlotsByName(MainWindow) 518 | # setupUi 519 | 520 | def retranslateUi(self, MainWindow): 521 | MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None)) 522 | self.lbl_current_balance.setText(QCoreApplication.translate("MainWindow", u"Current Balance", None)) 523 | self.current_balance.setText(QCoreApplication.translate("MainWindow", u"$3235,50", None)) 524 | self.lbl_arrow_top.setText("") 525 | self.lbl_income.setText(QCoreApplication.translate("MainWindow", u"Income", None)) 526 | self.income_balance.setText(QCoreApplication.translate("MainWindow", u"$3235,50", None)) 527 | self.lbl_arrow_bottom.setText("") 528 | self.lbl_outcome.setText(QCoreApplication.translate("MainWindow", u"Outcome", None)) 529 | self.outcome_balance.setText(QCoreApplication.translate("MainWindow", u"$3235,50", None)) 530 | self.lbl_expenses_categories.setText(QCoreApplication.translate("MainWindow", u"Expenses categories", None)) 531 | self.icon_groceries.setText("") 532 | self.lbl_groceries.setText(QCoreApplication.translate("MainWindow", u"Groceries", None)) 533 | self.total_groceries.setText(QCoreApplication.translate("MainWindow", u"$3235,50", None)) 534 | self.icon_entertainment.setText("") 535 | self.lbl_entertainment.setText(QCoreApplication.translate("MainWindow", u"Entertainment", None)) 536 | self.total_entertainment.setText(QCoreApplication.translate("MainWindow", u"$3235,50", None)) 537 | self.icon_auto.setText("") 538 | self.lbl_auto.setText(QCoreApplication.translate("MainWindow", u"Auto", None)) 539 | self.total_auto.setText(QCoreApplication.translate("MainWindow", u"$3235,50", None)) 540 | self.icon_other.setText("") 541 | self.lbl_other.setText(QCoreApplication.translate("MainWindow", u"Other", None)) 542 | self.total_other.setText(QCoreApplication.translate("MainWindow", u"$3235,50", None)) 543 | self.btn_new_transaction.setText(QCoreApplication.translate("MainWindow", u"New transaction", None)) 544 | self.btn_delete_transaction.setText(QCoreApplication.translate("MainWindow", u"Delete transaction", None)) 545 | self.btn_edit_transaction.setText(QCoreApplication.translate("MainWindow", u"Edit transaction", None)) 546 | # retranslateUi 547 | 548 | -------------------------------------------------------------------------------- /ui_main.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 803 10 | 673 11 | 12 | 13 | 14 | 15 | 800 16 | 600 17 | 18 | 19 | 20 | 21 | Noto Sans SC 22 | 23 | 24 | 25 | MainWindow 26 | 27 | 28 | font-family: Noto Sans SC; 29 | background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:0, y2:0, stop:0 rgba(81, 0, 135, 255), stop:0.427447 rgba(41, 61, 132, 235), stop:1 rgba(155, 79, 165, 255)); 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | background-color: rgba(255, 255, 255, 30); 40 | border: 1px solid rgba(255,255,255,40); 41 | border-radius: 7px; 42 | 43 | 44 | QFrame::NoFrame 45 | 46 | 47 | QFrame::Raised 48 | 49 | 50 | 51 | 0 52 | 53 | 54 | 12 55 | 56 | 57 | 12 58 | 59 | 60 | 12 61 | 62 | 63 | 12 64 | 65 | 66 | 67 | 68 | 69 | Noto Sans SC 70 | 20 71 | true 72 | 73 | 74 | 75 | color: white; 76 | font-weight: bold; 77 | font-size: 20pt; 78 | background-color: none; 79 | border: none; 80 | 81 | 82 | Current Balance 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | Noto Sans SC 91 | 30 92 | false 93 | false 94 | true 95 | 96 | 97 | 98 | color: white; 99 | font-size: 30pt; 100 | background-color: none; 101 | border: none; 102 | 103 | 104 | 0 105 | 106 | 107 | $3235,50 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 24 118 | 16777215 119 | 120 | 121 | 122 | 123 | Noto Sans SC 124 | 16 125 | true 126 | 127 | 128 | 129 | color: white; 130 | font-weight: bold; 131 | font-size: 16pt; 132 | background-color: none; 133 | border: none; 134 | padding-top: 10px; 135 | 136 | 137 | 138 | 139 | 140 | :/icons/icons/north_west_white_24dp.svg 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | Noto Sans SC 149 | 16 150 | true 151 | 152 | 153 | 154 | color: white; 155 | font-weight: bold; 156 | font-size: 16pt; 157 | background-color: none; 158 | border: none; 159 | padding-top: 10px; 160 | 161 | 162 | Income 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | Noto Sans SC 173 | 20 174 | false 175 | false 176 | true 177 | 178 | 179 | 180 | color: white; 181 | font-size: 20pt; 182 | background-color: none; 183 | border: none; 184 | 185 | 186 | 0 187 | 188 | 189 | $3235,50 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 24 200 | 16777215 201 | 202 | 203 | 204 | 205 | Noto Sans SC 206 | 16 207 | true 208 | 209 | 210 | 211 | color: white; 212 | font-weight: bold; 213 | font-size: 16pt; 214 | background-color: none; 215 | border: none; 216 | padding-top: 10px; 217 | 218 | 219 | 220 | 221 | 222 | :/icons/icons/call_received_white_24dp.svg 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | Noto Sans SC 231 | 16 232 | true 233 | 234 | 235 | 236 | color: white; 237 | font-weight: bold; 238 | font-size: 16pt; 239 | background-color: none; 240 | border: none; 241 | padding-top: 10px; 242 | 243 | 244 | Outcome 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | Noto Sans SC 255 | 20 256 | false 257 | false 258 | true 259 | 260 | 261 | 262 | color: white; 263 | font-size: 20pt; 264 | background-color: none; 265 | border: none; 266 | 267 | 268 | 0 269 | 270 | 271 | $3235,50 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | background-color: rgba(255, 255, 255, 30); 282 | border: 1px solid rgba(255,255,255,40); 283 | border-radius: 7px; 284 | 285 | 286 | QFrame::NoFrame 287 | 288 | 289 | QFrame::Raised 290 | 291 | 292 | 293 | 0 294 | 295 | 296 | 12 297 | 298 | 299 | 12 300 | 301 | 302 | 12 303 | 304 | 305 | 12 306 | 307 | 308 | 309 | 310 | 311 | Noto Sans SC 312 | 20 313 | true 314 | 315 | 316 | 317 | color: white; 318 | font-weight: bold; 319 | font-size: 20pt; 320 | background-color: none; 321 | border: none; 322 | 323 | 324 | Expenses categories 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 0 335 | 0 336 | 337 | 338 | 339 | 340 | 24 341 | 16777215 342 | 343 | 344 | 345 | 346 | Noto Sans SC 347 | 14 348 | true 349 | 350 | 351 | 352 | color: white; 353 | font-weight: bold; 354 | font-size: 14pt; 355 | background-color: none; 356 | border: none; 357 | 358 | 359 | 360 | 361 | 362 | :/icons/icons/local_grocery_store_white_24dp.svg 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | Noto Sans SC 371 | 14 372 | true 373 | 374 | 375 | 376 | color: white; 377 | font-weight: bold; 378 | font-size: 14pt; 379 | background-color: none; 380 | border: none; 381 | 382 | 383 | Groceries 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | Noto Sans SC 392 | 16 393 | false 394 | false 395 | true 396 | 397 | 398 | 399 | color: white; 400 | font-size: 16pt; 401 | background-color: none; 402 | border: none; 403 | 404 | 405 | 0 406 | 407 | 408 | $3235,50 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 24 421 | 16777215 422 | 423 | 424 | 425 | 426 | Noto Sans SC 427 | 14 428 | true 429 | 430 | 431 | 432 | color: white; 433 | font-weight: bold; 434 | font-size: 14pt; 435 | background-color: none; 436 | border: none; 437 | 438 | 439 | 440 | 441 | 442 | :/icons/icons/sports_esports_white_24dp.svg 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | Noto Sans SC 451 | 14 452 | true 453 | 454 | 455 | 456 | color: white; 457 | font-weight: bold; 458 | font-size: 14pt; 459 | background-color: none; 460 | border: none; 461 | 462 | 463 | Entertainment 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | Noto Sans SC 472 | 16 473 | false 474 | false 475 | true 476 | 477 | 478 | 479 | color: white; 480 | font-size: 16pt; 481 | background-color: none; 482 | border: none; 483 | 484 | 485 | 0 486 | 487 | 488 | $3235,50 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 24 501 | 16777215 502 | 503 | 504 | 505 | 506 | Noto Sans SC 507 | 14 508 | true 509 | 510 | 511 | 512 | color: white; 513 | font-weight: bold; 514 | font-size: 14pt; 515 | background-color: none; 516 | border: none; 517 | 518 | 519 | 520 | 521 | 522 | :/icons/icons/directions_car_white_24dp.svg 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | Noto Sans SC 531 | 14 532 | true 533 | 534 | 535 | 536 | color: white; 537 | font-weight: bold; 538 | font-size: 14pt; 539 | background-color: none; 540 | border: none; 541 | 542 | 543 | Auto 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | Noto Sans SC 552 | 16 553 | false 554 | false 555 | true 556 | 557 | 558 | 559 | color: white; 560 | font-size: 16pt; 561 | background-color: none; 562 | border: none; 563 | 564 | 565 | 0 566 | 567 | 568 | $3235,50 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 24 581 | 16777215 582 | 583 | 584 | 585 | 586 | Noto Sans SC 587 | 14 588 | true 589 | 590 | 591 | 592 | color: white; 593 | font-weight: bold; 594 | font-size: 14pt; 595 | background-color: none; 596 | border: none; 597 | 598 | 599 | 600 | 601 | 602 | :/icons/icons/list_white_24dp.svg 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | Noto Sans SC 611 | 14 612 | true 613 | 614 | 615 | 616 | color: white; 617 | font-weight: bold; 618 | font-size: 14pt; 619 | background-color: none; 620 | border: none; 621 | 622 | 623 | Other 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | Noto Sans SC 632 | 16 633 | false 634 | false 635 | true 636 | 637 | 638 | 639 | color: white; 640 | font-size: 16pt; 641 | background-color: none; 642 | border: none; 643 | 644 | 645 | 0 646 | 647 | 648 | $3235,50 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | background-color: transparent; 663 | 664 | 665 | 666 | -1 667 | 668 | 669 | 0 670 | 671 | 672 | 0 673 | 674 | 675 | 0 676 | 677 | 678 | 0 679 | 680 | 681 | 682 | 683 | 684 | 230 685 | 50 686 | 687 | 688 | 689 | 690 | Noto Sans SC 691 | true 692 | 693 | 694 | 695 | QPushButton{ 696 | color: rgb(255, 255, 255); 697 | background-color:rgba(255,255,255,30); 698 | border: 1px solid rgba(255,255,255,40); 699 | border-radius:7px; 700 | width: 230; 701 | height: 50; 702 | } 703 | QPushButton:hover{ 704 | background-color:rgba(255,255,255,30); 705 | } 706 | QPushButton:pressed{ 707 | background-color:rgba(255,255,255,70); 708 | } 709 | 710 | 711 | New transaction 712 | 713 | 714 | 715 | :/icons/icons/post_add_white_24dp.svg:/icons/icons/post_add_white_24dp.svg 716 | 717 | 718 | 719 | 24 720 | 24 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 230 730 | 50 731 | 732 | 733 | 734 | 735 | Noto Sans SC 736 | true 737 | 738 | 739 | 740 | QPushButton{ 741 | color: rgb(255, 255, 255); 742 | background-color:rgba(255,255,255,30); 743 | border: 1px solid rgba(255,255,255,40); 744 | border-radius:7px; 745 | width: 230; 746 | height: 50; 747 | } 748 | QPushButton:hover{ 749 | background-color:rgba(255,255,255,30); 750 | } 751 | QPushButton:pressed{ 752 | background-color:rgba(255,255,255,70); 753 | } 754 | 755 | 756 | Delete transaction 757 | 758 | 759 | 760 | :/icons/icons/delete_white_24dp.svg:/icons/icons/delete_white_24dp.svg 761 | 762 | 763 | 764 | 24 765 | 24 766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 230 775 | 50 776 | 777 | 778 | 779 | 780 | Noto Sans SC 781 | true 782 | 783 | 784 | 785 | QPushButton{ 786 | color: rgb(255, 255, 255); 787 | background-color:rgba(255,255,255,30); 788 | border: 1px solid rgba(255,255,255,40); 789 | border-radius:7px; 790 | width: 230; 791 | height: 50; 792 | } 793 | QPushButton:hover{ 794 | background-color:rgba(255,255,255,30); 795 | } 796 | QPushButton:pressed{ 797 | background-color:rgba(255,255,255,70); 798 | } 799 | 800 | 801 | Edit transaction 802 | 803 | 804 | 805 | :/icons/icons/edit_white_24dp.svg:/icons/icons/edit_white_24dp.svg 806 | 807 | 808 | 809 | 24 810 | 24 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | QTableView { 822 | background-color: rgba(255, 255, 255, 30); 823 | border: 1px solid rgba(255,255,255,40); 824 | border-bottom-right-radius: 7px; 825 | border-bottom-left-radius: 7px; 826 | color: white; 827 | } 828 | 829 | QHeaderView::section { 830 | background-color: rgb(53, 53, 53); 831 | color: white; 832 | border: none; 833 | height: 50px; 834 | font-size: 16pt; 835 | } 836 | 837 | QTableView::item { 838 | border-style: none; 839 | border-bottom: 1px solid rgba(255,255,255,50); 840 | padding-left: auto; 841 | padding-right: auto; 842 | } 843 | 844 | QTableView::item:selected{ 845 | border: none; 846 | color: rgb(255, 255, 255); 847 | background-color: rgba(255, 255, 255, 50); 848 | } 849 | 850 | 851 | 852 | Qt::ScrollBarAlwaysOff 853 | 854 | 855 | Qt::ScrollBarAlwaysOff 856 | 857 | 858 | Qt::ElideRight 859 | 860 | 861 | false 862 | 863 | 864 | true 865 | 866 | 867 | 155 868 | 869 | 870 | false 871 | 872 | 873 | 874 | 875 | 876 | 877 | 878 | 879 | 880 | 881 | 882 | --------------------------------------------------------------------------------