Главная страница

ээдд. Прохоренок_Н_А__Дронов_В_А_Python_3_и_PyQt_5_Разработка_приложен. Николай Прохоренок Владимир Дронов


Скачать 7.92 Mb.
НазваниеНиколай Прохоренок Владимир Дронов
Дата05.05.2023
Размер7.92 Mb.
Формат файлаpdf
Имя файлаПрохоренок_Н_А__Дронов_В_А_Python_3_и_PyQt_5_Разработка_приложен.pdf
ТипДокументы
#1111379
страница41 из 83
1   ...   37   38   39   40   41   42   43   44   ...   83
20.2. Горизонтальное и вертикальное выравнивание
Компоненты-контейнеры (их еще называют менеджерами компоновки и менеджерами геометрии) лишены недостатков абсолютного позиционирования. При изменении размеров окна производится автоматическое изменение характеристик всех компонентов, добавлен- ных в контейнер. Настройки шрифта при этом также учитываются, поэтому изменение раз- меров шрифта в два раза приведет только к увеличению компонентов и окон.
Для автоматического выравнивания компонентов используются два класса:

QHBoxLayout
— выстраивает все добавляемые компоненты по горизонтали (по умолча- нию — слева направо). Конструктор класса имеет следующий формат:
<Объект> = QHBoxLayout([<Родитель>])

QVBoxLayout
— выстраивает все добавляемые компоненты по вертикали (по умолча- нию — сверху вниз). Формат конструктора класса:
<Объект> = QVBoxLayout([<Родитель>])
Иерархия наследования для этих классов выглядит так:
(QObject, QLayoutItem) — QLayout — QBoxLayout — QHBoxLayout
(QObject, QLayoutItem) — QLayout — QBoxLayout — QVBoxLayout
Обратите внимание, что указанные классы не являются наследниками класса
QWidget
, а сле- довательно, не обладают собственным окном и не могут использоваться отдельно. Поэтому контейнеры обязательно должны быть привязаны к родительскому компоненту. Передать ссылку на родительский компонент можно в конструкторе классов
QHBoxLayout и
QVBoxLayout
. Кроме того, можно передать ссылку на контейнер в метод setLayout()
роди-

436
Часть II. Библиотека PyQt 5 тельского компонента. После этого все компоненты, добавленные в контейнер, автоматиче- ски привязываются к родительскому компоненту.
Типичный пример использования класса
QHBoxLayout показан в листинге 20.2, а увидеть результат выполнения этого кода можно на рис. 20.1.
Листинг 20.2. Использование контейнера QHBoxLayout
# -*- coding: utf-8 -*- from PyQt5 import QtWidgets import sys app = QtWidgets.QApplication(sys.argv) window = QtWidgets.QWidget() # Родительский компонент — окно window.setWindowTitle("QHBoxLayout") window.resize(300, 60) button1 = QtWidgets.QPushButton("1") button2 = QtWidgets.QPushButton("2") hbox = QtWidgets.QHBoxLayout() # Создаем контейнер hbox.addWidget(button1) # Добавляем компоненты hbox.addWidget(button2) window.setLayout(hbox) # Передаем ссылку родителю window.show() sys.exit(app.exec_())
Рис. 20.1. Контейнер
QHBoxLayout с двумя кнопками
Добавить компоненты в контейнер, удалить их и заменить другими позволяют следующие методы:
 addWidget()
— добавляет компонент в конец контейнера. Формат метода: addWidget(<Компонент>[, stretch=0][, alignment=0])
В первом параметре указывается ссылка на компонент. Необязательный параметр stretch задает фактор растяжения для ячейки, а параметр alignment
— выравнивание компонента внутри ячейки. Два последних параметра можно задавать в порядке следо- вания или по именам в произвольном порядке: hbox.addWidget(button1, 10, QtCore.Qt.AlignRight) hbox.addWidget(button2, stretch=10) hbox.addWidget(button3, alignment=QtCore.Qt.AlignRight)
 insertWidget()
— добавляет компонент в указанную позицию контейнера. Формат ме- тода: insertWidget(<Индекс>, <Компонент>[, stretch=0][, alignment=0])
Если в первом параметре указано значение
0
, компонент будет добавлен в начало кон- тейнера, а если — отрицательное значение, компонент добавляется в конец контейнера.

Глава 20. Размещение компонентов в окнах
437
Иное значение указывает определенную позицию. Остальные параметры аналогичны параметрам метода addWidget()
: hbox.addWidget(button1) hbox.insertWidget(-1, button2) # Добавление в конец hbox.insertWidget(0, button3) # Добавление в начало
 removeWidget(<Компонент>)
— удаляет указанный компонент из контейнера;
 replaceWidget()
