Опубликован: 07.03.2015 | Уровень: для всех | Доступ: свободно | ВУЗ: Компания ALT Linux
Лекция 13:

Создание графического интерфейса средствами Qt

13.6 Элементы графического интерфейса и их использование

Все виджеты в Qt наследуют от класса QWidget. Класс QWidget предоставляет базовую функциональность общую для всех виджетов. Среди свойств, которые наследуют от QWidget, — свойство enabled, которое позволяет разрешить или запретить взаимодействие пользователя с элементом управления (методы void setEnabled(bool) и bool isEnabled()). Когда свойство установлено (логическое значение false) — визуальный элемент деактивирован и пользователь больше не может с ним взаимодействовать. Обычно такие деактивированные элементы изменяют внешний вид, чтобы пользователь смог их отличить от активных. Свойство visible (методы void setVisible(bool) и bool isVisible()) определяет видимый виджет (значение true) или нет (значение false). Эти свойства влияют не только на сам визуальный элемент, но и на дочерние элементы.

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

Так, например, кнопки (Buttons), очень часто употребляемый элемент управления. В общем поведение для кнопок определяет абстрактный класс QAbstractButton. Эти элементы могут находиться в включённом или выключенном состояниях. Состояние можно определять с помощью свойства checked (метод isChecked()). Переключением можно управлять с помощью свойства checkable (bool isCheckable(), setChеcked(bool)). От класса QAbstractButton наследуют классы QCheckBox, QPushButton, QRadioButton, QToolButton.

  • QPushButton чаще используют соединяя его сигнал clicked(), который вызывается при нажатии кнопки, с другими слотами.
  • QToolButton является кнопкой для быстрого доступа к действиям или настройкам, которую обычно используют внутри панели инструментов.
  • QCheckBox — элемент-флажок. Может находиться в включённом или выключенном состоянии. Также может иметь третье промежуточное состояние, поддержку которого можно активировать с помощью метода setTristate().
  • QRadioButton — кнопка-переключатель. Как и флажок может находиться в включённом или выключенном состоянии. Её используют в группе с другими переключателями (см. класс QButtonGroup) для обозначения нескольких взаимоисключающих вариантов выбора, где только один переключатель включён, а все остальные выключены.

К виджетам-контейнерам (Containers) относят QFrame, QGroupBox, QTabWidget, QToolBox. QFrame — наиболее общий элемент. Это базовый класс для виджетов, которые имеют обрамление. От него наследуют такие классы визуальных элементов как QLabel, QLCDNumber, QSplitter, QToolBox, QStackedWidget, QAbstractScrollArea. Может использоваться самостоятельно для отображения различных рамок.

  • QGroupBox используют для выделения группы виджетов рамкой с надписью. Есть возможность задать клавиатурную комбинацию, чтобы перевести фокус ввода на виджеты в группе. Не создаёт компоновку для группы виджетов автоматически.
  • QTabWidget — виджет для отображения виджетов внутри отдельных страниц. Предоставляет панель вкладок и показывает виджет для текущей страницы внутри себя. Для работы необходимо создать виджет и добавить его как страницу, а также задать имя страницы.
  • QToolBox используют для создания вертикальной колонки виджетов со вкладками. Каждый виджет имеет отдельную вкладку. Текущий видимый виджет соответствует текущей открытой вкладке.

Также следует выделить виджеты-виды (Views), к которым относят QListView, QListWidget, QTableView, QTableWidget, QTreeView, QTreeWidget. Они добавляют возможность выводить информацию в виде списков, таблиц и деревьев. QListView, QTableView, QTreeView используют модель, как источник данных (см. абстрактный класс QAbstractItemModel). QListWidget, QTableWidget и QTreeWidget используют как самостоятельный виджет с данными, данные добавляют поэлементно (см. QListWidgetItem, QTableWidgetItem, QTreeWidgetItem).

К элементам вывода информации (Display widgets) относят QLabel, QLCDNumber и QProgressBar. QProgressBar позволяет вывести текущий прогресс в виде заполненной линии. QLCDNumber выводит целые и числа с плавающей запятой в стиле семисегментного дисплея. QLabel используют для вывода различной текстовой информации. Этот виджет также поддерживает разметку HTML4, которую можно использовать для оформления текста.

Наиболее многочисленная группа — элементы ввода (Input widgets). К ним относят QComboBox, QDateEdit, QDial, QDoubleSpinBox, QFontComboBox, QLineEdit, QScrollBar, QSlider, QSpinBox, QTextEdit, QTimeEdit.

  • QComboBox — выпадающий список, используемый для выбора элемента из списка альтернатив.
  • QDateTimeEdit — поле ввода даты и времени. Позволяет вводить и показывать время в заданном формате. Вид этого элемента наследуют также QTimeEdit и QDateEdit.
  • QDial — изменяет числовое значение по тому же принципу, что и регуляторы на панели приборов. Наследует от абстрактного класса QAbstractSlider.
  • QLineEdit — поле ввода. Даёт возможность не только вводить текст, но и проверять допустимость ввода (см. класс QValidator). Имеет режим для ввода пароля. Также возможно задать маску для ввода значений.
  • QScrollBar — элемент управления скроллингом. Наследует от абстрактного класса QAbstractSlider. Каждому положению указателя соответствует значение в заданных пределах. Часто используют для прокрутки содержимого других виджетов.
  • QSlider — элемент, который использует перетаскивания мышкой для ввода значений. Каждому положению указателя соответствует значение, в заданных пределах. Наследует от абстрактного класса QAbstractSlider.
Сергей Радыгин
Сергей Радыгин

Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке?

Тип приложения - не Qt,

Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.

 

Юрий Герко
Юрий Герко

Кому удалось собрать пример из раздела 13.2 Компоновка (Layouts)? Если создавать проект по изложенному алгоритму, автоматически не создается  файл mainwindow.cpp. Если создавать этот файл вручную и добавлять в проект, сборка не получается - компилятор сообщает об отсутствии класса MainWindow. Как правильно выполнить пример?