├── .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 | 
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 |
--------------------------------------------------------------------------------