mirror of
https://github.com/UN-GCPDS/qt-material.git
synced 2025-01-27 17:02:57 +08:00
217 lines
6.8 KiB
Python
217 lines
6.8 KiB
Python
import os
|
|
import sys
|
|
import logging
|
|
from multiprocessing import freeze_support
|
|
|
|
if '--pyside2' in sys.argv:
|
|
from PySide2.QtWidgets import QApplication, QMainWindow, QFileDialog
|
|
from PySide2.QtCore import QTimer, Qt, QCoreApplication
|
|
from PySide2.QtGui import QIcon
|
|
from PySide2.QtUiTools import QUiLoader
|
|
|
|
elif '--pyside6' in sys.argv:
|
|
from PySide6.QtWidgets import QApplication, QMainWindow, QFileDialog
|
|
from PySide6.QtCore import QTimer, Qt, QCoreApplication
|
|
from PySide6.QtGui import QIcon, QPixmap
|
|
from PySide6.QtUiTools import QUiLoader
|
|
from __feature__ import snake_case, true_property
|
|
|
|
elif '--pyqt5' in sys.argv:
|
|
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog
|
|
from PyQt5.QtCore import QTimer, Qt, QCoreApplication
|
|
from PyQt5 import uic, QtWebEngineWidgets
|
|
from PyQt5.QtGui import QIcon
|
|
|
|
elif '--pyqt6' in sys.argv:
|
|
from PyQt6.QtWidgets import QApplication, QMainWindow, QFileDialog
|
|
from PyQt6.QtCore import QTimer, Qt, QCoreApplication
|
|
from PyQt6.QtGui import QIcon
|
|
from PyQt6 import uic, QtWebEngineWidgets
|
|
|
|
from qt_material import apply_stylesheet, QtStyleTools, density
|
|
|
|
if hasattr(Qt, 'AA_ShareOpenGLContexts'):
|
|
try:
|
|
QCoreApplication.setAttribute(Qt.AA_ShareOpenGLContexts)
|
|
except:
|
|
QCoreApplication.set_attribute(Qt.AA_ShareOpenGLContexts)
|
|
else:
|
|
print("'Qt' object has no attribute 'AA_ShareOpenGLContexts'")
|
|
|
|
app = QApplication([])
|
|
freeze_support()
|
|
try:
|
|
app.processEvents()
|
|
app.setQuitOnLastWindowClosed(False)
|
|
app.lastWindowClosed.connect(app.quit)
|
|
except:
|
|
app.process_events()
|
|
app.quit_on_last_window_closed = False
|
|
app.lastWindowClosed.connect(app.quit)
|
|
|
|
|
|
# Extra stylesheets
|
|
extra = {
|
|
# Button colors
|
|
'danger': '#dc3545',
|
|
'warning': '#ffc107',
|
|
'success': '#17a2b8',
|
|
# Font
|
|
'font_family': 'Roboto',
|
|
# Density
|
|
'density_scale': '0',
|
|
# Button Shape
|
|
'button_shape': 'default',
|
|
}
|
|
|
|
# extra['QMenu'] = {
|
|
# 'height': 50,
|
|
# 'padding': '50px 50px 50px 50px', # top, right, bottom, left
|
|
# }
|
|
|
|
########################################################################
|
|
class RuntimeStylesheets(QMainWindow, QtStyleTools):
|
|
# ----------------------------------------------------------------------
|
|
def __init__(self):
|
|
"""Constructor"""
|
|
super().__init__()
|
|
|
|
if '--pyside2' in sys.argv:
|
|
self.main = QUiLoader().load('main_window.ui', self)
|
|
wt = 'PySide2'
|
|
|
|
elif '--pyside6' in sys.argv:
|
|
self.main = QUiLoader().load('main_window.ui', self)
|
|
wt = 'PySide6'
|
|
|
|
elif '--pyqt5' in sys.argv:
|
|
self.main = uic.loadUi('main_window.ui', self)
|
|
wt = 'PyQt5'
|
|
|
|
elif '--pyqt6' in sys.argv:
|
|
self.main = uic.loadUi('main_window.ui', self)
|
|
wt = 'PyQt6'
|
|
|
|
else:
|
|
logging.error(
|
|
'must include --pyside2, --pyside6 or --pyqt5 in args!'
|
|
)
|
|
sys.exit()
|
|
|
|
try:
|
|
self.main.setWindowTitle(f'{self.main.windowTitle()} - {wt}')
|
|
except:
|
|
self.main.window_title = f'{self.main.window_title} - {wt}'
|
|
|
|
self.custom_styles()
|
|
|
|
self.set_extra(extra)
|
|
self.add_menu_theme(self.main, self.main.menuStyles)
|
|
self.add_menu_density(self.main, self.main.menuDensity)
|
|
self.show_dock_theme(self.main)
|
|
|
|
logo = QIcon("qt_material:/logo/logo.svg")
|
|
logo_frame = QIcon("qt_material:/logo/logo_frame.svg")
|
|
|
|
try:
|
|
self.main.setWindowIcon(logo)
|
|
self.main.actionToolbar.setIcon(logo)
|
|
[
|
|
self.main.listWidget_2.item(i).setIcon(logo_frame)
|
|
for i in range(self.main.listWidget_2.count())
|
|
]
|
|
except:
|
|
self.main.window_icon = logo
|
|
self.main.actionToolbar.icon = logo
|
|
[
|
|
setattr(self.main.listWidget_2.item(i), 'icon', logo_frame)
|
|
for i in range(self.main.listWidget_2.count)
|
|
]
|
|
|
|
if hasattr(QFileDialog, 'getExistingDirectory'):
|
|
self.main.pushButton_file_dialog.clicked.connect(
|
|
lambda: QFileDialog.getOpenFileName(self.main)
|
|
)
|
|
self.main.pushButton_folder_dialog.clicked.connect(
|
|
lambda: QFileDialog.getExistingDirectory(self.main)
|
|
)
|
|
else:
|
|
self.main.pushButton_file_dialog.clicked.connect(
|
|
lambda: QFileDialog.get_open_file_name(self.main)
|
|
)
|
|
self.main.pushButton_folder_dialog.clicked.connect(
|
|
lambda: QFileDialog.get_existing_directory(self.main)
|
|
)
|
|
|
|
# ----------------------------------------------------------------------
|
|
def custom_styles(self):
|
|
""""""
|
|
for i in range(self.main.toolBar_vertical.layout().count()):
|
|
|
|
try:
|
|
tool_button = (
|
|
self.main.toolBar_vertical.layout().itemAt(i).widget()
|
|
)
|
|
tool_button.setMaximumWidth(150)
|
|
tool_button.setMinimumWidth(150)
|
|
except:
|
|
tool_button = (
|
|
self.main.toolBar_vertical.layout().item_at(i).widget()
|
|
)
|
|
tool_button.maximum_width = 150
|
|
tool_button.minimum_width = 150
|
|
try:
|
|
for r in range(self.main.tableWidget.rowCount()):
|
|
self.main.tableWidget.setRowHeight(r, 36)
|
|
|
|
for r in range(self.main.tableWidget_2.rowCount()):
|
|
self.main.tableWidget_2.setRowHeight(r, 36)
|
|
|
|
except:
|
|
for r in range(self.main.tableWidget.row_count):
|
|
self.main.tableWidget.set_row_height(r, 36)
|
|
|
|
for r in range(self.main.tableWidget_2.row_count):
|
|
self.main.tableWidget_2.set_row_height(r, 36)
|
|
|
|
|
|
T0 = 1000
|
|
|
|
if __name__ == "__main__":
|
|
|
|
# ----------------------------------------------------------------------
|
|
def take_screenshot():
|
|
pixmap = frame.main.grab()
|
|
pixmap.save(os.path.join('screenshots', f'{theme}.png'))
|
|
print(f'Saving {theme}')
|
|
|
|
if len(sys.argv) > 2:
|
|
theme = sys.argv[2]
|
|
try:
|
|
QTimer.singleShot(T0, take_screenshot)
|
|
QTimer.singleShot(T0 * 2, app.closeAllWindows)
|
|
except:
|
|
QTimer.single_shot(T0, take_screenshot)
|
|
QTimer.single_shot(T0 * 2, app.closeAllWindows)
|
|
else:
|
|
theme = 'default'
|
|
|
|
# Set theme on in itialization
|
|
apply_stylesheet(
|
|
app,
|
|
theme + '.xml',
|
|
invert_secondary=('light' in theme and 'dark' not in theme),
|
|
extra=extra,
|
|
)
|
|
|
|
frame = RuntimeStylesheets()
|
|
try:
|
|
frame.main.showMaximized()
|
|
except:
|
|
frame.main.show_maximized()
|
|
|
|
if hasattr(app, 'exec'):
|
|
app.exec()
|
|
else:
|
|
app.exec_()
|