ээдд. Прохоренок_Н_А__Дронов_В_А_Python_3_и_PyQt_5_Разработка_приложен. Николай Прохоренок Владимир Дронов
Скачать 7.92 Mb.
|
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(<Индекс>) — удаляет указанный столбец из модели и возвращает его в виде списка экземпляров класса |