ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 05.12.2023
Просмотров: 825
Скачиваний: 3
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
502
Часть II. Библиотека PyQt 5
setCurrentFont(
— делает текущим элемент, соответствующий указанному шрифту. В качестве параметра указывается экземпляр класса
QFont
: comboBox.setCurrentFont(QtGui.QFont("Verdana"))
Метод является слотом;
currentFont()
— возвращает экземпляр класса
QFont с выбранным шрифтом. Вот при- мер вывода названия шрифта: print(comboBox.currentFont().family())
setFontFilters(<Фильтр>)
— ограничивает список указанными типами шрифтов. В ка- честве параметра указывается комбинация следующих атрибутов класса
QFontComboBox
:
•
AllFonts
—
0
— все типы шрифтов;
•
ScalableFonts
—
1
— масштабируемые шрифты;
•
NonScalableFonts
—
2
— немасштабируемые шрифты;
•
MonospacedFonts
—
4
— моноширинные шрифты;
•
ProportionalFonts
—
8
— пропорциональные шрифты.
Класс
QFontComboBox поддерживает сигнал currentFontChanged(
, который генери- руется при изменении текущего шрифта. Внутри обработчика доступен экземпляр класса
QFont с текущим шрифтом.
22.3. Роли элементов
Каждый элемент списка хранит набор величин, каждая из которых относится к определен- ной роли: текст элемента, шрифт и цвет, которым отображается элемент, текст всплываю- щей подсказки и многое другое. Приведем роли элементов (атрибуты класса
QtCore.Qt
):
DisplayRole
—
0
— отображаемые данные (обычно текст);
DecorationRole
—
1
— изображение (обычно значок);
EditRole
—
2
— данные в виде, удобном для редактирования;
ToolTipRole
—
3
— текст всплывающей подсказки;
StatusTipRole
—
4
— текст для строки состояния;
WhatsThisRole
—
5
— текст для справки;
FontRole
—
6
— шрифт элемента. Указывается экземпляр класса
QFont
;
TextAlignmentRole
—
7
— выравнивание текста внутри элемента;
BackgroundRole
—
8
— фон элемента. Указывается экземпляр класса
QBrush
;
ForegroundRole
—
9
— цвет текста. Указывается экземпляр класса
QBrush
;
CheckStateRole
—
10
— статус флажка. Могут быть указаны следующие атрибуты клас- са
QtCore.Qt
:
•
Unchecked
—
0
— флажок сброшен;
•
PartiallyChecked
—
1
— флажок частично установлен;
•
Checked
—
2
— флажок установлен;
AccessibleTextRole
—
11
— текст, выводящийся специализированными устройствами вывода — например, системами чтения с экрана;
Глава 22. Списки и таблицы
503
AccessibleDescriptionRole
—
12
— описание элемента, выводящееся специализирован- ными устройствами вывода — например, системами чтения с экрана;
SizeHintRole
—
13
— рекомендуемый размер элемента. Указывается экземпляр класса
QSize
;
UserRole
—
32
— любые пользовательские данные (например, индекс элемента в базе данных). Можно сохранить несколько данных, указав их в роли с индексом более
32
: comboBox.setItemData(0, 50, role=QtCore.Qt.UserRole) comboBox.setItemData(0, "Другие данные", role=QtCore.Qt.UserRole + 1)
22.4. Модели
Для отображения данных в виде списков и таблиц применяется концепция «модель- представление», позволяющая отделить данные от их внешнего вида и избежать дублиро- вания данных. В основе концепции лежат следующие составляющие:
модель — является «оберткой» над данными. Позволяет считывать, добавлять, изменять, удалять данные и управлять ими;
представление — предназначено для отображения элементов модели на экране. Сразу несколько представлений могут выводить одну и ту же модель;
модель выделения — позволяет управлять выделением. Если одна модель выделения установлена сразу в нескольких представлениях, то выделение элемента в одном пред- ставлении приведет к выделению соответствующего элемента в другом;
промежуточная модель — является прослойкой между моделью и представлением. По- зволяет производить сортировку и фильтрацию данных без изменения порядка следова- ния элементов в базовой модели;
делегат — представляет компонент для вывода и редактирования данных. Существуют стандартные классы делегатов, кроме того, разработчик может создать свои классы.
22.4.1. Доступ к данным внутри модели
Доступ к данным внутри модели реализуется с помощью класса
QModelIndex из модуля
QtCore
Чаще всего экземпляр класса
QModelIndex создается с помощью метода index()
какого-либо класса модели или метода currentIndex()
, унаследованного моделями из класса
QAbstractItemView
. Такой экземпляр указывает на конкретные данные.
Если запрошенных данных в модели нет, возвращается пустой, невалидный экземпляр класса
QModelIndex
. Его также можно создать обычным вызовом конструктора:
<Объект> = QModelIndex()
Класс
QModelIndex поддерживает следующие методы:
isValid()
— возвращает значение
True
, если объект является валидным, и
False
— в противном случае;
data([role=DisplayRole])
— возвращает данные, относящиеся к указанной в параметре role роли (по умолчанию — выводимый на экран текст элемента списка);
504
Часть II. Библиотека PyQt 5
flags()
— возвращает свойства элемента в виде комбинации следующих атрибутов класса
QtCore.Qt
:
•
NoItemFlags
—
0
— элемент не имеет свойств;
•
ItemIsSelectable
—
1
— элемент можно выделить;
•
ItemIsEditable
—
2
— элемент можно редактировать;
•
ItemIsDragEnabled
—
4
— элемент можно перетаскивать;
•
ItemIsDropEnabled
—
8
— в элемент можно сбрасывать перетаскиваемые данные;
•
ItemIsUserCheckable
—
16
— элемент может быть установлен и сброшен;
•
ItemIsEnabled
—
32
— пользователь может взаимодействовать с элементом;
•
ItemIsTristate
—
64
— элемент имеет три состояния;
•
ItemNeverHasChildren
—
128
— элемент не может иметь вложенные элементы;
row()
— возвращает индекс строки;
column()
— возвращает индекс столбца;
parent()
— возвращает индекс элемента (экземпляр класса
QModelIndex
), расположенно- го на один уровень выше по иерархии. Если такого элемента нет, возвращается невалид- ный экземпляр класса
QModelIndex
;
child(<Строка>, <Столбец>)
— возвращает индекс элемента (экземпляр класса
QModelIndex
), расположенного на один уровень ниже указанной позиции по иерархии.
Если такого элемента нет, возвращается невалидный экземпляр класса
QModelIndex
;
sibling(<Строка>, <Столбец>)
— возвращает индекс элемента (экземпляр класса
QModelIndex
), расположенного на том же уровне вложенности на указанной позиции.
Если такого элемента нет, возвращается невалидный экземпляр класса
QModelIndex
;
model()
— возвращает ссылку на модель.
Также класс
QModelIndex поддерживает операторы сравнения
==
,
<
и
!=
, позволяющие срав- нивать экземпляры по их индексам.
Надо учитывать, что модель может измениться — тогда экземпляр класса
QModelIndex будет ссылаться на несуществующий уже элемент. Если необходимо сохранить ссылку на элемент, следует воспользоваться классом
QPersistentModelIndex
, который содержит те же самые методы, но обеспечивает валидность ссылки.
22.4.2. Класс QStringListModel
Класс
QStringListModel из модуля
QtCore реализует одномерную модель, содержащую спи- сок строк. Ее содержимое можно отобразить с помощью классов
QListView
,
QComboBox и др., передав в метод setModel()
представления. Иерархия наследования:
QObject — QAbstractItemModel — QAbstractListModel — QStringListModel
Форматы конструктора класса
QStringListModel
:
<Объект> = QStringListModel([parent=None])
<Объект> = QStringListModel(<Список строк>[, parent=None])
Пример: lst = ['Perl', 'PHP', 'Python', 'Ruby'] slm = QtCore.QStringListModel(lst, parent = window)
Глава 22. Списки и таблицы
505 cbo = QtWidgets.QComboBox() cbo.setModel(slm)
Класс
QStringListModel наследует метод index()
из класса
QAbstractListModel
, который возвращает индекс (экземпляр класса
QModelIndex
) элемента модели. Формат метода: index(<Строка>[, column=0][, parent=QModelIndex()])
Первый параметр задает номер строки в модели, в которой хранится нужный элемент. Не- обязательный параметр column указывает номер столбца модели — для класса
QStringListModel
, позволяющего хранить простые списки строк, его следует задать равным
0
. Необязательный параметр parent позволяет задать элемент верхнего уровня для искомого элемента — если таковой не задан, будет выполнен поиск элемента на самом верхнем уров- не иерархии.
Класс
QStringListModel поддерживает также следующие методы (здесь приведены толь- ко основные
— полный их список можно найти на странице https://doc.qt.io/qt-5/ qstringlistmodel.html):
setStringList(<Список строк>)
— устанавливает список строк в качестве содержимого модели;
stringList()
— возвращает список строк, хранящихся в модели;
insertRows(<Индекс>, <Количество>[, parent=QModelIndex()])
— вставляет указанное количество пустых элементов в позицию, заданную первым параметром, остальные эле- менты сдвигаются в конец списка. Необязательный параметр parent позволяет указать элемент верхнего уровня, в который будут вложены добавляемые элементы, — если та- ковой не задан, элементы будут добавлены на самый верхний уровень иерархии. Метод возвращает значение
True
, если операция успешно выполнена;
removeRows(<Индекс>, <Количество>[, parent=QModelIndex()])
— удаляет указанное количество элементов, начиная с позиции, заданной первым параметром. Необязатель- ный параметр parent позволяет указать элемент верхнего уровня, в который вложены удаляемые элементы, — если таковой не задан, элементы будут удалены из самого верх- него уровня иерархии. Метод возвращает значение
True
, если операция успешно выпол- нена;
setData(
— задает значение для роли role элемента, на который указывает индекс
. Метод возвращает значение
True
, если операция выполнена успешно: lst = QtWidgets.QComboBox() slm = QtCore.QStringListModel(parent = window) slm.insertRows(0, 4) slm.setData(slm.index(0), 'Perl') slm.setData(slm.index(1), 'PHP') slm.setData(slm.index(2), 'Python') slm.setData(slm.index(3), 'Ruby') lst.setModel(slm)
data(
— возвращает данные, хранимые в указанной роли эле- мента, на который ссылается индекс
;
rowCount([parent=QModelIndex()])
— возвращает количество элементов в модели. Не- обязательный параметр parent указывает элемент верхнего уровня, при этом будет возвращено количество вложенных в него элементов. Если параметр не задан, будет возвращено количество элементов верхнего уровня иерархии;
506
Часть II. Библиотека PyQt 5
sort(<Индекс столбца>[, order=AscendingOrder])
— производит сортировку. Если во втором параметре указан атрибут
AscendingOrder класса
QtCore.Qt
, сортировка произво- дится в прямом порядке, а если
DescendingOrder
— в обратном.
22.4.3. Класс QStandardItemModel
Класс
QStandardItemModel из модуля
QtGui реализует двумерную (таблица) и иерархиче- скую модели. Каждый элемент такой модели представлен классом
QStandardItem из того же модуля. Вывести на экран ее содержимое можно с помощью классов
QTableView
,
QTreeView и др., передав модель в метод setModel()
представления. Иерархия наследования:
QObject — QAbstractItemModel — QStandardItemModel
Форматы конструктора класса
QStandardItemModel
:
<Объект> = QStandardItemModel([parent=None])
<Объект> = QStandardItemModel(<Количество строк>, <Количество столбцов>
[, parent=None])
Пример создания и вывода на экран таблицы из трех столбцов: значка, названия языка про- граммирования и адреса веб-сайта приведен в листинге 22.1.
Листинг 22.1. Использование класса QStandardItemModel from PyQt5 import QtGui, QtWidgets import sys app = QtWidgets.QApplication(sys.argv) window = QtWidgets.QWidget() window.setWindowTitle("QStandardItemModel") tv = QtWidgets.QTableView(parent=window) sti = QtGui.QStandardItemModel(parent=window) lst1 = ['Perl', 'PHP', 'Python', 'Ruby'] lst2 = ['http://www.perl.org/', 'http://php.net/', 'https://www.python.org/',
'https://www.ruby-lang.org/'] for row in range(0, 4): if row == 2: iconfile = 'python.png' else: iconfile = 'icon.png' item1 = QtGui.QStandardItem(QtGui.QIcon(iconfile), '') item2 = QtGui.QStandardItem(lst1[row]) item3 = QtGui.QStandardItem(lst2[row]) sti.appendRow([item1, item2, item3]) sti.setHorizontalHeaderLabels(['Значок', 'Название', 'Сайт']) tv.setModel(sti) tv.setColumnWidth(0, 50) tv.setColumnWidth(2, 180) tv.resize(350, 150) window.show() sys.exit(app.exec_())
Глава 22. Списки и таблицы
507
Класс
QStandardItemModel поддерживает следующие основные методы (полный их список можно найти на странице https://doc.qt.io/qt-5/qstandarditemmodel.html):
setRowCount(<Количество строк>)
— задает количество строк;
setColumnCount(<Количество столбцов>)
— задает количество столбцов;
rowCount([parent=QModelIndex()])
— возвращает количество строк. Необязательный параметр parent указывает элемент верхнего уровня, при этом будет возвращено коли- чество вложенных в этот элемент строк, — если параметр не задан, будет возвращено количество строк верхнего уровня иерархии;
columnCount([parent=QModelIndex()])
— возвращает количество столбцов. Необяза- тельный параметр parent в этом случае не используется;
setItem(<Строка>, <Столбец>,
— устанавливает элемент в указанную ячейку;
appendRow(<Список>)
— добавляет одну строку в конец модели. В качестве параметра указывается список экземпляров класса
QStandardItem
, представляющих отдельные столбцы добавляемой строки;
appendRow(
— добавляет строку из одной колонки в конец модели;
appendColumn(<Список>)
— добавляет один столбец в конец модели. В качестве парамет- ра указывается список экземпляров класса
QStandardItem
, представляющих отдельные строки добавляемого столбца;
insertRow(<Индекс строки>, <Список>)
— добавляет одну строку в указанную позицию модели. В качестве параметра
<Список>
указывается список экземпляров класса
QStandardItem
, представляющих отдельные столбцы добавляемой строки;
insertRow(<Индекс>[, parent=QModelIndex()])
— добавляет одну пустую строку в ука- занную позицию модели. Необязательный параметр parent указывает элемент верхнего уровня, в который будет вложена добавляемая строка, — если параметр не задан, строка будет добавлена на самый верхний уровень иерархии. Метод возвращает значение
True
, если операция успешно выполнена;
insertRow(<Индекс строки>,
— добавляет строку из одного столбца в указанную позицию модели;
insertRows(<Индекс>, <Количество>[, parent=QModelIndex()])
— добавляет несколько пустых строк в указанную позицию модели. Необязательный параметр parent указывает элемент верхнего уровня, в который будут вложены добавляемые строки, — если пара- метр не задан, строки будут добавлены на самый верхний уровень иерархии. Метод воз- вращает значение
True
, если операция успешно выполнена;
insertColumn(<Индекс столбца>, <Список>)
— добавляет один столбец в указанную по- зицию модели. В качестве параметра
<Список>
указывается список экземпляров класса
QStandardItem
, представляющих отдельные строки добавляемого столбца;
insertColumn(<Индекс>[, parent=QModelIndex()])
— добавляет один пустой столбец в указанную позицию. Необязательный параметр parent указывает элемент верхнего уровня — владелец элементов, в который будет добавлен столбец. Если этот параметр не задан, столбец будет добавлен в элементы самого верхнего уровня иерархии. Метод возвращает значение
True
, если операция выполнена успешно;
insertColumns(<Индекс>, <Количество>[, parent=QModelIndex()])
— добавляет не- сколько пустых столбцов в указанную позицию. Необязательный параметр parent ука-
508
Часть II. Библиотека PyQt 5 зывает элемент верхнего уровня — владелец элементов, в который будут добавлены столбцы. Если этот параметр не задан, столбцы будут добавлены в элементы самого верхнего уровня иерархии. Метод возвращает значение
True
, если операция успешно выполнена;
removeRows(<Индекс>, <Количество>[, parent=QModelIndex()])
— удаляет указанное количество строк, начиная со строки, имеющей индекс
<Индекс>
. Необязательный пара- метр parent указывает элемент верхнего уровня — владелец удаляемых строк. Если этот параметр не задан, будут удалены строки из самого верхнего уровня иерархии. Метод возвращает значение
True
, если операция успешно выполнена;
removeColumns(<Индекс>, <Количество>[, parent=QModelIndex()])
— удаляет указанное количество столбцов, начиная со столбца, имеющего индекс
<Индекс>
. Необязательный параметр parent указывает элемент верхнего уровня — владелец элементов, из которых будут удалены столбцы. Если этот параметр не задан, будут удалены столбцы из эле- ментов самого верхнего уровня иерархии. Метод возвращает значение
True
, если опера- ция успешно выполнена;
takeItem(<Строка>[, <Столбец>=0])
— удаляет указанный элемент из модели и возвра- щает его в виде экземпляра класса
QStandardItem
;
takeRow(<Индекс>)
— удаляет указанную строку из модели и возвращает ее в виде спи- ска экземпляров класса
QStandardItem
;
takeColumn(<Индекс>)
— удаляет указанный столбец из модели и возвращает его в виде списка экземпляров класса
1 ... 43 44 45 46 47 48 49 50 ... 83