ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 05.12.2023
Просмотров: 877
Скачиваний: 3
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
734
Часть II. Библиотека PyQt 5
Листинг 30.3. Формирование списка быстрого доступа from PyQt5 import QtCore, QtWidgets, QtWinExtras import sys, time class MyWindow(QtWidgets.QWidget): def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent, flags=QtCore.Qt.Window |
QtCore.Qt.MSWindowsFixedSizeDialogHint) self.setWindowTitle("Список быстрого доступа")
# Создаем сам список быстрого доступа и очищаем его jumpList = QtWinExtras.QWinJumpList(parent=self) jumpList.clear()
# Получаем категорию последних открывавшихся документоов recent = jumpList.recent()
# Создаем пункт "Лицензия Python" и добавляем его в эту категорию item1 = QtWinExtras.QWinJumpListItem(
QtWinExtras.QWinJumpListItem.Link) item1.setFilePath(r"C:\Windows\notepad.exe") item1.setTitle("Лицензия Python") item1.setArguments([r"C:/Python36/LICENSE.txt"]) recent.addItem(item1)
# Делаем категорию видимой recent.setVisible(True)
# Получаем категорию часто открываемых документов, добавляем в
# нее пункт "Новости Python" и делаем видимой frequent = jumpList.frequent() frequent.addLink("Новости Python", r"C:\Python36\NEWS.txt") frequent.setVisible(True)
# Получаем категорию задач, добавляем в нее пункт "Блокнот",
# разделитель, пункт "Write" и делаем видимой tasks = jumpList.tasks() tasks.addLink("Блокнот", r"C:\Windows\notepad.exe") tasks.addSeparator() tasks.addLink("Write", r"C:\Windows\write.exe") tasks.setVisible(True)
# Создаем произвольную категорию "Инструменты" otherCat = QtWinExtras.QWinJumpListCategory() otherCat.setTitle("Инструменты")
# Добавляем в нее пункт "Python" и также делаем видимой otherCat.addLink("Python Shell", r"C:\Python36\pythonw.exe") otherCat.setVisible(True) jumpList.addCategory(otherCat) self.resize(200, 50) app = QtWidgets.QApplication(sys.argv) window = MyWindow() window.show() sys.exit(app.exec_())
Глава 30. Взаимодействие с Windows
735
Здесь хорошо заметна непонятная особенность либо самих списков быстрого доступа, либо их реализации в PyQt: при добавлении нового пункта в категорию недавно открывавшихся документов этот же пункт появляется и в категории часто открываемых документов, и на- оборот. Поэтому имеет смысл выводить в списке быстрого доступа какую-либо одну из этих двух категорий.
30.3. Панели инструментов, выводящиеся на миниатюрах
При наведении курсора мыши на кнопку, находящуюся в панели задач и представляющую запущенное приложение, на экране появляется небольшая миниатюра окна этого приложе- ния. PyQt позволяет создать на нижней границе такой миниатюры небольшую панель инст- рументов с кнопками, посредством которых можно управлять запущенным приложением.
Функциональность таких панелей инструментов реализуют два класса PyQt:
QWinThumbnailToolBar и
QWinThumbnailToolButton
. Первый класс создает саму панель инст- рументов, а второй — отдельную кнопку на ней.
30.3.1. Класс QWinThumbnailToolBar
Класс
QWinThumbnailToolBar представляет саму инструментальную панель, выводящуюся на нижней границе миниатюры. Конструктор этого класса вызывается следующим образом:
<Объект> = QWinThumbnailToolBar([parent=None])
В параметре parent можно указать родительский компонент.
Класс
QWinThumbnailToolBar поддерживает следующий набор методов, применяемых для формирования панели инструментов:
setWindow(
— задает окно (экземпляр класса
QWindow
), на миниатюре которо- го должна выводиться панель инструментов.
Получить экземпляр упомянутого ранее класса, представляющий окно, можно вызовом метода windowHandle()
класса
QWidget
. Однако здесь нужно иметь в виду, что этот метод способен вернуть корректное значение лишь после вывода окна на экран. Поэтому метод setWindow панели инструментов следует вызывать внутри переопределенного метода showEvent()
(за подробностями — к разд. 19.7.1): class MyWindow(QtWidgets.QWidget): def __init__(self, parent=None): self.thumbnailToolbar =
QtWinExtras.QWinThumbnailToolBar(parent=self) def showEvent(self, evt): self.thumbnailToolbar.setWindow(self.windowHandle())
window()
— возвращает экземпляр класса
QWindow
, представляющий окно, с которым связана панель инструментов;
addButton(
— добавляет в панель инструментов кнопку, представленную экземпляром класса
QWinThumbnailToolButton
;
736
Часть II. Библиотека PyQt 5
В
НИМАНИЕ
!
На панели инструментов, выводящейся при миниатюре окна, может присутствовать не более семи кнопок.
setButtons(<Список кнопок>)
— помещает на панель инструментов кнопки, указанные
(в виде экземпляров класса
QWinThumbnailToolButton
) в параметре
<Список кнопок>
Кнопки, присутствовавшие ранее в панели инструментов, будут удалены;
removeButton(
— удаляет указанную (в виде экземпляра класса
QWinThumbnailToolButton
) кнопку из панели инструментов;
clear()
— очищает панель инструментов. Метод является слотом;
buttons()
— возвращает список кнопок (экземпляров класса
QWinThumbnailToolButton
), имеющихся на панели инструментов;
count()
— возвращает количество кнопок, имеющихся на панели инструментов.
30.3.2. Класс QWinThumbnailToolButton
Класс
QWinThumbnailToolButton представляет отдельную кнопку, присутствующую на пане- ли инструментов в миниатюре окна. Вот формат вызова его конструктора:
<Объект> = QWinThumbnailToolBar([parent=None])
Необязательный параметр parent служит для задания родителя кнопки.
Класс
QWinThumbnailToolButton поддерживает все необходимые для создания кнопки методы:
setIcon(
— устанавливает на кнопку значок, заданный в виде экземпляра клас- са
QIcon
;
icon()
— возвращает экземпляр класса
QIcon
, представляющий установленный на кноп- ку значок;
setToolTip(<Текст подсказки>)
— задает для кнопки текст всплывающей подсказки;
toolTip()
— возвращает заданный для кнопки текст всплывающей подсказки;
setVisible(<Флаг>)
— если передать с параметром значение
False
, кнопка будет скрыта.
Чтобы снова вывести ее на экран, нужно передать значение
True
;
isVisible()
— возвращает
True
, если кнопка присутствует на экране, и
False
— в про- тивном случае;
setEnabled(<Флаг>)
— если передать с параметром значение
False
, кнопка станет недос- тупной для нажатия, — при этом она будет закрашена серым цветом. Чтобы вновь сде- лать кнопку доступной, следует передать значение
True
;
isEnabled()
— возвращает
True
, если кнопка доступна для нажатия, и
False
, если она недоступна и закрашена серым;
setInteractive(<Флаг>)
— если передать с параметром значение
False
, кнопка станет недоступной для нажатия, но при этом будет отображаться как обычно. Если нужно сде- лать кнопку вновь доступной, следует передать значение
True
;
isInteractive()
— возвращает
True
, если кнопка доступна для нажатия, и
False
, если она недоступна и отображается как обычно;
setDismissOnClick(<Флаг>)
— если передать с параметром значение
True
, кнопка после нажатия на нее будет возвращаться в исходное состояние. Если же передать значение
Глава 30. Взаимодействие с Windows
737
False
, кнопка останется в нажатом состоянии и вернется в исходное только после вто- ричного нажатия (поведение по умолчанию);
dismissOnClick()
— возвращает
True
, если кнопка после нажатия сама возвращается в исходное состояние, и
False
— в противном случае;
setFlat(<Флаг>)
— если передать с параметром значение
True
, кнопка будет выводиться без рамки и фона — в виде одного лишь значка. Если же передать значение
False
, кноп- ка будет выводиться как обычно (поведение по умолчанию);
isFlat()
— возвращает
True
, если кнопка выводится без рамки и фона, и
False
— в про- тивном случае;
click()
— имитирует нажатие кнопки. Если кнопка недоступна для нажатия, ничего не делает. Метод является слотом.
Если требуется создать промежуток между какими-либо кнопками, можно поместить туда кнопку, недоступную для нажатия, без значка, рамки и фона:
# Создаем кнопку, которая должна выводиться левее свободного пространства buttonStart = QtWinExtras.QWinThumbnailToolButton(parent=self) button2.setIcon(iconStart) button2.setToolTip("Пуск") thumbnailToolbar.addButton(buttonStart)
# Конструируем кнопку, которая создаст свободное пространство buttonSpacer = QtWinExtras.QWinThumbnailToolButton(parent=self) buttonSpacer.setInteractive(False) buttonSpacer.setFlat(True) thumbnailToolbar.addButton(buttonSpacer)
# Создаем кнопку, которая должна выводиться правее свободного
# пространства buttonStop = QtWinExtras.QWinThumbnailToolButton(parent=self)
Класс
QWinThumbnailToolButton поддерживает сигнал clicked()
, генерируемый при щелчке на кнопке.
В качестве примера рассмотрим код приложения из листинга 30.4. Оно помещает в панель инструментов на миниатюре три кнопки, из которых первая выводится как обычно, вто- рая — без рамки и фона, а третья не возвращается в исходное состояние самостоятельно
(первые две кнопки возвращаются). Между второй и третьей кнопок присутствует свобод- ное пространство, созданное с помощью недоступной для нажатия кнопки без значка, рамки и фона. Получившуюся панель инструментов можно увидеть на рис. 30.3.
Рис. 30.3. Панель инструментов на миниатюре приложения
738
Часть II. Библиотека PyQt 5
Листинг 30.4. Создание панели инструментов на миниатюре приложения from PyQt5 import QtCore, QtWidgets, QtGui, QtWinExtras import sys class MyWindow(QtWidgets.QWidget): def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent, flags=QtCore.Qt.Window |
QtCore.Qt.MSWindowsFixedSizeDialogHint) self.setWindowTitle("Панель инструментов на миниатюре")
# Создаем значки для кнопок icon1 = QtGui.QIcon("icon3.png") icon2 = QtGui.QIcon("icon4.png") icon3 = QtGui.QIcon("icon5.png")
# Создаем панель инструментов self.thumbnailToolbar = QtWinExtras.QWinThumbnailToolBar( parent=self)
1 ... 67 68 69 70 71 72 73 74 ... 83
# Создаем первые две кнопки button1 = QtWinExtras.QWinThumbnailToolButton(parent=self) button1.setIcon(icon1) button1.setToolTip("Кнопка 1") button1.setDismissOnClick(True) button1.clicked.connect(self.button1Clicked) self.thumbnailToolbar.addButton(button1) button2 = QtWinExtras.QWinThumbnailToolButton(parent=self) button2.setIcon(icon2) button2.setToolTip("Кнопка 2") button2.setDismissOnClick(True) button2.clicked.connect(self.button2Clicked) self.thumbnailToolbar.addButton(button2)
# Создаем кнопку, что сформирует свободное пространство
# между второй и третьей кнопками button0 = QtWinExtras.QWinThumbnailToolButton(parent=self) button0.setInteractive(False) button0.setFlat(True) self.thumbnailToolbar.addButton(button0)
# Создаем третью кнопку button3 = QtWinExtras.QWinThumbnailToolButton(parent=self) button3.setIcon(icon3) button3.setToolTip("Кнопка 3") button3.clicked.connect(self.button3Clicked) self.thumbnailToolbar.addButton(button3)
# Создаем надпись, куда будут выводиться сообщения о нажатии
# кнопок панели инструментов, и кнопку выхода vbox = QtWidgets.QVBoxLayout() self.lblOutput = QtWidgets.QLabel(parent=self) vbox.addWidget(self.lblOutput) btnClose = QtWidgets.QPushButton("&Выход")
Глава 30. Взаимодействие с Windows
739 btnClose.clicked.connect(QtWidgets.qApp.quit) vbox.addWidget(btnClose) self.setLayout(vbox) self.resize(200, 100)
# После вывода окна на экран привязываем его к панели инструментов def showEvent(self, evt): self.thumbnailToolbar.setWindow(self.windowHandle())
# Выводим в надпись сообщения о нажатии кнопок def button1Clicked(self): self.lblOutput.setText("Нажата кнопка 1") def button2Clicked(self): self.lblOutput.setText("Нажата кнопка 2") def button3Clicked(self): self.lblOutput.setText("Нажата кнопка 3") app = QtWidgets.QApplication(sys.argv) window = MyWindow() window.show() sys.exit(app.exec_())
П
РИМЕЧАНИЕ
В PyQt также заявлена поддержка вывода произвольного изображения в качестве миниа- тюры, которая появляется при наведении курсора мыши на кнопку панели задач, представ- ляющую приложение, и при переключении между приложениями нажатием комбинации клавиш
30.4. Дополнительные инструменты по управлению окнами
Ряд инструментов, позволяющих управлять окнами, реализован в статических методах класса
QtWinExtras.QtWin
:
taskbarDeleteTab(<Окно>)
— удаляет из панели задач кнопку, представляющую указан- ное
<Окно>
, которое задается экземпляром класса
QWidget или
QWindow
:
QtWinExtras.QtWin.taskbarDeleteTab(window)
taskbarAddTab(<Окно>)
— вновь добавляет удаленную ранее из панели задач кнопку, представляющую указанное
<Окно>
, которое задается экземпляром класса
QWidget или
QWindow
;
taskbarActivateTab(<Окно>)
— активизирует на панели задач кнопку, представляющую указанное
<Окно>
, не активизируя само окно.
<Окно>
должно быть указано в виде экземп- ляра класса
QWidget или
QWindow
;
740
Часть II. Библиотека PyQt 5
taskbarActivateTabAlt(<Окно>)
— помечает на панели задач кнопку, представляющую указанное
<Окно>
, как активную, не активизируя ни кнопку, ни само окно.
<Окно>
должно быть указано в виде экземпляра класса
QWidget или
QWindow
;
setWindowExcludedFromPeek(<Окно>, <Флаг>)
— если вторым параметром передать зна- чение
True
, при наведении курсора мыши на миниатюру панели задач, представляющую любое другое окно, окно, указанное в параметре
<Окно>
, будет выводиться как есть, а не в виде тонкой рамки. Чтобы вернуть окну поведение по умолчанию (вывод в виде тон- кой рамки), следует передать вторым параметром значение
False
<Окно>
должно быть указано в виде экземпляра класса
QWidget или
QWindow
:
QtWinExtras.QtWin.setWindowExcludedFromPeek(window, True)
isWindowExcludedFromPeek(<Окно>)
— возвращает
True
, если
<Окно>
при наведении кур- сора мыши на миниатюру панели задач, представляющую любое другое окно, выводится как есть, и
False
, если оно выводится как обычно, в виде тонкой рамки.
<Окно>
должно быть указано в виде экземпляра класса
QWidget или
QWindow
;
setWindowDisallowPeek(<Окно>, <Флаг>)
— если вторым параметром передать значение
True
, при наведении курсора мыши на миниатюру панели задач, представляющую
<Окно>
, все прочие окна будут выводиться как есть, а не в виде тонких рамок. Чтобы вернуть поведение по умолчанию (вывод остальных окон в виде тонких рамок), следует передать вторым параметром значение
False
<Окно>
должно быть указано в виде экзем- пляра класса
QWidget или
QWindow
;
isWindowPeekDisallowed(<Окно>)
— возвращает
True
, если при наведении курсора мыши на миниатюру панели задач, представляющую
<Окно>
, все прочие окна выводятся как есть, и
False
, если они выводятся как обычно, в виде тонкой рамки.
<Окно>
должно быть указано в виде экземпляра класса
QWidget или
QWindow
;
extendFrameIntoClientArea()
— расширяет полупрозрачную область заголовка, указан- ного в первом параметре
<Окно>
на его клиентскую область. Работает только в Windows
Vista и 7. Форматы метода: extendFrameIntoClientArea(<Окно>, <Слева>, <Сверху>, <Справа>, <Снизу>) extendFrameIntoClientArea(<Окно>,
<Окно>
должно быть указано в виде экземпляра класса
QWidget или
QWindow
Первый формат позволяет задать величины областей, на которые должна распростра- няться область полупрозрачности, непосредственно, в виде целых чисел, в пикселах.
Второй формат указывает величины этих областей в виде экземпляра класса
QMargins
:
QtWinExtras.QtWin.extendFrameIntoClientArea(window, 0, 20, 0, 20)
Если указать в качестве всех величин областей, на которые распространяется область полупрозрачности, число
-1
, все окно станет полупрозрачным:
QtWinExtras.QtWin.extendFrameIntoClientArea(window, -1, -1, -1, -1)
resetExtendedFrame(<Окно>)
— задает для окна, указанного в параметре
<Окно>
, область полупрозрачности по умолчанию, т. е. охватывающую только заголовок окна.
<Окно>
указывается в виде экземпляра класса
QWidget или
QWindow
. Работает только в Windows
Vista и 7;
enableBlurBehindWindow(<Окно>[,
— создает снаружи окна, указанного в параметре
<Окно>
, область размытия.
<Окно>
задается экземпляром класса
QWidget или
QWindow
. Вторым параметром можно передать размеры области размытия (экземпляр