— заменяет присутствующий в контейнере компонент другим. Формат метода: replaceWidget(<Заменяемый компонент>, <Заменяющий компонент>
[, options= FindChildrenRecursively])
В необязательном параметре options можно задать режим поиска заменяемого компо- нента с помощью одного из атрибутов класса
QtCore.Qt
:
FindDirectChildrenOnly
(
0
, ис- кать только среди содержимого текущего контейнера) и
FindChildrenRecursively
(
1
, ис- кать среди содержимого текущего и всех вложенных в него контейнеров — поведение по умолчанию);
 addLayout()
— добавляет другой контейнер в конец текущего контейнера. С помощью этого метода можно вкладывать один контейнер в другой, создавая таким образом структуру любой сложности. Формат метода: addLayout(<Контейнер>[, stretch=0])
 insertLayout()
— добавляет другой контейнер в указанную позицию текущего контей- нера. Если в первом параметре задано отрицательное значение, контейнер добавляется в конец. Формат метода: insertLayout(<Индекс>, <Контейнер>[, stretch=0])
 addSpacing(<Размер>)
— добавляет пустое пространство указанного размера в конец контейнера. Размер пустого пространства задается в пикселах: hbox.addSpacing(100)
 insertSpacing(<Индекс>, <Размер>)
— добавляет пустое пространство указанного раз- мера в определенную позицию. Размер пустого пространства задается в пикселах. Если первым параметром передается отрицательное значение, то пространство добавляется в конец;
 addStretch([stretch=0])
— добавляет пустое растягиваемое пространство с нулевым минимальным размером и фактором растяжения stretch в конец контейнера. Это про- странство можно сравнить с пружиной, вставленной между компонентами, а параметр stretch
— с жесткостью пружины;
 insertStretch(<Индекс>[, stretch=0])
— метод аналогичен методу addStretch()
, но добавляет растягиваемое пространство в указанную позицию. Если в первом параметре задано отрицательное значение, пространство добавляется в конец контейнера.
Параметр alignment в методах addWidget()
и insertWidget()
задает выравнивание компо- нента внутри ячейки. В этом параметре можно указать следующие атрибуты класса
QtCore.Qt
:

AlignLeft

1
— горизонтальное выравнивание по левому краю;

AlignRight

2
— горизонтальное выравнивание по правому краю;

AlignHCenter

4
— горизонтальное выравнивание по центру;

438
Часть II. Библиотека PyQt 5

AlignJustify

8
— заполнение всего пространства;

AlignTop

32
— вертикальное выравнивание по верхнему краю;

AlignBottom

64
— вертикальное выравнивание по нижнему краю;

AlignVCenter

128
— вертикальное выравнивание по центру;

AlignBaseline

256
— вертикальное выравнивание по базовой линии;

AlignCenter

AlignVCenter | AlignHCenter
— горизонтальное и вертикальное вырав- нивание по центру;

AlignAbsolute

16
— если в методе setLayoutDirection()
из класса
QWidget указан атрибут
QtCore.Qt.RightToLeft
, атрибут
AlignLeft задает выравнивание по правому краю, а атрибут
AlignRight
— по левому краю. Чтобы атрибут
AlignLeft всегда соответ- ствовал именно левому краю, необходимо указать комбинацию
AlignAbsolute |
AlignLeft
. Аналогично следует поступить с атрибутом
AlignRight
Можно задавать и комбинации атрибутов. В них может присутствовать только один атри- бут горизонтального выравнивания и только один атрибут вертикального выравнивания.
Например, комбинация
AlignLeft | AlignTop задает выравнивание по левому и верхнему краям. Противоречивые значения приводят к непредсказуемым результатам.
Помимо рассмотренных, контейнеры поддерживают также следующие методы (здесь при- ведены только основные — полный их список ищите в документации):
 setDirection(<Направление>)
— задает направление вывода компонентов. В параметре можно указать следующие атрибуты из класса
QBoxLayout
:

LeftToRight

0
— слева направо (значение по умолчанию для горизонтального кон- тейнера);

RightToLeft

1
— справа налево;

TopToBottom

2
— сверху вниз (значение по умолчанию для вертикального контей- нера);

BottomToTop

3
— снизу вверх;
 setContentsMargins()
— задает величины отступов от границ контейнера до компонен- тов. Форматы метода: setContentsMargins(<Слева>, <Сверху>, <Справа>, <Снизу>) setContentsMargins()
Примеры: hbox.setContentsMargins(2, 4, 2, 4) m = QtCore.QMargins(4, 2, 4, 2) hbox.setContentsMargins(m)
 setSpacing(<Расстояние>)
— задает расстояние между компонентами.
20.3. Выравнивание по сетке
Помимо выравнивания компонентов по горизонтали и вертикали, существует возможность размещения компонентов внутри ячеек сетки. Для этого предназначен класс
QGridLayout
Иерархия его наследования:
(QObject, QLayoutItem) — QLayout — QGridLayout

Глава 20. Размещение компонентов в окнах
439
Создать экземпляр класса
QGridLayout можно следующим образом:
<Объект> = QGridLayout([<Родитель>])
В необязательном параметре можно указать ссылку на родительский компонент. Если тако- вой не указан, следует передать ссылку на сетку в метод setLayout()
родительского компо- нента. Код, иллюстрирующий типичный пример использования класса
QGridLayout
, пред- ставлен в листинге 20.3, а результат его выполнения — на рис. 20.2.
Листинг 20.3. Использование контейнера QGridLayout
# -*- coding: utf-8 -*- from PyQt5 import QtWidgets import sys app = QtWidgets.QApplication(sys.argv) window = QtWidgets.QWidget() # Родительский компонент — окно window.setWindowTitle("QGridLayout") window.resize(150, 100) button1 = QtWidgets.QPushButton("1") button2 = QtWidgets.QPushButton("2") button3 = QtWidgets.QPushButton("3") button4 = QtWidgets.QPushButton("4") grid = QtWidgets.QGridLayout() # Создаем сетку grid.addWidget(button1, 0, 0) # Добавляем компоненты grid.addWidget(button2, 0, 1) grid.addWidget(button3, 1, 0) grid.addWidget(button4, 1, 1) window.setLayout(grid) # Передаем ссылку родителю window.show() sys.exit(app.exec_())
Рис. 20.2. Компонент
QGridLayout с четырьмя кнопками
Добавить компоненты позволяют следующие методы:
 addWidget()
— добавляет компонент в указанную ячейку сетки. Метод имеет следую- щие форматы: addWidget(<Компонент>, <Строка>, <Столбец>[, alignment=0]) addWidget(<Компонент>, <Строка>, <Столбец>, <Количество строк>,
<Количество столбцов>[, alignment=0])
В первом параметре указывается ссылка на компонент, во втором параметре — индекс строки, а в третьем — индекс столбца. Нумерация строк и столбцов начинается с нуля.
Параметр
<Количество строк>
задает количество занимаемых компонентом ячеек по

440
Часть II. Библиотека PyQt 5 вертикали, а параметр
<Количество столбцов>
— по горизонтали. Параметр alignment задает выравнивание компонента внутри ячейки. Значения, которые можно указать в этом параметре, мы рассматривали в предыдущем разделе.
Пример: grid = QtGui.QGridLayout() grid.addWidget(button1, 0, 0, alignment=QtCore.Qt.AlignLeft) grid.addWidget(button2, 0, 1, QtCore.Qt.AlignRight) grid.addWidget(button3, 1, 0, 1, 2)
 addLayout()
