Qt Style Sheets в Python — как использовать

В этом уроке вы узнаете, как использовать 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, мы перевернем следующее окно входа:

Пример установки таблицы стилей для виджета

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

Использование метода setStyleSheet()

Следующая программа создает окно входа в систему, показанное на первом рисунке, без каких-либо таблиц стилей.

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 - Qt Designer Шаг 1

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

Введение Qt Style Sheets в Style Sheet Editor

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

Таблица стилей Qt - Qt Designer Шаг 3

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *