Создание инструментов
Передача параметров в инструменты
Дополнительные параметры могут быть переданы прямо в конструктор инструмента axipy.MapTool
при создании кнопки ToolButton
. Для этого необходимо «обернуть»
вызов конструктора в функцию, захватив (capture) все необходимые параметры. Например, сравните:
button = ToolButton('Мой инструмент', MyTool)
button = ToolButton('Мой инструмент', lambda: MyTool(config, params))
Панель активного инструмента
Если при работе с инструментом пользователю регулярно нужно взаимодействовать
с различными графическими элементами / настройками то для этого можно воспользоваться
готовым решением из axipy.ActiveToolPanel
. Это обертка вокруг
стандартной панели PySide2.QtWidgets.QDockWidget
предоставляющая
дополнительные возможности:
Можно задать наблюдателя который будет автоматически следить за доступностью панели.
Предопределенное место для панели активного инструмента.
Готовые компоненты с кнопками управления для упрощения добавления пользовательского графического элемента.
При написании плагинов текущий экземпляр axipy.ActiveToolPanel
можно
получить из метода axipy.AxiomaInterface.active_tool_panel()
. Взаимодействие
с панелью активного инструмента идет через обработчик который можно создать через один из
методов axipy.ActiveToolPanel.make_acceptable()
или axipy.ActiveToolPanel.make_custom()
.
При работе с панелью активного инструмента через обработчик axipy.AxipyAcceptableActiveToolHandler
созданный через axipy.ActiveToolPanel.make_acceptable()
то на панели активного
инструмента по умолчанию расположены кнопки «Применить» и «Отмена». При нажатии на них будут посланы
соответствующие сигналы axipy.AxipyAcceptableActiveToolHandler.accepted
и axipy.AxipyAcceptableActiveToolHandler.rejected
.
Если нужно настроить кнопки управления по своему усмотрению то можно воспользоваться обработчиком
axipy.AxipyCustomActiveToolPanelHandler
, который создаётся с помощью axipy.ActiveToolPanel.make_custom()
.
service = ActiveToolPanel()
# Любой пользовательский графический элемент
widget = QWidget()
# Создаём обработчик для панели активного инструмента через который
# будем управлять панелью.
tool_panel = service.make_acceptable(
title="Мой инструмент",
observer_id=DefaultKeys.SelectionEditable,
widget=widget)
# Подписываемся на сигнал отправляемый после нажатия на кнопку "Применить" в панели
tool_panel.accepted.connect(lambda: print("Применяем изменения"))
Чтобы показать панель активного инструмента с переданным ранее графическим элементом
нужно вызвать axipy.AxipyActiveToolPanelHandlerBase.activate()
, а для
закрытия axipy.AxipyActiveToolPanelHandlerBase.deactivate()
.
class PyTool(MapTool):
def mousePressEvent(self, event: QMouseEvent) -> Optional[bool]:
if event.button() == Qt.LeftButton:
self.tool_panel.activate()
return self.PassEvent
def keyPressEvent(self, event: QKeyEvent) -> Optional[bool]:
if event.key() == Qt.Key_Escape:
self.tool_panel.deactivate()
return self.BlockEvent
return super().keyPressEvent(event
См.также
Создание и добавление кнопок Создание кнопок
В коде выше в методе mousePressEvent()
при нажатии левой кнопкой мыши мы показываем
панель с активным инструментом, а в методе keyPressEvent()
при нажатии на клавишу Esc
панель закрываем.