Стили графического интерфейса приложения в PyQt
В стандартном редакторе Qt Designer есть стандартные шаблоны Fusion, Windows.
Есть ли какие-то еще шаблоны кроме них?
Если есть, то как их установить?
Ответы (1 шт):
Чтобы узнать, какие стили установлены в системе, просто вызовите QStyleFactory.keys().
print(QtWidgets.QStyleFactory.keys())
Обратите внимание, что не все стили доступны для каждой системы.
Обычно доступны Fusion и Windows что означает,
что если вы попытаетесь получить доступ к стилю macintosh, а он не установлен,
вместо него будет использован запасной стиль.
void QApplication::setStyle(QStyle style)
Устанавливает стиль графического интерфейса приложения.
Право собственности на объект стиля передаетсяQApplication.
QStyle *QApplication::setStyle(const QString &style)
Запрашивает объект
QStyleдля стиля изQStyleFactory.
Строка должна быть одной изQStyleFactory::keys(), обычно одной из "windows", "windowsvista", "fusion" или "macintosh".
Имена стилей нечувствительны к регистру.Возвращает nullptr, если передан неизвестный стиль, в противном случае возвращаемый объект
QStyleустанавливается как стиль графического интерфейса приложения.Предупреждение: Чтобы убедиться, что стиль приложения установлен правильно, лучше всего, если это возможно, вызывать эту функцию до конструктора
QApplication.
QStyle *QApplication::style()Возвращает объект стиля приложения.
Класс QStyleFactory создает объекты
QStyle.Класс QStyle — это абстрактный базовый класс, который инкапсулирует внешний вид графического интерфейса.
QStyleFactoryсоздает объектQStyle, используя функцию create() и ключ, идентифицирующий стиль.Стили либо встроены, либо динамически загружаются из плагина стиля (см. QStylePlugin).
Создание пользовательского стиля
Вы можете создать индивидуальный внешний вид своего приложения,
создав собственный стиль.
Существует два подхода к созданию собственного стиля.
При статическом подходе вы либо выбираете существующий класс QStyle,
создаете для него подкласс и переопределяете виртуальные функции для обеспечения
пользовательского поведения, либо создаете целый класс QStyle с нуля.
При динамическом подходе вы изменяете поведение вашего системного стиля
во время выполнения.
Статический подход описан ниже.
Динамический подход описан в QProxyStyle.
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import (QApplication, QMainWindow, QMessageBox,
QStyleFactory)
from PyQt5.QtCore import Qt
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(410, 340)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout_2 = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout_2.setObjectName("gridLayout_2")
self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
self.groupBox.setObjectName("groupBox")
self.gridLayout = QtWidgets.QGridLayout(self.groupBox)
self.gridLayout.setObjectName("gridLayout")
self.rdbPlastique = QtWidgets.QRadioButton(self.groupBox)
self.rdbPlastique.setObjectName("rdbPlastique")
self.bgrpRadio = QtWidgets.QButtonGroup(MainWindow)
self.bgrpRadio.setObjectName("bgrpRadio")
self.bgrpRadio.addButton(self.rdbPlastique)
self.gridLayout.addWidget(self.rdbPlastique, 0, 0, 1, 1)
self.rdbGTK = QtWidgets.QRadioButton(self.groupBox)
self.rdbGTK.setObjectName("rdbGTK")
self.bgrpRadio.addButton(self.rdbGTK)
self.gridLayout.addWidget(self.rdbGTK, 1, 0, 1, 1)
self.rdbMacintosh = QtWidgets.QRadioButton(self.groupBox)
self.rdbMacintosh.setObjectName("rdbMacintosh")
self.bgrpRadio.addButton(self.rdbMacintosh)
self.gridLayout.addWidget(self.rdbMacintosh, 0, 2, 1, 1)
self.rdbWindowsXP = QtWidgets.QRadioButton(self.groupBox)
self.rdbWindowsXP.setObjectName("rdbWindowsXP")
self.bgrpRadio.addButton(self.rdbWindowsXP)
self.gridLayout.addWidget(self.rdbWindowsXP, 0, 1, 1, 1)
self.rdbWindows = QtWidgets.QRadioButton(self.groupBox)
self.rdbWindows.setObjectName("rdbWindows")
self.bgrpRadio.addButton(self.rdbWindows)
self.gridLayout.addWidget(self.rdbWindows, 2, 1, 1, 1)
self.rdbWindowsVista = QtWidgets.QRadioButton(self.groupBox)
self.rdbWindowsVista.setObjectName("rdbWindowsVista")
self.bgrpRadio.addButton(self.rdbWindowsVista)
self.gridLayout.addWidget(self.rdbWindowsVista, 1, 1, 1, 1)
self.rdbFusion = QtWidgets.QRadioButton(self.groupBox)
self.rdbFusion.setObjectName("rdbFusion")
self.bgrpRadio.addButton(self.rdbFusion)
self.gridLayout.addWidget(self.rdbFusion, 3, 2, 1, 1)
self.rdbCDE = QtWidgets.QRadioButton(self.groupBox)
self.rdbCDE.setObjectName("rdbCDE")
self.bgrpRadio.addButton(self.rdbCDE)
self.gridLayout.addWidget(self.rdbCDE, 1, 2, 1, 1)
self.rdbCleanLooks = QtWidgets.QRadioButton(self.groupBox)
self.rdbCleanLooks.setObjectName("rdbCleanLooks")
self.bgrpRadio.addButton(self.rdbCleanLooks)
self.gridLayout.addWidget(self.rdbCleanLooks, 2, 0, 1, 1)
self.rdbMotif = QtWidgets.QRadioButton(self.groupBox)
self.rdbMotif.setObjectName("rdbMotif")
self.bgrpRadio.addButton(self.rdbMotif)
self.gridLayout.addWidget(self.rdbMotif, 2, 2, 1, 1)
self.gridLayout_2.addWidget(self.groupBox, 0, 0, 1, 1)
self.comboBox = QtWidgets.QComboBox(self.centralwidget)
self.comboBox.setObjectName("comboBox")
self.gridLayout_2.addWidget(self.comboBox, 1, 0, 1, 1)
self.btnMessageBox = QtWidgets.QPushButton(self.centralwidget)
self.btnMessageBox.setObjectName("btnMessageBox")
self.gridLayout_2.addWidget(self.btnMessageBox, 2, 0, 1, 1)
self.lblVersion = QtWidgets.QLabel(self.centralwidget)
self.lblVersion.setObjectName("lblVersion")
self.gridLayout_2.addWidget(self.lblVersion, 3, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 410, 36))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.groupBox.setTitle(_translate("MainWindow", "QWindowsStyle"))
self.rdbPlastique.setText(_translate("MainWindow", "plastique"))
self.rdbGTK.setText(_translate("MainWindow", "gtk"))
self.rdbMacintosh.setText(_translate("MainWindow", "macintosh"))
self.rdbWindowsXP.setText(_translate("MainWindow", "windowsxp"))
self.rdbWindows.setText(_translate("MainWindow", "windows"))
self.rdbWindowsVista.setText(_translate("MainWindow", "windowsvista"))
self.rdbFusion.setText(_translate("MainWindow", "fusion"))
self.rdbCDE.setText(_translate("MainWindow", "cde"))
self.rdbCleanLooks.setText(_translate("MainWindow", "cleanlooks"))
self.rdbMotif.setText(_translate("MainWindow", "motif"))
self.btnMessageBox.setText(_translate("MainWindow", "MessageBox"))
self.lblVersion.setText(_translate("MainWindow", "TextLabel"))
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.setWindowTitle("QMessageBox Style Test")
self.comboBox.addItems(['Выберите COM-порт', 'com1', 'com2', 'com3',])
verString = 'PyQt version: ' + QtCore.PYQT_VERSION_STR + '\n'
verString += 'Qt version__: ' + QtCore.qVersion()
self.lblVersion.setText(verString)
@QtCore.pyqtSlot(int)
def on_bgrpRadio_buttonClicked(self, button):
# имя стиля представляет собой строчную версию имени объекта с удаленным 'rdb'
style_name = self.bgrpRadio.checkedButton().objectName()
style_name = style_name.replace('rdb', '').lower()
print(style_name)
app.setStyle(QStyleFactory.create(style_name)) # !!!
@QtCore.pyqtSlot()
def on_btnMessageBox_clicked(self):
buttonReply = QMessageBox.question(
None, 'Exit', "Quit Program?",
QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
w = MainWindow()
w.show()
print(f'\nQStyleFactory.keys(): \n {QtWidgets.QStyleFactory.keys()}\n') # !!!
sys.exit(app.exec())


