ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 05.12.2023
Просмотров: 843
Скачиваний: 3
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
442
Часть II. Библиотека PyQt 5 form.addRow("&Описание:", textEdit) form.addRow(hbox) window.setLayout(form) window.show() sys.exit(app.exec_())
Класс
QFormLayout поддерживает следующие методы (здесь приведены только основные — полный их список смотрите на странице https://doc.qt.io/qt-5/qformlayout.html):
addRow()
— добавляет строку в конец контейнера. Форматы метода: addRow(<Текст надписи>, <Компонент> | <Контейнер>) addRow(
Первый формат позволяет задать текст надписи, которая будет помещена в первую ко- лонку формы, и компонент или контейнер, помещаемый во вторую колонку. В тексте надписи можно указать символ
&
, который пометит клавишу быстрого доступа для этого компонента (контейнера). Второй формат использует в качестве надписи компонент класса
QLabel
(он представляет надпись) — в этом случае связь с компонентом (контей- нером) необходимо устанавливать вручную, передав ссылку на него в метод setBuddy()
Третий формат заставляет компонент (контейнер) занять сразу обе колонки формы;
insertRow()
— добавляет строку в указанную позицию контейнера. Если в первом пара- метре задано отрицательное значение, компонент добавляется в конец контейнера. Фор- маты метода: insertRow(<Индекс>, <Текст надписи>, <Компонент> | <Контейнер>) insertRow(<Индекс>,
setFormAlignment(<Режим>)
— задает режим выравнивания формы (допустимые значе- ния мы рассматривали в разд. 20.2): form.setFormAlignment(
QtCore.Qt.AlignRight | QtCore.Qt.AlignBottom)
setLabelAlignment(<Режим>)
— задает режим выравнивания надписи (допустимые зна- чения мы рассматривали в разд. 20.2). Вот пример выравнивания по правому краю: form.setLabelAlignment(QtCore.Qt.AlignRight)
setRowWrapPolicy(<Режим>)
— задает местоположение надписей. В качестве параметра указываются следующие атрибуты класса
QFormLayout
:
•
DontWrapRows
—
0
— надписи расположены слева от компонентов;
•
WrapLongRows
—
1
— длинные надписи могут находиться выше компонентов, а ко- роткие надписи — слева от компонентов;
•
WrapAllRows
—
2
— надписи всегда расположены выше компонентов;
setFieldGrowthPolicy(<Режим>)
— задает режим управления размерами компонентов.
В качестве параметра указываются следующие атрибуты класса
QFormLayout
:
•
FieldsStayAtSizeHint
—
0
— компоненты всегда будут принимать рекомендуемые
(возвращаемые методом sizeHint()
) размеры;
•
ExpandingFieldsGrow
—
1
— компоненты, для которых установлена политика изме- нения размеров
QSizePolicy.Expanding или
QSizePolicy.MinimumExpanding
, займут
Глава 20. Размещение компонентов в окнах
443 всю доступную ширину. Размеры остальных компонентов всегда будут соответство- вать рекомендуемым;
•
AllNonFixedFieldsGrow
—
2
— все компоненты (если это возможно) займут всю дос- тупную ширину;
setContentsMargins()
— задает величины отступов от границ сетки до компонентов.
Форматы метода: setContentsMargins(<Слева>, <Сверху>, <Справа>, <Снизу>) setContentsMargins(
setSpacing(<Значение>)
— задает расстояние между компонентами по горизонтали и вертикали;
setHorizontalSpacing(<Значение>)
— задает расстояние между компонентами по гори- зонтали;
setVerticalSpacing(<Значение>)
— задает расстояние между компонентами по вертикали.
Для удаления и замены компонентов следует пользоваться методами removeWidget()
и replaceWidget()
, описанными в разд. 20.2.
20.5. Классы QStackedLayout и QStackedWidget
Класс
QStackedLayout реализует стек компонентов — в один момент времени показывается только один компонент, а вывод другого компонента выполняется программно. Иерархия наследования выглядит так:
(QObject, QLayoutItem) — QLayout — QStackedLayout
Создать экземпляр класса
QStackedLayout можно следующим образом:
<Объект> = QStackedLayout([<Родитель>])
В необязательном параметре можно задать ссылку на родительский компонент или контей- нер. Если параметр не указан, следует передать ссылку на контейнер в метод setLayout()
родительского компонента.
Класс
QStackedLayout поддерживает следующие методы:
addWidget(<Компонент>)
— добавляет компонент в конец контейнера. Метод возвращает индекс добавленного компонента;
insertWidget(<Индекс>, <Компонент>)
— добавляет компонент в указанную позицию контейнера. Метод возвращает индекс добавленного компонента;
setCurrentIndex(<Индекс>)
— делает видимым компонент с указанным индексом. Ме- тод является слотом;
currentIndex()
— возвращает индекс видимого компонента;
setCurrentWidget(<Компонент>)
— делает видимым указанный компонент. Метод явля- ется слотом;
currentWidget()
— возвращает ссылку на видимый компонент;
setStackingMode(<Режим>)
— задает режим отображения компонентов. В параметре могут быть указаны следующие атрибуты из класса
QStackedLayout
:
•
StackOne
—
0
— только один компонент видим (значение по умолчанию);
•
StackAll
—
1
— видны все компоненты;
444
Часть II. Библиотека PyQt 5
stackingMode()
— возвращает режим отображения компонентов;
count()
— возвращает количество компонентов внутри контейнера;
widget(<Индекс>)
— возвращает ссылку на компонент, который расположен по указан- ному индексу, или значение
None
Для удаления и замены компонентов следует пользоваться методами removeWidget()
и replaceWidget()
, описанными в разд. 20.2.
Класс
QStackedLayout поддерживает следующие сигналы:
currentChanged(<Индекс>)
— генерируется при изменении видимого компонента. Через параметр внутри обработчика доступен целочисленный индекс нового компонента;
widgetRemoved(<Индекс>)
— генерируется при удалении компонента из контейнера. Че- рез параметр внутри обработчика доступен целочисленный индекс удаленного компо- нента.
Класс
QStackedWidget также реализует стек компонентов, но представляет собой компонент, а не контейнер. Иерархия наследования выглядит так:
(QObject, QPaintDevice) — QWidget — QFrame — QStackedWidget
Создать экземпляр этого класса можно следующим образом:
<Объект> = QStackedWidget([<Родитель>])
Класс
QStackedWidget поддерживает методы addWidget()
, insertWidget()
, removeWidget()
, replaceWidget()
, count()
, currentIndex()
, currentWidget()
, widget()
, setCurrentIndex()
и setCurrentWidget()
, которые выполняют те же действия, что и одноименные методы в клас- се
QStackedLayout
. Кроме того, класс
QStackedWidget наследует все методы из базовых классов и определяет два дополнительных:
indexOf(<Компонент>)
— возвращает индекс компонента, ссылка на который указана в параметре;
__len__()
— возвращает количество компонентов. Метод вызывается при использова- нии функции len()
, а также для проверки объекта на логическое значение.
Чтобы отследить изменения внутри компонента, следует назначить обработчики сигналов currentChanged и widgetRemoved
20.6. Класс QSizePolicy
Если в вертикальный контейнер большой высоты добавить надпись и кнопку, то кнопка займет пространство, совпадающее с рекомендуемыми размерами (которые возвращает ме- тод sizeHint()
), а под надпись будет выделено все остальное место. Управление размерами компонентов внутри контейнера определяется правилами, установленными с помощью класса
QSizePolicy
. Установить эти правила для компонента можно с помощью мето- да setSizePolicy(
класса
QWidget
, а получить их — с помощью метода sizePolicy()
Создать экземпляр класса
QSizePolicy
(он определен в модуле
QtWidgets
) можно следую- щим способом:
<Объект> = QSizePolicy([<Правило для горизонтали>,
<Правило для вертикали>[, <Тип компонента>]])
Глава 20. Размещение компонентов в окнах
445
Если параметры не заданы, размер компонента должен точно соответствовать размерам, возвращаемым методом sizeHint()
. В первом и втором параметрах указывается один из следующих атрибутов класса
QSizePolicy
:
Fixed
— размер компонента должен точно соответствовать размерам, возвращаемым методом sizeHint()
;
Minimum
— размер, возвращаемый методом sizeHint()
, является минимальным для ком- понента и может быть увеличен при необходимости;
Maximum
— размер, возвращаемый методом sizeHint()
, является максимальным для компонента и может быть уменьшен при необходимости;
Preferred
— размер, возвращаемый методом sizeHint()
, является предпочтительным и может быть как увеличен, так и уменьшен;
Expanding
— размер, возвращаемый методом sizeHint()
, может быть как увеличен, так и уменьшен. Компонент займет все свободное пространство в контейнере;
MinimumExpanding
— размер, возвращаемый методом sizeHint()
, является минимальным для компонента. Компонент займет все свободное пространство в контейнере;
Ignored
— размер, возвращаемый методом sizeHint()
, игнорируется. Компонент займет все свободное пространство в контейнере.
Изменить правила управления размерами уже после создания экземпляра класса
QSizePolicy позволяют методы setHorizontalPolicy(<Правило для горизонтали>)
и setVerticalPolicy(<Правило для вертикали>)
С помощью методов setHorizontalStretch(<Фактор для горизонтали>)
и setVerticalStretch(<Фактор для вертикали>)
можно указать фактор растяжения. Чем больше указанное значение относительно значения, заданного в других компонентах, тем больше места будет выделяться под компонент. Этот параметр можно сравнить с жест- костью пружины.
Можно указать, что минимальная высота компонента зависит от его ширины. Для этого необходимо передать значение
True в метод setHeightForWidth(<Флаг>)
. Кроме того, следу- ет в классе компонента переопределить метод heightForWidth(<Ширина>)
— переопределен- ный метод должен возвращать высоту компонента для указанной в параметре ширины.
20.7. Объединение компонентов в группу
Состояние одних компонентов может зависеть от состояния других — например, из не- скольких переключателей можно выбрать только один. Кроме того, некоторый набор ком- понентов может использоваться для ввода связанных данных — например, имени, отчества и фамилии пользователя. В этом случае компоненты объединяют в группу.
Группа компонентов отображается внутри рамки, на верхней границе которой выводится текст заголовка. Реализовать группу позволяет класс
QGroupBox
. Иерархия наследования выглядит так:
(QObject, QPaintDevice) — QWidget — QGroupBox
Создать экземпляр класса
QGroupBox можно следующим образом:
<Объект> = QGroupBox([<Родитель>])
<Объект> = QGroupBox(<Текст>[, <Родитель>])
446
Часть II. Библиотека PyQt 5
В необязательном параметре
<Родитель>
можно указать ссылку на родительский компонент.
Параметр
<Текст>
задает текст заголовка, который отобразится на верхней границе рамки.
Внутри текста заголовка символ
&
, указанный перед буквой, задает комбинацию клавиш быстрого доступа. В этом случае буква, перед которой указан символ
&
, будет — в качестве подсказки пользователю — подчеркнута. При одновременном нажатии клавиши
После создания экземпляра класса
QGroupBox следует добавить компоненты в какой-либо контейнер, а затем передать ссылку на контейнер в метод setLayout()
группы.
Типичный пример использования класса
QGroupBox представлен кодом из листинга 20.5.
Созданная им группа показана на рис. 20.4.
Листинг 20.5. Пример использования компонента QGroupBox
# -*- coding: utf-8 -*- from PyQt5 import QtWidgets import sys app = QtWidgets.QApplication(sys.argv) window = QtWidgets.QWidget() window.setWindowTitle("QGroupBox") window.resize(200, 80) mainbox = QtWidgets.QVBoxLayout() radio1 = QtWidgets.QRadioButton("&Да") radio2 = QtWidgets.QRadioButton("&Нет") box = QtWidgets.QGroupBox("&Вы знаете язык Python?") # Объект группы hbox = QtWidgets.QHBoxLayout() # Контейнер для группы hbox.addWidget(radio1) # Добавляем компоненты hbox.addWidget(radio2) box.setLayout(hbox) # Передаем ссылку на контейнер mainbox.addWidget(box) # Добавляем группу в главный контейнер window.setLayout(mainbox) # Передаем ссылку на главный контейнер в окно radio1.setChecked(True) # Выбираем первый переключатель window.show() sys.exit(app.exec_())
Рис. 20.4. Пример использования компонента
QGroupBox
Класс
QGroupBox поддерживает следующие методы (здесь приведены только основные — полный их список смотрите на странице https://doc.qt.io/qt-5/qgroupbox.html):
setTitle(<Текст>)
— задает текст заголовка;
title()
— возвращает текст заголовка;
Глава 20. Размещение компонентов в окнах
447
setAlignment(<Выравнивание>)
— задает горизонтальное выравнивание текста заголовка.
В параметре указываются следующие атрибуты класса
QtCore.Qt
:
AlignLeft
,
AlignHCenter или
AlignRight
: box.setAlignment(QtCore.Qt.AlignRight)
alignment()
— возвращает горизонтальное выравнивание текста заголовка;
setCheckable(<Флаг>)
— если в параметре указать значение
True
, то перед текстом заго- ловка будет отображен флажок. Если флажок установлен, группа станет активной, а если флажок снят, все компоненты внутри группы окажутся неактивными. По умолча- нию флажок не отображается;
isCheckable()
— возвращает значение
True
, если перед заголовком выводится флажок, и
False
— в противном случае;
setChecked(<Флаг>)
— если в параметре указать значение
True
, флажок, отображаемый перед текстом подсказки, будет установлен. Значение
False сбрасывает флажок. Метод является слотом;
isChecked()
— возвращает значение
True
, если флажок, отображаемый перед текстом заголовка, установлен, и
False
— в противном случае;
setFlat(<Флаг>)
— если в параметре указано значение
True
, будет отображаться только верхняя граница рамки, а если
False
— то все границы рамки;
isFlat()
— возвращает значение
True
, если отображается только верхняя граница рам- ки, и
False
— если все границы рамки.
Класс
QGroupBox поддерживает сигналы:
clicked(<Состояние флажка>)
— генерируется при щелчке мышью на флажке, выводи- мом перед текстом заголовка. Если состояние флажка изменяется с помощью метода setChecked()
, сигнал не генерируется. Через параметр внутри обработчика доступно значение
True
, если флажок установлен, и
False
— если сброшен;
toggled(<Состояние флажка>)
— генерируется при изменении состояния флажка, выво- димого перед текстом заголовка. Через параметр внутри обработчика доступно значение
True
, если флажок установлен, и
False
— если сброшен.
20.8. Панель с рамкой
Класс
QFrame расширяет возможности класса
QWidget за счет добавления рамки вокруг ком- понента. Этот класс, в свою очередь, наследуют некоторые компоненты, например надписи, многострочные текстовые поля и др. Иерархия наследования выглядит так:
(QObject, QPaintDevice) — QWidget — QFrame
Конструктор класса
QFrame имеет следующий формат:
<Объект> = QFrame([parent=<Родитель>][, flags=<Тип окна>])
В параметре parent указывается ссылка на родительский компонент. Если параметр не ука- зан или имеет значение
None
, компонент будет обладать своим собственным окном. Если в параметре flags указан тип окна, компонент, имея родителя, будет обладать своим собст- венным окном, но окажется привязан к родителю. Это позволяет, например, создать модальное окно, которое будет блокировать только окно родителя, но не все окна приложе- ния. Какие именно значения можно указать в параметре flags
, мы уже рассматривали в разд. 18.2.
448
Часть II. Библиотека PyQt 5
Класс
QFrame поддерживает следующие методы (здесь приведены только основные — пол- ный их список смотрите на странице https://doc.qt.io/qt-5/qframe.html):
setFrameShape(<Форма>)
— задает форму рамки. Могут быть указаны следующие атри- буты класса
QFrame
:
•
NoFrame
—
0
— нет рамки;
•
Box
—
1
— прямоугольная рамка;
•
Panel
—
2
— панель, которая может быть выпуклой или вогнутой;
•
WinPanel
—
3
— панель в стиле Windows 2000, которая может быть выпуклой или во- гнутой. Ширина границы — 2 пиксела. Этот атрибут присутствует для совместимо- сти со старыми версиями Qt;
•
HLine
—
4
— горизонтальная линия. Используется как разделитель;
•
VLine
—
5
— вертикальная линия без содержимого;
•
StyledPanel
—
6
— панель, внешний вид которой зависит от текущего стиля. Она может быть выпуклой или вогнутой. Это рекомендуемая форма рамки для панелей;
setFrameShadow(<Тень>)
— задает стиль тени. Могут быть указаны следующие атрибуты класса
QFrame
:
•
Plain
—
16
— нет тени;
•
Raised
—
32
— панель отображается выпуклой;
•
Sunken
—
48
— панель отображается вогнутой;
setFrameStyle(<Стиль>)
— задает форму рамки и стиль тени одновременно. В качестве значения через оператор
|
указывается комбинация приведенных ранее атрибутов класса
QFrame
: frame.setFrameStyle(QtWidgets.QFrame.Panel | QtWidgets.QFrame.Raised)
setLineWidth(<Ширина>)
— задает ширину линий у рамки;
setMidLineWidth(<Ширина>)
— задает ширину средней линии у рамки. Средняя линия используется для создания эффекта выпуклости и вогнутости и доступна только для форм рамки
Box
,
HLine и
VLine
20.9. Панель с вкладками
Для создания панели с вкладками («блокнота») предназначен класс
QTabWidget
. Панель со- стоит из области заголовка с ярлыками и набора вкладок с различными компонентами.
В один момент времени показывается содержимое только одной вкладки. Щелчок мышью на ярлыке в области заголовка приводит к отображению содержимого соответствующей вкладки.
Иерархия наследования для класса
QTabWidget выглядит так:
(QObject, QPaintDevice) — QWidget — QTabWidget
Конструктор класса
QTabWidget имеет следующий формат:
<Объект> = QTabWidget([<Родитель>])
В параметре
<Родитель>
указывается ссылка на родительский компонент. Если он не указан, компонент будет обладать своим собственным окном.
Глава 20. Размещение компонентов в окнах
449
Пример кода, создающего компонент
QTabWidget
, приведен в листинге 20.6. Сама панель с вкладками показана на рис. 20.5.
Листинг 20.6. Пример использования компонента QTabWidget
# -*- coding: utf-8 -*- from PyQt5 import QtWidgets import sys app = QtWidgets.QApplication(sys.argv) window = QtWidgets.QWidget() window.setWindowTitle("QTabWidget") window.resize(400, 100) tab = QtWidgets.QTabWidget() tab.addTab(QtWidgets.QLabel("Содержимое вкладки 1"), "Вкладка &1") tab.addTab(QtWidgets.QLabel("Содержимое вкладки 2"), "Вкладка &2") tab.addTab(QtWidgets.QLabel("Содержимое вкладки 3"), "Вкладка &3") tab.setCurrentIndex(0) vbox = QtWidgets.QVBoxLayout() vbox.addWidget(tab) window.setLayout(vbox) window.show() window.show() sys.exit(app.exec_())
Рис. 20.5. Панель с вкладками
QTabWidget
Класс
QTabWidget поддерживает следующие методы (здесь приведены только основные — полное описание класса содержится на странице https://doc.qt.io/qt-5/qtabwidget.html):
addTab()
— добавляет вкладку в конец контейнера и возвращает ее индекс. Форматы метода: addTab(<Компонент>, <Текст заголовка>) addTab(<Компонент>,
В параметре
<Компонент>
указывается ссылка на компонент, который будет отображать- ся на вкладке. Чаще всего этот компонент является лишь родителем для других компо- нентов. Параметр
<Текст заголовка>
задает текст, который будет отображаться на ярлы- ке в области заголовка. Внутри текста заголовка символ
&
, указанный перед буквой, за- дает комбинацию клавиш быстрого доступа. В этом случае буква, перед которой указан символ
&
, будет — в качестве подсказки пользователю — подчеркнута. При одновре- менном нажатии клавиши