В этом уроке вы узнаете, как использовать Qt Style Sheet в Python для настройки виджетов приложений PyQt.
Знакомство с Qt Style Sheet
Qt Style Sheets или QSS очень похоже на Cascading Style Sheets(CSS) для web. Однако QSS поддерживает только ограниченное количество правил по сравнению с CSS. Например, QSS поддерживает модель box, но не поддерживает макеты flexbox и grid.
Чтобы установить стили таблиц для виджета, вы вызываете его метод setStyleSheet() со строкой таблицы стилей. Чтобы продемонстрировать QSS, мы перевернем следующее окно входа:

…в следующее окно входа:

Следующая программа создает окно входа в систему, показанное на первом рисунке, без каких-либо таблиц стилей.
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QPushButton, QVBoxLayout
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QIcon
class MainWindow(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setWindowTitle('Login')
self.setWindowIcon(QIcon('./assets/lock.png'))
layout = QVBoxLayout()
self.setLayout(layout)
heading = QLabel(
'Welcome Back',
alignment=Qt.AlignmentFlag.AlignHCenter
)
heading.setObjectName('heading')
subheading = QLabel(
'Please enter your email and password to log in.',
alignment=Qt.AlignmentFlag.AlignHCenter
)
subheading.setObjectName('subheading')
self.email = QLineEdit(self)
self.email.setPlaceholderText('Enter your email')
self.password = QLineEdit(self)
self.password.setEchoMode(QLineEdit.EchoMode.Password)
self.password.setPlaceholderText('Enter your password')
self.btn_login = QPushButton('Login')
layout.addStretch()
layout.addWidget(heading)
layout.addWidget(subheading)
layout.addWidget(QLabel('Email:'))
layout.addWidget(self.email)
layout.addWidget(QLabel('Password:'))
layout.addWidget(self.password)
layout.addWidget(self.btn_login)
layout.addStretch()
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec())
- Сначала сделаем фон QWidget белым:
QWidget {
background-color: #fff;
}
- Во-вторых, изменим цвет и толщину шрифта QLabel:
QLabel {
color: #464d55;
font-weight: 600;
}
- В-третьих, изменим цвет, размер шрифта и отступ снизу QLabel с заголовком имени объекта:
QLabel#heading {
color: #0f1925;
font-size: 18px;
margin-bottom: 10px;
}
- В-четвертых, изменим цвет, размер шрифта, насыщенность шрифта и отступ снизу QLabel с подзаголовком имени объекта:
QLabel#subheading {
color: #0f1925;
font-size: 12px;
font-weight: normal;
margin-bottom: 10px;
}
- В-пятых, изменим радиус скругления, стиль границы и отступ виджета QLineEdit:
QLineEdit {
border-radius: 8px;
border: 1px solid #e0e4e7;
padding: 5px 15px;
}
- В-шестых, выделим границу QLineEdit, когда он находится в фокусе:
QLineEdit:focus {
border: 1px solid #d0e3ff;
}
- В-седьмых, изменим цвет заполнителя:
QLineEdit::placeholder {
color: #767e89;
}
- Восьмое, сделаем кнопку QPushButton круглой и синей, а цвет текста — белым:
QPushButton {
background-color: #0d6efd;
color: #fff;
font-weight: 600;
border-radius: 8px;
border: 1px solid #0d6efd;
padding: 5px 15px;
margin-top: 10px;
outline: 0px;
}
- Девятое, изменим границу QPushButton при наведении или фокусе:
QPushButton:hover,
QPushButton:focus {
background-color: #0b5ed7;
border: 3px solid #9ac3fe;
}
- В-десятых, поместим все правила QSS в файл типа login.qss:
QWidget {
background-color: #fff;
}
QLabel {
color: #464d55;
font-weight: 600;
}
QLabel#heading {
color: #0f1925;
font-size: 18px;
margin-bottom: 10px;
}
QLabel#subheading {
color: #0f1925;
font-size: 12px;
font-weight: normal;
margin-bottom: 10px;
}
QLineEdit {
border-radius: 8px;
border: 1px solid #e0e4e7;
padding: 5px 15px;
}
QLineEdit:focus {
border: 1px solid #d0e3ff;
}
QLineEdit::placeholder {
color: #767e89;
}
QPushButton {
background-color: #0d6efd;
color: #fff;
font-weight: 600;
border-radius: 8px;
border: 1px solid #0d6efd;
padding: 5px 15px;
margin-top: 10px;
outline: 0px;
}
QPushButton:hover,
QPushButton:focus {
background-color: #0b5ed7;
border: 3px solid #9ac3fe;
}
- Наконец, считаем QSS из файла login.qss и передадим содержимое методу setStyleSheet() метода QApplication:
app.setStyleSheet(Path('login.qss').read_text())
Вот полная программа:
import sys
from pathlib import Path
from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QPushButton, QVBoxLayout
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QIcon
class MainWindow(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setWindowTitle('Login')
self.setWindowIcon(QIcon('./assets/lock.png'))
layout = QVBoxLayout()
self.setLayout(layout)
heading = QLabel(
'Welcome Back',
alignment=Qt.AlignmentFlag.AlignHCenter
)
heading.setObjectName('heading')
subheading = QLabel(
'Please enter your email and password to log in.',
alignment=Qt.AlignmentFlag.AlignHCenter
)
subheading.setObjectName('subheading')
self.email = QLineEdit(self)
self.email.setPlaceholderText('Enter your email')
self.password = QLineEdit(self)
self.password.setEchoMode(QLineEdit.EchoMode.Password)
self.password.setPlaceholderText('Enter your password')
self.btn_login = QPushButton('Login')
layout.addStretch()
layout.addWidget(heading)
layout.addWidget(subheading)
layout.addWidget(QLabel('Email:'))
layout.addWidget(self.email)
layout.addWidget(QLabel('Password:'))
layout.addWidget(self.password)
layout.addWidget(self.btn_login)
layout.addStretch()
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyleSheet(Path('login.qss').read_text())
window = MainWindow()
sys.exit(app.exec())
Настройка Qt Style sheets в Qt Designer
Сначала щелкните правой кнопкой мыши форму и выберите «Change StyleSheet… menu»:

Во-вторых, введите Qt Style Sheets в Style Sheet Editor и нажмите кнопку Apply. После применения QSS вы увидите его эффект в дизайне:

В-третьих, закройте редактор таблиц стилей и просмотрите форму(Ctrl-R):

