Класс QDataWidgetMapper
Класс QDataWidgetMapper обеспечивает сопоставление части модели данных с виджетами. Подробнее...
| Заголовок: | #include <QDataWidgetMapper> |
| CMake: | find_package(Qt6 COMPONENTS Widgets REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
| qmake: | QT += widgets |
| Наследует: | QObject |
Типы публичного доступа
| перечисление | SubmitPolicy { AutoSubmit, ManualSubmit } |
Свойства
- currentIndex : int
- orientation : Qt::Orientation
- submitPolicy : SubmitPolicy
Функции публичного доступа
| QDataWidgetMapper(QObject *parent = nullptr) | |
| virtual | ~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(QDataWidgetMapper::SubmitPolicy policy) |
| QDataWidgetMapper::SubmitPolicy | submitPolicy() const |
Свойства публичного доступа
| void | revert() |
| virtual void | setCurrentIndex(int index) |
| void | setCurrentModelIndex(const QModelIndex &index) |
| bool | submit() |
| void | toFirst() |
| void | toLast() |
| void | toNext() |
| void | toPrevious() |
Сигналы
| void | currentIndexChanged(int index) |
Подробное описание
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.
Документация по типам членов
перечисление QDataWidgetMapper::SubmitPolicy
Это перечисление описывает возможные политики отправки, которые поддерживает QDataWidgetMapper.
| Константа | Значение | Описание |
|---|---|---|
QDataWidgetMapper::AutoSubmit |
0 |
При потере фокуса виджета текущее значение виджета устанавливается в модель элементов. |
QDataWidgetMapper::ManualSubmit |
1 |
Модель не обновляется до тех пор, пока не будет вызван метод submit(). |
Документация по свойствам
currentIndex : int
Это свойство хранит текущую строку или столбец.
Виджеты заполняются данными из строки с индексом index, если ориентация горизонтальная (по умолчанию), иначе данными из столбца с индексом index.
Функции доступа:
| 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
Это свойство хранит текущую политику отправки.
Изменение текущей политики отправки вернёт все виджеты к текущим данным из модели.
Функции доступа:
| QDataWidgetMapper::SubmitPolicy | submitPolicy() const |
| void | setSubmitPolicy(QDataWidgetMapper::SubmitPolicy policy) |
Документация по членам-функциям
QDataWidgetMapper::QDataWidgetMapper(QObject *parent = nullptr)
Создаёт новый QDataWidgetMapper с родительским объектом parent. По умолчанию, ориентация горизонтальная, а политика отправки — AutoSubmit.
См. также setOrientation() и setSubmitPolicy().
[signal] void QDataWidgetMapper::currentIndexChanged(int index)
Этот сигнал испускается после изменения текущего индекса и заполнения всех виджетов новыми данными. index — новый текущий индекс.
Примечание: Сигнал уведомления для свойства currentIndex.
См. также currentIndex() и setCurrentIndex().
[slot] void QDataWidgetMapper::revert()
Заново заполняет все виджеты текущими данными модели. Все неотправленные изменения будут потеряны.
См. также submit() и setSubmitPolicy().
[slot] void QDataWidgetMapper::setCurrentModelIndex(const QModelIndex &index)
Устанавливает текущий индекс в строку index, если ориентация горизонтальная (по умолчанию), иначе в столбец index.
Внутренне вызывает setCurrentIndex(). Этот удобный слот можно подключить к сигналу currentRowChanged() или currentColumnChanged() модели выбора другого представления.
Следующий пример иллюстрирует, как обновить все виджеты новыми данными при каждом изменении выбора QTableView с именем myTableView:
QDataWidgetMapper *mapper = new QDataWidgetMapper;
connect(myTableView->selectionModel(), &QItemSelectionModel::currentRowChanged,
mapper, &QDataWidgetMapper::setCurrentModelIndex); См. также currentIndex().
[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().
[virtual] 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.
См. также addMapping().
void QDataWidgetMapper::clearMapping()
Очищает все сопоставления.
См. также addMapping() и removeMapping().
QAbstractItemDelegate *QDataWidgetMapper::itemDelegate() const
Возвращает текущий делегат элемента.
См. также setItemDelegate().
QByteArray QDataWidgetMapper::mappedPropertyName(QWidget *widget) const
Возвращает имя свойства, используемого при сопоставлении данных с данным widget.
См. также 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().
QModelIndex QDataWidgetMapper::rootIndex() const
Возвращает текущий индекс корня.
См. также setRootIndex().
void QDataWidgetMapper::setItemDelegate(QAbstractItemDelegate *delegate)
Устанавливает делегата элемента на delegate. Делегат будет использоваться для записи данных из модели в виджет и из виджета в модель, используя QAbstractItemDelegate::setEditorData() и QAbstractItemDelegate::setModelData().
Любой существующий делегат будет удален, но не удален. QDataWidgetMapper не берет на себя владение delegate.
Делегат также определяет, когда применять данные и когда изменять редактор, используя QAbstractItemDelegate::commitData() и QAbstractItemDelegate::closeEditor().
Предупреждение: Не следует использовать один и тот же экземпляр делегата для нескольких мапперов виджетов или представлений. Это может привести к некорректному или неинтуитивному поведению редактирования, так как каждое представление, подключенное к данному делегату, может получать сигнал closeEditor() и пытаться получить доступ, изменить или закрыть редактор, который уже был закрыт.
См. также itemDelegate().
void QDataWidgetMapper::setModel(QAbstractItemModel *model)
Устанавливает текущую модель на model. Если была установлена другая модель, все сопоставления с этой старой моделью очищаются.
См. также model().
void QDataWidgetMapper::setRootIndex(const QModelIndex &index)
Устанавливает корневой элемент на index. Это может быть использовано для отображения ветви дерева. Передайте недействительный индекс модели, чтобы отобразить самую верхнюю ветвь.
См. также rootIndex().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qdatawidgetmapper.html