5.3. Занятие: Формы

При добавлении новых данных с помощью оцифровки появляется диалоговое окно, позволяющее заполнить атрибуты для этой функции. Однако этот диалоговое окно по умолчанию выглядит не очень приятно. Это может вызвать проблему для удобства использования, особенно если вам надо создать большие наборы данных или если вы хотите, чтобы другие люди помогали вам оцифровывать, а они считают, что формы по умолчанию запутаны.

К счастью, QGIS позволяет создавать собственные диалоговые окна для слоя. На этом занятии показывается как это сделать.

Цель этого занятия: создать форму для слоя.

5.3.1. basic Идем дальше: Используем Функциональность дизайна Формы QGIS

  1. Выберите слой roads на панели Layers.

  2. Переходите в режим редактирования, как и ранее.

  3. Откройте таблицы атрибутов слоя roads дорог.

  4. Кликните правой кнопкой мыши любую ячейку в таблице. Появится короткое меню, включающее Open form.

  5. Кликните его, чтобы увидеть форму, которую QGIS создает для этого уровня.

Очевидно, что было бы неплохо делать это, глядя на карту, вместо того, чтобы постоянно искать конкретную улицу в таблице атрибутов Attribute Table.

  1. Выберите слой roads на панели  Layers.

  2. С помощью инструмента Идентификация функций Identify Features кликните любую улицу на карте.

  3. Панель Identify Results откроется, на которой отображается «дерево» значений полей и другая общая информация о выбранной функции.

  4. В верхней части панели проверьте Auto open form for single feature results в меню options sup:Identify Settings (Идентификация настроек).

  5. Теперь кликните еще раз на любой улице на карте. В предыдущем диалоговом окне Identify Results отображается знакомая форма:

    ../../../_images/roads_form.png
  6. Каждый раз когда вы кликаете по одной функции с помощью инструмента Идентифицировать его форма появляется при условии, что установлен флажок Автоматически открывать форму Auto open form.

5.3.2. basic Попробуйте сами, используйте формы для редактирования значений

Если вы находитесь в режиме редактирования, эту форму можно использовать для редактирования атрибутов функции.

  1. Активировать режим редактирования (если он еще не активирован).

  2. С помощью инструмента Определить функции identify Identify Features кликните главную улицу, проходящую через Swellendam Swellendam:

    ../../../_images/main_street_selected.png
  3. Редактируйте его значение highway как secondary.

  4. Выходите из режима редактирования и сохраняйте изменения.

  5. Откройте таблицу атрибутов Attribute Table и отметьте что значение было обновлено в таблице атрибутов и, следовательно, в исходных данных.

5.3.3. moderate Идем дальше: Настройка типов полей формы

Приятно редактировать вещи с помощью формы, но все равно надо вводить все вручную. К счастью, формы имеют различные виды так называемых виджетов, которые позволяют редактировать данные различными способами.

  1. Откройте roads слоя Properties…

  2. Переедите на вкладку Fields. Вы увидите это:

    ../../../_images/fields_panel.png
  3. Перейдите на вкладку Attributes Form. Вы увидите это:

    ../../../_images/attributes_form.png
  4. Кликните на ряд oneway и выберите Checkbox как Widget Type в списке вариантов:

    ../../../_images/checkbox_selected.png
  5. Кликните OK

  6. Переход в режим редактирования (если слой roads не находится уже в режим редактирования)

  7. Кликните на инструмент identify Identify Features.

  8. Кликните на ту же главную дорогу, которую вы выбрали ранее.

Теперь вы увидите, что oneway однонаправленный атрибут имеет флажок рядом с ним, обозначающий True (флажок) или  False (нет флажка).

5.3.4. hard Попробуйте сами

Задайте более подходящий виджет формы для поля highway.

Проверьте свои результаты

5.3.5. hard Попробуйте сами, создайте тестовые данные

