Саммерфилд Марк
Шрифт:
Затем задаем пиктограмму элемента и вызываем setData для сохранения в QListWidgetItem идентификатора элемента. Закрытая функция iconForSymbol возвращает QIcon для заданного имени символа.
QListWidgetItem может выступать в разных ролях, каждой из которых соответствует определенный объект QVariant. Самыми распространенными ролями являются Qt::DisplayRole, Qt::EditRole и Qt::IconRole, и для них предусмотрены удобные функции по установке и получению их значений (setText, setIcon), но имеется также несколько других ролей. Кроме того, мы можем определить пользовательские роли, задавая числовое значение, равное или большее, чем Qt::UserRole. В нашем примере мы используем Qt::UserRole при сохранении идентификатора каждого элемента.
В непоказанной части конструктора создаются кнопки, выполняется компоновка виджетов и задается заголовок окна.
Функция done класса QDialog переопределяется. Она вызывается при нажатии пользователем кнопок ОК или Cancel. Если пользователь нажимает кнопку OK, мы получаем доступ к соответствующему элементу и извлекаем идентификатор, используя функцию data. Если бы нас интересовал текст элемента, мы могли бы его получить с помощью вызова item->data(Qt::DisplayRole).toString или более простого вызова item->text.
По умолчанию QListWidget используется только для чтения. Если бы мы хотели разрешить пользователю редактировать элементы, мы могли бы соответствующим образом установить переключатели редактирования представления, используя QAbstractItemView::setEditTriggers, например QAbstractItemView::AnyKeyPressed означает, что пользователь может инициировать редактирование элемента, просто начав вводить символы с клавиатуры. Можно было бы поступить по-другому и предусмотреть кнопку редактирования Edit (и, возможно, кнопки добавления и удаления Add и Delete) и связать их со слотами, чтобы можно было программно управлять операциями редактирования.
Теперь, когда мы увидели, как можно использовать удобный класс отображения элементов для просмотра и выбора данных, мы рассмотрим пример, в котором можно редактировать данные. Мы снова используем диалоговое окно, представляющее на этот раз набор точек с координатами (x, у), которые может редактировать пользователь.
Рис. 10.4. Приложение Редактор координат.
Как и в предыдущем примере, мы основное внимание уделим программному коду, относящемуся к представлению элементов, и начнем с конструктора.
Конструктор QTableWidget принимает начальное число строк и столбцов таблицы, выводимой на экран. Каждый элемент в QTableWidget представлен объектом QTableWidgetltem, включая элементы заголовков строк и столбцов. Функция setHorizontalHeaderLabels задает заголовки всем столбцам, используя соответствующий текст из переданного списка строк. По умолчанию QTableWidget обеспечивает заголовки строк числовыми метками, начиная с 1; именно это нам и нужно, поэтому нам не приходится задавать вручную заголовки строк.
После создания и центровки заголовков столбцов мы в цикле просматриваем все переданные нам данные с координатами. Для каждой пары (x, у) мы создаем два элемента QTableWidgetItem, соответствующие координатам x и у. Эти элементы добавляются в таблицу, используя функцию QTableWidget::setItem, в аргументах которой кроме самого элемента задаются его строка и столбец.
По умолчанию виджет QTableWidget разрешает редактирование. Пользователь может редактировать любую ячейку таблицы, установив на нее курсор и нажав F2 или просто вводя текст с клавиатуры. Все сделанные пользователем изменения автоматически сохранятся в элементах QTableWidgetltem. Запретить редактирование мы можем с помощью вызова setEditTriggers(QAbstractItemView::NoEditTriggers).