— добавляет контейнер в указанную ячейку сетки. Метод имеет следующие форматы: addLayout(<Контейнер>, <Строка>, <Столбец>[, alignment=0]) addLayout(<Контейнер>, <Строка>, <Столбец>, <Количество строк>,
<Количество столбцов>[, alignment=0])
В первом параметре указывается ссылка на контейнер. Остальные параметры аналогич- ны параметрам метода addWidget()
Для удаления и замены компонентов следует пользоваться методами removeWidget()
и replaceWidget()
, описанными в разд. 20.2.
Класс
QGridLayout поддерживает следующие методы (здесь приведены только основные методы — полный их список смотрите на странице https://doc.qt.io/qt-5/qgridlayout.html):
 setRowMinimumHeight(<Индекс>, <Высота>)
— задает минимальную высоту строки с ин- дексом
<Индекс>
;
 setColumnMinimumWidth(<Индекс>, <Ширина>)
— задает минимальную ширину столбца с индексом
<Индекс>
;
 setRowStretch(<Индекс>, <Фактор растяжения>)
— задает фактор растяжения по верти- кали для строки с индексом
<Индекс>
;
 setColumnStretch(<Индекс>, <Фактор растяжения>)
— задает фактор растяжения по го- ризонтали для столбца с индексом
<Индекс>
;
 setContentsMargins()
— задает величины отступов от границ сетки до компонентов.
Форматы метода: setContentsMargins(<Слева>, <Сверху>, <Справа>, <Снизу>) setContentsMargins()
 setSpacing(<Значение>)
— задает расстояние между компонентами по горизонтали и вертикали;
 setHorizontalSpacing(<Значение>)
— задает расстояние между компонентами по гори- зонтали;
 setVerticalSpacing(<Значение>)
— задает расстояние между компонентами по вертикали;
 rowCount()
— возвращает количество строк сетки;
 columnCount()
— возвращает количество столбцов сетки;
 cellRect(<Индекс строки>, <Индекс колонки>)
— возвращает экземпляр класса
QRect
, который хранит координаты и размеры ячейки, расположенной на пересечении строки и колонки с указанными индексами.

Глава 20. Размещение компонентов в окнах
441 20.4. Выравнивание компонентов формы
Класс
QFormLayout позволяет выравнивать компоненты формы. Контейнер по умолчанию состоит из двух столбцов: первый предназначен для вывода надписи, а второй — для выво- да самого компонента. При этом надпись связывается с компонентом, что позволяет назна- чать клавиши быстрого доступа, указав символ
&
перед буквой внутри текста надписи. По нажатию комбинации клавиш быстрого доступа (комбинация +<буква>) в фокусе окажется компонент, расположенный справа от надписи. Иерархия наследования выглядит так:
(QObject, QLayoutItem) — QLayout — QFormLayout
Создать экземпляр класса
QFormLayout можно следующим образом:
<Объект> = QFormLayout([<Родитель>])
В необязательном параметре можно указать ссылку на родительский компонент. Если тако- вой не указан, необходимо передать ссылку на контейнер в метод setLayout()
родительско- го компонента.
В листинге 20.4 показан код, создающий форму с контейнером
QFormLayout
. Результат выполнения этого кода можно увидеть на рис. 20.3.
Рис. 20.3. Пример использования контейнера
QFormLayout
Листинг 20.4. Использование контейнера QFormLayout
# -*- coding: utf-8 -*- from PyQt5 import QtWidgets import sys app = QtWidgets.QApplication(sys.argv) window = QtWidgets.QWidget() window.setWindowTitle("QFormLayout") window.resize(300, 150) lineEdit = QtWidgets.QLineEdit() textEdit = QtWidgets.QTextEdit() button1 = QtWidgets.QPushButton("О&тправить") button2 = QtWidgets.QPushButton("О&чистить") hbox = QtWidgets.QHBoxLayout() hbox.addWidget(button1) hbox.addWidget(button2) form = QtWidgets.QFormLayout() form.addRow("&Название:", lineEdit)

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(, <Компонент> | <Контейнер>) addRow(<Компонент> | <Компонент>)
Первый формат позволяет задать текст надписи, которая будет помещена в первую ко- лонку формы, и компонент или контейнер, помещаемый во вторую колонку. В тексте надписи можно указать символ
&
, который пометит клавишу быстрого доступа для этого компонента (контейнера). Второй формат использует в качестве надписи компонент класса
QLabel
(он представляет надпись) — в этом случае связь с компонентом (контей- нером) необходимо устанавливать вручную, передав ссылку на него в метод setBuddy()
Третий формат заставляет компонент (контейнер) занять сразу обе колонки формы;
 insertRow()
— добавляет строку в указанную позицию контейнера. Если в первом пара- метре задано отрицательное значение, компонент добавляется в конец контейнера. Фор- маты метода: 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(<Компонент>, , <Текст заголовка>)
В параметре
<Компонент>
указывается ссылка на компонент, который будет отображать- ся на вкладке. Чаще всего этот компонент является лишь родителем для других компо- нентов. Параметр
<Текст заголовка>
задает текст, который будет отображаться на ярлы- ке в области заголовка. Внутри текста заголовка символ
&
, указанный перед буквой, за- дает комбинацию клавиш быстрого доступа. В этом случае буква, перед которой указан символ
&
, будет — в качестве подсказки пользователю — подчеркнута. При одновре- менном нажатии клавиши и подчеркнутой буквы откроется соответствующая

450
Часть II. Библиотека PyQt 5 вкладка. Параметр

позволяет указать значок (экземпляр класса
QIcon
), который отобразится перед текстом в области заголовка.

Пример указания стандартного значка: style = window.style() icon = style.standardIcon(QtWidgets.QStyle.SP_DriveNetIcon) tab.addTab(QtWidgets.QLabel("Содержимое вкладки 1"), icon,
"Вкладка &1")

Пример загрузки значка из файла: icon = QtGui.QIcon("icon.png") tab.addTab(QtWidgets.QLabel("Содержимое вкладки 1"), icon,
"Вкладка &1")
 insertTab()
— добавляет вкладку в указанную позицию и возвращает индекс этой вкладки. Форматы метода: insertTab(<Индекс>, <Компонент>, <Текст заголовка>) insertTab(<Индекс>, <Компонент>, , <Текст заголовка>)
 removeTab(<Индекс>)
— удаляет вкладку с указанным индексом, при этом компонент, который отображался на вкладке, не удаляется;
 clear()
— удаляет все вкладки, при этом компоненты, которые отображались на вклад- ках, не удаляются;
 setTabText(<Индекс>, <Текст заголовка>)
— задает текст заголовка для вкладки с ука- занным индексом;
 setElideMode(<Режим>)
— задает режим обрезки текста в названии вкладки, если он не помещается в отведенную область (в месте пропуска выводится троеточие). Могут быть указаны следующие атрибуты класса
QtCore.Qt
:

ElideLeft

0
— текст обрезается слева;

ElideRight

1
— текст обрезается справа;

ElideMiddle

2
— текст вырезается посередине;

ElideNone

3
— текст не обрезается;
 tabText(<Индекс>)
— возвращает текст заголовка вкладки с указанным индексом;
 setTabIcon(<Индекс>, )
— устанавливает значок перед текстом в заголовке вкладки с указанным индексом. Во втором параметре указывается экземпляр класса
QIcon
;
 setTabPosition(<Позиция>)
— задает позицию области заголовка. Могут быть указаны следующие атрибуты класса
QTabWidget
:

North

0
— сверху;

South

1
— снизу;

West

2
— слева;

East

3
— справа.
Пример: tab.setTabPosition(QtWidgets.QTabWidget.South)

Глава 20. Размещение компонентов в окнах
451
 setTabShape(<Форма>)
— задает форму углов ярлыка вкладки в области заголовка. Могут быть указаны следующие атрибуты класса
QTabWidget
:

Rounded

0
— скругленные углы (значение по умолчанию);

Triangular

1
— треугольная форма;
 setTabsClosable(<Флаг>)
— если в качестве параметра указано значение
True
, то после текста заголовка вкладки будет отображена кнопка ее закрытия. По нажатию этой кноп- ки генерируется сигнал tabCloseRequested
;
 setMovable(<Флаг>)
— если в качестве параметра указано значение
True
, ярлыки вкладок можно перемещать с помощью мыши;
 setDocumentMode(<Флаг>)
— если в качестве параметра указано значение
True
, область компонента не будет отображаться как панель;
 setUsesScrollButtons(<Флаг>)
— если в качестве параметра указано значение
True
, то, если все ярлыки вкладок не помещаются в область заголовка панели, появятся две кноп- ки, с помощью которых можно прокручивать область заголовка, тем самым отображая только часть ярлыков. Значение
False запрещает скрытие ярлыков;
 setTabToolTip(<Индекс>, <Текст>)
— задает текст всплывающей подсказки для ярлыка вкладки с указанным индексом;
 setTabWhatsThis(<Индекс>, <Текст>)
— задает текст справки для ярлыка вкладки с ука- занным индексом;
 setTabEnabled(<Индекс>, <Флаг>)
— если вторым параметром передано значение
False
, вкладка с указанным в первом параметре индексом станет недоступной. Значение
True делает вкладку доступной;
 isTabEnabled(<Индекс>)
— возвращает значение
True
, если вкладка с указанным индек- сом доступна, и
False
— в противном случае;
 setCurrentIndex(<Индекс>)
— делает видимой вкладку с указанным в параметре индек- сом. Метод является слотом;
 currentIndex()
возвращает индекс видимой вкладки;
 setCurrentWidget(<Компонент>)
— делает видимой вкладку с указанным компонентом.
Метод является слотом;
 currentWidget()
— возвращает ссылку на компонент, расположенный на видимой вкладке;
 widget(<Индекс>)
— возвращает ссылку на компонент, который расположен по указан- ному индексу, или значение
None
;
 indexOf(<Компонент>)
— возвращает индекс вкладки, на которой расположен компо- нент. Если компонент не найден, возвращается значение
-1
;
 count()
— возвращает количество вкладок. Получить количество вкладок можно также с помощью функции len()
: print(tab.count(), len(tab))
Класс
QTabWidget поддерживает такие сигналы:
 currentChanged(<Индекс>)
— генерируется при переключении на другую вкладку. Через параметр внутри обработчика доступен целочисленный индекс новой вкладки;

452
Часть II. Библиотека PyQt 5
 tabCloseRequested(<Индекс>)
— генерируется при нажатии кнопки закрытия вкладки.
Через параметр внутри обработчика доступен целочисленный индекс закрываемой вкладки.
20.10. Компонент «аккордеон»
Класс
QToolBox позволяет создать «аккордеон» — компонент с несколькими вкладками, в котором изначально отображается содержимое только одной вкладки, а у остальных ви- димы лишь заголовки. После щелчка мышью на заголовке вкладки она открывается, а ос- тальные сворачиваются. Иерархия наследования выглядит так:
(QObject, QPaintDevice) — QWidget — QFrame — QToolBox
Конструктор класса
QToolBox имеет следующий формат:
<Объект> = QToolBox([parent=<Родитель>][, flags=<Тип окна>])
В параметре parent указывается ссылка на родительский компонент. Если он не указан или имеет значение
None
, компонент будет обладать своим собственным окном. В параметре flags может быть указан тип окна.
Пример кода, создающего компонент класса
QToolBox
, представлен в листинге 20.7. Соз- данный им «аккордеон» показан на рис. 20.6.
Рис. 20.6. Пример использования класса
QToolBox
Листинг 20.7. Пример использования класса QToolBox
# -*- coding: utf-8 -*- from PyQt5 import QtWidgets import sys app = QtWidgets.QApplication(sys.argv) window = QtWidgets.QWidget() window.setWindowTitle("QToolBox") window.resize(200, 100) toolBox = QtWidgets.QToolBox() toolBox.addItem(QtWidgets.QLabel("Содержимое вкладки 1"), "Вкладка &1") toolBox.addItem(QtWidgets.QLabel("Содержимое вкладки 2"), "Вкладка &2") toolBox.addItem(QtWidgets.QLabel("Содержимое вкладки 3"), "Вкладка &3") toolBox.setCurrentIndex(0)

Глава 20. Размещение компонентов в окнах
453 vbox = QtWidgets.QVBoxLayout() vbox.addWidget(toolBox) window.setLayout(vbox) window.show() sys.exit(app.exec_())
Класс
QToolBox поддерживает следующие методы (здесь приведены только основные — полный их список смотрите на странице https://doc.qt.io/qt-5/qtoolbox.html):
 addItem()
— добавляет вкладку в конец контейнера. Метод возвращает индекс добав- ленной вкладки. Форматы метода: addItem(<Компонент>, <Текст заголовка>) addItem(<Компонент>, , <Текст заголовка>)
В параметре
<Компонент>
указывается ссылка на компонент, который будет отображать- ся на вкладке. Чаще всего этот компонент является лишь родителем для других компо- нентов. Параметр
<Текст заголовка>
задает текст, который будет отображаться на ярлы- ке в области заголовка. Внутри текста заголовка символ
&
, указанный перед буквой, за- дает комбинацию клавиш быстрого доступа. В этом случае буква, перед которой указан символ
&
, будет — в качестве подсказки пользователю — подчеркнута. При одновре- менном нажатии клавиши и подчеркнутой буквы откроется соответствующая вкладка. Параметр

позволяет указать значок (экземпляр класса
QIcon
), который отобразится перед текстом в области заголовка;
 insertItem()
— добавляет вкладку в указанную позицию. Метод возвращает индекс добавленной вкладки. Форматы метода: insertItem(<Индекс>, <Компонент>, <Текст заголовка>) insertItem(<Индекс>, <Компонент>, , <Текст заголовка>)
 removeItem(<Индекс>)
— удаляет вкладку с указанным индексом, при этом компонент, который отображался на вкладке, не удаляется;
 setItemText(<Индекс>, <Текст заголовка>)
— задает текст заголовка для вкладки с ука- занным индексом;
 itemText(<Индекс>)
— возвращает текст заголовка вкладки с указанным индексом;
 setItemIcon(<Индекс>, )
— устанавливает значок перед текстом в заголовке вкладки с указанным индексом. Во втором параметре указывается экземпляр класса
QIcon
;
 setItemToolTip(<Индекс>, <Текст>)
— задает текст всплывающей подсказки для ярлыка вкладки с указанным индексом;
 setItemEnabled(<Индекс>, <Флаг>)
— если вторым параметром передается значение
False
, вкладка с указанным в первом параметре индексом станет недоступной. Значение
True делает вкладку доступной;
 isItemEnabled(<Индекс>)
— возвращает значение
True
, если вкладка с указанным индек- сом доступна, и
False
— в противном случае;
 setCurrentIndex(<Индекс>)
— делает видимой вкладку с указанным индексом. Метод является слотом;
 currentIndex()
— возвращает индекс видимой вкладки;
 setCurrentWidget(<Компонент>)
— делает видимым вкладку с указанным компонентом.
Метод является слотом;

454
Часть II. Библиотека PyQt 5
 currentWidget()
— возвращает ссылку на компонент, который расположен на видимой вкладке;
 widget(<Индекс>)
— возвращает ссылку на компонент, который расположен по указан- ному индексу, или значение
None
;
 indexOf(<Компонент>)
— возвращает индекс вкладки, на которой расположен компо- нент. Если компонент не найден, возвращается значение
-1
;
 count()
— возвращает количество вкладок. Получить количество вкладок можно также с помощью функции len()
: print(toolBox.count(), len(toolBox))
При переключении на другую вкладку генерируется сигнал currentChanged(<Индекс>)
Через параметр внутри обработчика доступен целочисленный индекс вкладки, на кото- рую было выполнено переключение.
20.11. Панели с изменяемым размером
Класс
QSplitter позволяет изменять размеры добавленных компонентов, взявшись мышью за границу между компонентами. Иерархия наследования выглядит так:
(QObject, QPaintDevice) — QWidget — QFrame — QSplitter
Конструктор класса
QSplitter имеет два формата:
<Объект> = QSplitter([parent=<Родитель>])
<Объект> = QSplitter(<Ориентация>[, parent=<Родитель>])
В параметре parent указывается ссылка на родительский компонент. Если таковой не ука- зан или имеет значение
None
, компонент будет обладать своим собственным окном. Пара- метр
<Ориентация>
задает ориентацию размещения компонентов. Могут быть заданы атри- буты
Horizontal
(по горизонтали) или
Vertical
(по вертикали) класса
QtCore.Qt
. Если параметр не указан, компоненты размещаются по горизонтали.
Пример использования класса
QSplitter показан в листинге 20.8, а результат можно уви- деть на рис. 20.7.
Листинг 20.8. Пример использования класса QSplitter
# -*- coding: utf-8 -*- from PyQt5 import QtCore, QtWidgets import sys app = QtWidgets.QApplication(sys.argv) window = QtWidgets.QWidget() window.setWindowTitle("QSplitter") window.resize(200, 200) splitter = QtWidgets.QSplitter(QtCore.Qt.Vertical) label1 = QtWidgets.QLabel("Содержимое компонента 1") label2 = QtWidgets.QLabel("Содержимое компонента 2") label1.setFrameStyle(QtWidgets.QFrame.Box | QtWidgets.QFrame.Plain) label2.setFrameStyle(QtWidgets.QFrame.Box | QtWidgets.QFrame.Plain) splitter.addWidget(label1) splitter.addWidget(label2)

Глава 20. Размещение компонентов в окнах
455 vbox = QtWidgets.QVBoxLayout() vbox.addWidget(splitter) window.setLayout(vbox) window.show() sys.exit(app.exec_())
Рис. 20.7. Пример использования класса
QSplitter
Класс
QSplitter поддерживает следующие методы (здесь приведены только основные — полный их список смотрите на странице https://doc.qt.io/qt-5/qsplitter.html):
 addWidget(<Компонент>)
— добавляет компонент в конец контейнера;
 insertWidget(<Индекс>, <Компонент>)
— добавляет компонент в указанную позицию.
Если компонент был добавлен ранее, он будет перемещен в новую позицию;
 setOrientation(<Ориентация>)
— задает ориентацию размещения компонентов. Могут быть заданы атрибуты
Horizontal
(по горизонтали) или
Vertical
(по вертикали) класса
QtCore.Qt
;
 setHandleWidth(<Ширина>)
— задает ширину компонента-разделителя, взявшись за кото- рый мышью, можно изменить размер области;
 saveState()
— возвращает экземпляр класса
QByteArray с размерами всех областей. Эти данные можно сохранить (например, в файл), а затем восстановить с помощью метода restoreState()
;
 restoreState()
— восстанавливает размеры областей компонента из эк- земпляра класса, возвращенного методом saveState()
;
 setChildrenCollapsible(<Флаг>)
— если в параметре указано значение
False
, пользова- тель не сможет уменьшить размеры всех компонентов до нуля. По умолчанию размер может быть нулевым, даже если для какого-либо компонента установлены минимальные размеры;
 setCollapsible(<Индекс>, <Флаг>)
— значение
False в параметре
<Флаг>
запрещает уменьшение размеров до нуля для компонента с указанным индексом;
 setOpaqueResize(<Флаг>)
— если в качестве параметра указано значение
False
, размеры компонентов изменятся только после окончания перемещения границы и отпускания кнопки мыши. В процессе перемещения мыши вместе с ней будет перемещаться специ- альный компонент в виде линии;
 setStretchFactor(<Индекс>, <Фактор>)
— задает фактор растяжения для компонента с указанным индексом;

456
Часть II. Библиотека PyQt 5
 setSizes(<Список>)
— задает размеры всех компонентов. Для горизонтального контей- нера указывается список со значениями ширины каждого компонента, а для вертикаль- ного контейнера — список со значениями высоты каждого компонента;
 sizes()
— возвращает список с размерами (шириной или высотой): print(splitter.sizes()) # Результат: [308, 15]
 count()
— возвращает количество компонентов. Получить количество компонентов можно также с помощью функции len()
: print(splitter.count(), len(splitter))
 widget(<Индекс>)
— возвращает ссылку на компонент, который расположен по указан- ному индексу, или значение
None
;
 indexOf(<Компонент>)
— возвращает индекс области, в которой расположен компонент.
Если таковой не найден, возвращается значение
-1
При изменении размеров генерируется сигнал splitterMoved(<Позиция>, <Индекс>)
. Через первый параметр внутри обработчика доступна новая позиция, а через второй параметр — индекс перемещаемого разделителя; оба параметра целочисленные.
20.12. Область с полосами прокрутки
Класс
QScrollArea реализует область с полосами прокрутки. Если компонент не помещает- ся в размеры области, полосы прокрутки будут отображены автоматически. Иерархия на- следования выглядит так:
(QObject, QPaintDevice) — QWidget — QFrame —
QAbstractScrollArea — QScrollArea
Конструктор класса
QScrollArea имеет следующий формат:
<Объект> = QScrollArea([<Родитель>])
Класс
QScrollArea поддерживает следующие методы (здесь приведены только основные — полный их список смотрите на странице https://doc.qt.io/qt-5/qscrollarea.html):
 setWidget(<Компонент>)
— помещает компонент в область прокрутки;
 setWidgetResizable(<Флаг>
) — если в качестве параметра указано значение
True
, при изменении размеров области будут изменяться и размеры компонента. Значение
False запрещает изменение размеров компонента;
 setAlignment(<Выравнивание>)
— задает местоположение компонента внутри области, когда размеры области больше размеров компонента: scrollArea.setAlignment(QtCore.Qt.AlignCenter)
 ensureVisible(, [, xMargin=50][, yMargin=50])
— прокручивает область к точке с координатами
(, )
и полями xMargin и yMargin
;
 ensureWidgetVisible(<Компонент>[, xMargin=50][, yMargin=50])
— прокручивает об- ласть таким образом, чтобы
<Компонент>
был видим;
 widget()
— возвращает ссылку на компонент, который расположен внутри области, или значение
None
;
 takeWidget()
— удаляет компонент из области и возвращает ссылку на него. Сам ком- понент не удаляется.

Глава 20. Размещение компонентов в окнах
457
Класс
QScrollArea наследует следующие методы из класса
QAbstractScrollArea
(здесь пе- речислены только основные — полный их список смотрите на странице https://doc.qt.io/ qt-5/qabstractscrollarea.html
):
 horizontalScrollBar()
— возвращает ссылку на горизонтальную полосу прокрутки (эк- земпляр класса
QScrollBar
);
 verticalScrollBar()
— возвращает ссылку на вертикальную полосу прокрутки (экземп- ляр класса
QScrollBar
);
 setHorizontalScrollBarPolicy(<Режим>)
— устанавливает режим отображения горизон- тальной полосы прокрутки;
 setVerticalScrollBarPolicy(<Режим>)
— устанавливает режим отображения вертикаль- ной полосы прокрутки.
В параметре
<Режим>
могут быть указаны следующие атрибуты из класса
QtCore.Qt
:

ScrollBarAsNeeded

0
— полоса прокрутки отображается только в том случае, если размеры компонента больше размеров области;

ScrollBarAlwaysOff

1
— полоса прокрутки никогда не отображается;

ScrollBarAlwaysOn

2
— полоса прокрутки отображается всегда.

ГЛ А В А
21
Основные компоненты
Практически все компоненты графического интерфейса определены в модуле
QtWidgets
(за исключением
QWebEngineWidgets
) и наследуют класс
QWidget
. Следовательно, методы этих классов, которые мы рассматривали в предыдущих главах, доступны всем компонентам.
Если компонент не имеет родителя, он обладает собственным окном, и его положение от- считывается, например, относительно экрана. Если же компонент имеет родителя, его по- ложение отсчитывается относительно родительского компонента. Это обстоятельство важ- но учитывать при работе с компонентами. Обращайте внимание на иерархию наследования, которую мы будем показывать для каждого компонента.
21.1. Надпись
Надпись применяется для вывода подсказки пользователю, информирования пользователя о ходе выполнения операции, назначении клавиш быстрого доступа и т. п. Кроме того, надписи позволяют отображать отформатированный с помощью CSS текст в формате
HTML, что позволяет реализовать простейший веб-браузер. В библиотеке PyQt 5 надпись реализуется с помощью класса
QLabel
. Иерархия наследования выглядит так:
(QObject, QPaintDevice) — QWidget — QFrame — QLabel
Конструктор класса
QLabel имеет два формата:
<Объект> = QLabel([parent=<Родитель>][, flags=<Тип окна>])
<Объект> = QLabel(<Текст>[, parent=<Родитель>][, flags=<Тип окна>])
В параметре parent указывается ссылка на родительский компонент. Если он не указан или имеет значение
None
, компонент будет обладать своим собственным окном, тип которого можно задать с помощью параметра flags
. Параметр
<Текст>
позволяет задать текст, кото- рый будет отображен на надписи: label = QtWidgets.QLabel("Текст надписи", flags=QtCore.Qt.Window) label.resize(300, 50) label.show()
Класс
QLabel поддерживает следующие основные методы (полный их список смотрите на странице https://doc.qt.io/qt-5/qlabel.html):
 setText(<Текст>)
— задает текст, который будет отображен на надписи. Можно указать как обычный текст, так и содержащий CSS-форматирование текст в формате HTML: label.setText("Текст
1   ...   37   38   39   40   41   42   43   44   ...   83


написать администратору сайта