Также можно полностью создать собственную пользовательскую форму.

  1. Создайте простой слой точек с именем test-data с двумя атрибутами:

    • название (текст)

    • возраст (целое число)

    ../../../_images/new_point_layer.png
  2. Зафиксируйте несколько точек на новом слое с помощью инструментов оцифровки, чтобы у вас было немного данных для воспроизведения. При каждой записисъемке новой точки вам должна быть представлена форма записи атрибутов, сгенерированных QGIS по умолчанию.

    Примечание

    Может потребоваться отключить привязку, если она все еще включена для предыдущих задач.

    ../../../_images/new_point_entry.png

5.3.6. hard Идем дальше: Создание новой формы

Теперь мы хотим создать собственную пользовательскую форму для фазы сбора данных атрибутов. Для этого необходимо установить Дизайнер QT (только для лица, создающего формы).

  1. Запустить QT Designer.

  2. В появившемся диалоговом окне создайте новое диалоговое окно:

    ../../../_images/qt_new_dialog.png
  3. Найдите  Widget Box в левой части экрана (по умолчанию). Он содержит элемент с именем Line Edit.

  4. Кликните и перетащите этот элемент в форму. Это создаст новый Line Edit в форме.

  5. При выборе нового элемента редактирования строки его свойства будут отображаться на боковой стороне экрана (по умолчанию справа):

    ../../../_images/qt_line_edit.png
  6. Задайте для его имени значение name.

  7. Используя тот же подход, создайте новый Spin Box Box и задайте для его имени значение age.

  8. Добавьте Label`с текстом жирным шрифтом ``Add a New Person` (просмотрите свойства объекта, чтобы узнать, как это задать). Можно также задать заголовок самого диалогового окна (вместо добавления надписи).

  9. Добавьте Label к вашему Line Edit и Spin Box.

  10. Упорядочить элементы по собственному желанию.

  11. Кликните в любом месте диалогового окна.

  12. Найдите кнопку Компоновка в макете формы (по умолчанию в инструментах вдоль верхнего края экрана). При этом диалоговое окно будет размещено автоматически.

  13. Установите максимальный размер диалогового окна (в его свойствах) равным 200 (ширина) на  150 (высота).

  14. Теперь форма должна выглядеть примерно так:

    ../../../_images/qt_example_form.png
  15. Сохраните свою новую форму как  exercise_data/forms/add_people.ui

  16. Когда закончится сохранение, можете закрыть Qt Designer

5.3.7. hard Идем дальше: Связывание формы со слоем

  1. Вернитесь в QGIS.

  2. Кликните два раза на слой test-data в легенде для того чтобы открыть свойства.

  3. Кликните на Attributes Form в диалоговом окне Layer Properties.

  4. В раскрывающемся списке Attribute editor layout выберите Provide ui-file.

  5. Кликните кнопку многоточия и выберите только что созданный файл  add_people.ui:

    ../../../_images/provide_ui_file.png
  6. Кликните OK в диалоговом окне Layer Properties.

  7. Переходите в режим редактирования и берите новую точку.

  8. При этом будет представлено ваше пользовательское диалоговое окно (вместо общего, которое обычно создает QGIS).

  9. Если вы кликните по одной из точек с помощью инструмента identify Identify Features теперь можно вызвать форму, кликнув правой кнопкой мыши в окне определения результатов, и выбрать View Feature Form в контекстном меню.

  10. Если вы находитесь в режиме редактирования для этого слоя, то вместо этого контекстное меню будет отображать Edit Feature Form. После этого можно скорректировать атрибут в новой форме даже после первоначальной записисъемке точки.

5.3.8. В заключении

С помощью форм можно облегчить себе жизнь при редактировании или создании данных. Редактируя типы виджетов или создавая совершенно новую форму с нуля, можно контролировать работу того, кто оцифровывает новые данные для этого слоя, минимизируя тем самым недоразумения и ненужные ошибки.

5.3.9. Дополнительные материалы для чтения

Если вы завершили усложнённый раздел выше и знаете о программе Python, вы можете посмотреть `this blog entry `_ запись блога о создании пользовательских форм функций с логикой Python, которая позволяет использовать расширенные функции, включая проверку данных, автозавершение и т.д.

5.3.10. Что дальше?

Открытие формы для идентификации функции является одним из стандартных действий, которые может выполнить QGIS. Однако его можно также направить на выполнение определяемых пользователем действий. Это тема следующего занятия.