Класс QDataWidgetMapper
Класс QDataWidgetMapper обеспечивает сопоставление части модели данных с виджетами. Подробнее...
| Заголовок: | #include <QDataWidgetMapper> |
| qmake: | QT += widgets |
| С тех пор: | Qt 4.2 |
| Наследует: | QObject |
Открытые типы
| Перечисление | SubmitPolicy { AutoSubmit, ManualSubmit } |
Свойства
- currentIndex : int
- orientation : Qt::Orientation
- submitPolicy : SubmitPolicy
- 1 свойство унаследовано от QObject
Открытые функции
| QDataWidgetMapper(QObject *parent = Q_NULLPTR) | |
| ~QDataWidgetMapper() | |
| void | addMapping(QWidget *widget, int section) |
| void | addMapping(QWidget *widget, int section, const QByteArray &propertyName) |
| void | clearMapping() |
| int | currentIndex() const |
| QAbstractItemDelegate * | itemDelegate() const |
| QByteArray | mappedPropertyName(QWidget *widget) const |
| int | mappedSection(QWidget *widget) const |
| QWidget * | mappedWidgetAt(int section) const |
| QAbstractItemModel * | model() const |
| Qt::Orientation | orientation() const |
| void | removeMapping(QWidget *widget) |
| QModelIndex | rootIndex() const |
| void | setItemDelegate(QAbstractItemDelegate *delegate) |
| void | setModel(QAbstractItemModel *model) |
| void | setOrientation(Qt::Orientation aOrientation) |
| void | setRootIndex(const QModelIndex &index) |
| void | setSubmitPolicy(SubmitPolicy policy) |
| SubmitPolicy | submitPolicy() const |
- 32 открытые функции унаследованы от QObject
Открытые слоты
| void | revert() |
| virtual void | setCurrentIndex(int index) |
| void | setCurrentModelIndex(const QModelIndex &index) |
| bool | submit() |
| void | toFirst() |
| void | toLast() |
| void | toNext() |
| void | toPrevious() |
- 1 открытый слот унаследован от QObject
Сигналы
| void | currentIndexChanged(int index) |
- 2 сигнала унаследованы от QObject
Дополнительные унаследованные члены
Подробное описание
Класс QDataWidgetMapper обеспечивает сопоставление части модели данных с виджетами.
QDataWidgetMapper может использоваться для создания виджетов, реагирующих на данные, посредством сопоставления их с разделами модели элементов. Раздел представляет собой столбец модели, если ориентация горизонтальная (по умолчанию), иначе — строку.
Каждый раз, когда изменяется текущий индекс, каждый виджет обновляется данными из модели через свойство, указанное при его сопоставлении. Если пользователь изменяет содержимое виджета, изменения считываются с помощью того же свойства и записываются обратно в модель. По умолчанию используется пользовательское свойство каждого виджета для передачи данных между моделью и виджетом. Начиная с Qt 4.3, дополнительная функция addMapping() позволяет использовать вместо свойства по умолчанию свойство с именем.
Можно установить делегат элементов для поддержки пользовательских виджетов. По умолчанию используется QItemDelegate для синхронизации модели с виджетами.
Предположим, что у нас есть модель элементов под названием model со следующим содержимым:
| 1 | Qt Norway | Oslo |
| 2 | Qt Australia | Brisbane |
| 3 | Qt USA | Palo Alto |
| 4 | Qt China | Beijing |
| 5 | Qt Germany | Berlin |
Следующий код сопоставит столбцы модели с виджетами под названием mySpinBox, myLineEdit и myCountryChooser:
QDataWidgetMapper *mapper = new QDataWidgetMapper; mapper->setModel(model); mapper->addMapping(mySpinBox, 0); mapper->addMapping(myLineEdit, 1); mapper->addMapping(myCountryChooser, 2); mapper->toFirst();
После вызова toFirst(), mySpinBox отображает значение 1, myLineEdit отображает Qt Norway, а myCountryChooser отображает Oslo. Для навигации по модели и обновления виджетов содержимым из модели можно использовать функции навигации toFirst(), toNext(), toPrevious(), toLast() и setCurrentIndex().
Функция setRootIndex() позволяет указать определённый элемент в модели как корневой индекс — дочерние элементы этого элемента будут сопоставлены с соответствующими виджетами в пользовательском интерфейсе.
QDataWidgetMapper поддерживает две политики отправки, AutoSubmit и ManualSubmit. AutoSubmit обновит модель, как только текущий виджет потеряет фокус, ManualSubmit не обновит модель, пока не будет вызван submit(). ManualSubmit полезна при отображении диалогового окна, позволяющего пользователю отменить все изменения. Также и другие представления, отображающие модель, не обновятся, пока пользователь не завершит все изменения и не отправит их.
Обратите внимание, что QDataWidgetMapper отслеживает внешние изменения. Если содержимое модели обновляется в другом модуле приложения, виджеты также обновляются.
См. также QAbstractItemModel и QAbstractItemDelegate.
Документация типов членов
enum QDataWidgetMapper::SubmitPolicy
Этот перечисление описывает возможные политики отправки, которые поддерживает QDataWidgetMapper.
| Постоянная | Значение | Описание |
|---|---|---|
QDataWidgetMapper::AutoSubmit |
0 |
При каждом потере фокуса виджетом, текущее значение виджета устанавливается в модель элементов. |
QDataWidgetMapper::ManualSubmit |
1 |
Модель не обновляется до тех пор, пока не будет вызван submit(). |
Документация свойств
currentIndex : int
Это свойство содержит текущую строку или столбец.
Виджеты заполняются данными из строки с индексом, если ориентация горизонтальная (по умолчанию), иначе данными из столбца с индексом.
Функции доступа:
| int | currentIndex() const |
| virtual void | setCurrentIndex(int index) |
Сигнал уведомления:
| void | currentIndexChanged(int index) |
См. также setCurrentModelIndex(), toFirst(), toNext(), toPrevious() и toLast().
orientation : Qt::Orientation
Это свойство содержит ориентацию модели.
Если ориентация Qt::Horizontal (по умолчанию), виджет сопоставляется со столбцом модели данных. Виджет будет заполнен данными модели из сопоставленного столбца и строки, на которую указывает currentIndex().
Используйте Qt::Horizontal для табличных данных, которые выглядят так:
| 1 | Qt Norway | Oslo |
| 2 | Qt Australia | Brisbane |
| 3 | Qt USA | Silicon Valley |
| 4 | Qt China | Beijing |
| 5 | Qt Germany | Berlin |
Если ориентация установлена в Qt::Vertical, виджет сопоставляется со строкой. Вызов setCurrentIndex() изменит текущий столбец. Виджет будет заполнен данными модели из сопоставленной строки и столбца, на который указывает currentIndex().
Используйте Qt::Vertical для табличных данных, которые выглядят так:
| 1 | 2 | 3 | 4 | 5 |
| Qt Norway | Qt Australia | Qt USA | Qt China | Qt Germany |
| Oslo | Brisbane | Silicon Valley | Beijing | Berlin |
Изменение ориентации очищает все существующие сопоставления.
Функции доступа:
| Qt::Orientation | orientation() const |
| void | setOrientation(Qt::Orientation aOrientation) |
submitPolicy : SubmitPolicy
Это свойство содержит текущую политику отправки.
Изменение текущей политики отправки вернёт все виджеты к текущим данным из модели.
Функции доступа:
| SubmitPolicy | submitPolicy() const |
| void | setSubmitPolicy(SubmitPolicy policy) |
Документация функций членов
QDataWidgetMapper::QDataWidgetMapper(QObject *parent = Q_NULLPTR)
Создаёт новый QDataWidgetMapper с родительским объектом parent. По умолчанию ориентация горизонтальная, а политика отправки — AutoSubmit.
См. также setOrientation() и setSubmitPolicy().
QDataWidgetMapper::~QDataWidgetMapper()
Уничтожает объект.
void QDataWidgetMapper::addMapping(QWidget *widget, int section)
Добавляет сопоставление между widget и section из модели. section — это столбец в модели, если ориентация горизонтальная (по умолчанию), иначе — строка.
Для следующего примера предположим модель myModel, которая имеет два столбца: первый содержит имена людей в группе, а второй — их возраст. Первый столбец сопоставлен с QLineEdit nameLineEdit, а второй — с QSpinBox ageSpinBox:
QDataWidgetMapper *mapper = new QDataWidgetMapper(); mapper->setModel(myModel); mapper->addMapping(nameLineEdit, 0); mapper->addMapping(ageSpinBox, 1);
Примечания:
- Если widget уже сопоставлен с секцией, старое сопоставление будет заменено новым.
- Разрешены только взаимно однозначные сопоставления между секциями и виджетами. Невозможно сопоставить одну секцию с несколькими виджетами или один виджет с несколькими секциями.
См. также removeMapping(), mappedSection() и clearMapping().
void QDataWidgetMapper::addMapping(QWidget *widget, int section, const QByteArray &propertyName)
В сущности, то же, что и addMapping(), но добавляет возможность указать свойство для использования, указав propertyName.
Эта функция была добавлена в Qt 4.3.
См. также addMapping().
void QDataWidgetMapper::clearMapping()
Очищает все сопоставления.
См. также addMapping() и removeMapping().
[signal] void QDataWidgetMapper::currentIndexChanged(int index)
Этот сигнал генерируется после изменения текущего индекса и заполнения всех виджетов новыми данными. index — новый текущий индекс.
Примечание: Сигнал уведомления для свойства currentIndex.
См. также currentIndex() и setCurrentIndex().
QAbstractItemDelegate *QDataWidgetMapper::itemDelegate() const
Возвращает текущий делегат элемента.
См. также setItemDelegate().
QByteArray QDataWidgetMapper::mappedPropertyName(QWidget *widget) const
Возвращает имя свойства, используемого при сопоставлении данных с заданным widget.
Эта функция была добавлена в Qt 4.3.
См. также mappedSection(), addMapping() и removeMapping().
int QDataWidgetMapper::mappedSection(QWidget *widget) const
Возвращает секцию, к которой сопоставлен widget, или -1, если виджет не сопоставлен.
См. также addMapping() и removeMapping().
QWidget *QDataWidgetMapper::mappedWidgetAt(int section) const
Возвращает виджет, сопоставленный с section, или 0, если виджет не сопоставлен с этой секцией.
См. также addMapping() и removeMapping().
QAbstractItemModel *QDataWidgetMapper::model() const
Возвращает текущую модель.
См. также setModel().
void QDataWidgetMapper::removeMapping(QWidget *widget)
Удаляет сопоставление для данного widget.
См. также addMapping() и clearMapping().
[slot] void QDataWidgetMapper::revert()
Перезаполняет все виджеты текущими данными модели. Все несохранённые изменения будут утеряны.
См. также submit() и setSubmitPolicy().
QModelIndex QDataWidgetMapper::rootIndex() const
Возвращает текущий корневой индекс.
См. также setRootIndex().
[slot] void QDataWidgetMapper::setCurrentModelIndex(const QModelIndex &index)
Устанавливает текущий индекс в строку index, если ориентация горизонтальная (по умолчанию), иначе в столбец index.
Вызывает setCurrentIndex() внутри. Этот удобный слот может быть подключен к сигналу currentRowChanged() или currentColumnChanged() модели выбора selection model другого виджета.
Следующий пример демонстрирует, как обновить все виджеты с новыми данными всякий раз, когда меняется выбор в QTableView с именем myTableView:
QDataWidgetMapper *mapper = new QDataWidgetMapper();
connect(myTableView->selectionModel(), SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),
mapper, SLOT(setCurrentModelIndex(QModelIndex))); См. также currentIndex().
void QDataWidgetMapper::setItemDelegate(QAbstractItemDelegate *delegate)
Устанавливает делегат элементов в delegate. Делегат будет использоваться для записи данных из модели в виджет и из виджета в модель, используя QAbstractItemDelegate::setEditorData() и QAbstractItemDelegate::setModelData().
Делегат также определяет, когда применять данные и когда менять редактор, используя QAbstractItemDelegate::commitData() и QAbstractItemDelegate::closeEditor().
Предупреждение: Не следует использовать один и тот же экземпляр делегата между мапперами виджетов или представлениями. Это может привести к некорректному или неинтуитивному поведению редактирования, поскольку каждое представление, подключенное к данному делегату, может получить сигнал closeEditor() и попытаться получить доступ, изменить или закрыть редактор, который уже был закрыт.
См. также itemDelegate().
void QDataWidgetMapper::setModel(QAbstractItemModel *model)
Устанавливает текущую модель в model. Если была установлена другая модель, все сопоставления с этой старой моделью очищаются.
См. также model().
void QDataWidgetMapper::setRootIndex(const QModelIndex &index)
Устанавливает корневой элемент в index. Это можно использовать для отображения ветви дерева. Передайте недействительный индекс модели, чтобы отобразить самую верхнюю ветвь.
См. также rootIndex().
[slot] bool QDataWidgetMapper::submit()
Отправляет все изменения из сопоставленных виджетов в модель.
Для каждого сопоставленного раздела делегат элемента считывает текущее значение из виджета и устанавливает его в модели. В конце вызывается метод submit() модели.
Возвращает true если все значения были отправлены, в противном случае false.
Примечание: для баз данных, QSqlQueryModel::lastError() может использоваться для получения последней ошибки.
См. также revert() и setSubmitPolicy().
[slot] void QDataWidgetMapper::toFirst()
Заполняет виджеты данными из первой строки модели, если ориентация горизонтальная (по умолчанию), иначе данными из первого столбца.
Эквивалентно вызову setCurrentIndex(0).
См. также toLast() и setCurrentIndex().
[slot] void QDataWidgetMapper::toLast()
Заполняет виджеты данными из последней строки модели, если ориентация горизонтальная (по умолчанию), иначе данными из последнего столбца.
Вызывает setCurrentIndex() внутри.
См. также toFirst() и setCurrentIndex().
[slot] void QDataWidgetMapper::toNext()
Заполняет виджеты данными из следующей строки модели, если ориентация горизонтальная (по умолчанию), иначе данными из следующего столбца.
Вызывает setCurrentIndex() внутри. Ничего не делает, если следующей строки в модели нет.
См. также toPrevious() и setCurrentIndex().
[slot] void QDataWidgetMapper::toPrevious()
Заполняет виджеты данными из предыдущей строки модели, если ориентация горизонтальная (по умолчанию), иначе данными из предыдущего столбца.
Вызывает setCurrentIndex() внутри. Ничего не делает, если предыдущей строки в модели нет.
См. также toNext() и setCurrentIndex().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.9/qdatawidgetmapper.html