Класс 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 |
- 31 открытая функция унаследована от 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/archives/qt-5.6/qdatawidgetmapper.html