이 페이지에서

QDataWidgetMapper Class

QDataWidgetMapper 클래스는 데이터 모델의 특정 섹션과 위젯 간의 매핑 기능을 제공합니다. 더 보기...

헤더: #include <QDataWidgetMapper>
CMake: find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets
상속: QObject

공개 유형

enum SubmitPolicy { AutoSubmit, ManualSubmit }

속성

공개 함수

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는 위젯을 항목 모델의 섹션에 매핑하여 데이터 인식 위젯을 생성하는 데 사용할 수 있습니다. 섹션은 방향이 수평(기본값)인 경우 모델의 열이며, 그렇지 않은 경우 행입니다.

현재 인덱스가 변경될 때마다, 각 위젯은 매핑 시 지정된 속성을 통해 모델의 데이터로 업데이트됩니다. 사용자가 위젯의 내용을 편집하면, 동일한 속성을 사용하여 변경 사항을 읽어와 모델에 다시 기록합니다. 기본적으로 각 위젯의 ` user property `가 모델과 위젯 간의 데이터 전송에 사용됩니다. Qt 4.3부터는 추가된 ` addMapping()` 함수를 통해 기본 `user` 속성 대신 명명된 속성을 사용할 수 있습니다.

사용자 정의 위젯을 지원하기 위해 항목 델리게이트를 설정할 수 있습니다. 기본적으로 ` QStyledItemDelegate `가 모델과 위젯 간의 동기화에 사용됩니다.

model 라는 이름의 항목 모델이 있으며, 그 내용이 다음과 같다고 가정해 봅시다.

1Qt Norway오슬로
2Qt 호주브리즈번
3Qt 미국팔로 알토
4Qt 중국베이징
5Qt 독일베를린

다음 코드는 모델의 열을 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::AutoSubmit0위젯이 포커스를 잃을 때마다, 위젯의 현재 값이 항목 모델에 설정됩니다.
QDataWidgetMapper::ManualSubmit1submit()이 호출될 때까지 모델은 업데이트되지 않습니다.

속성 문서

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 `을 사용하십시오:

1Qt 노르웨이오슬로
2Qt 호주브리즈번
3Qt 미국실리콘밸리
4Qt 중국베이징
5Qt 독일베를린

방향(orientation)이 ` Qt::Vertical`로 설정된 경우, 위젯은 행(row)에 매핑됩니다. ` setCurrentIndex()`를 호출하면 현재 열(column)이 변경됩니다. 위젯은 매핑된 행과 ` currentIndex()`가 가리키는 열의 모델 데이터로 채워집니다.

다음과 같은 표 형식의 데이터에는 ` Qt::Vertical `를 사용하십시오:

12345
Qt 노르웨이Qt 호주Qt 미국Qt 중국Qt 독일
오슬로브리즈번실리콘 밸리베이징베를린

방향 변경 시 기존의 모든 매핑이 지워집니다.

액세스 함수:

Qt::Orientation orientation() const
void setOrientation(Qt::Orientation aOrientation)

submitPolicy : SubmitPolicy

이 속성은 현재 제출 정책을 저장합니다.

현재 제출 정책을 변경하면 모든 위젯이 모델의 현재 데이터로 초기화됩니다.

액세스 함수:

QDataWidgetMapper::SubmitPolicy submitPolicy() const
void setSubmitPolicy(QDataWidgetMapper::SubmitPolicy policy)

멤버 함수 문서

[explicit] QDataWidgetMapper::QDataWidgetMapper(QObject *parent = nullptr)

parent 를 부모 객체로 하는 새로운 QDataWidgetMapper를 생성합니다. 기본적으로 방향은 가로이며, 제출 정책은 AutoSubmit 입니다.

setOrientation() 및 setSubmitPolicy()도 참조하십시오 .

[virtual noexcept] 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 가 이미 섹션에 매핑되어 있는 경우, 기존 매핑은 새로운 매핑으로 대체됩니다.
  • 섹션과 위젯 간의 매핑은 일대일(one-to-one)로만 허용됩니다. 단일 섹션을 여러 위젯에 매핑하거나, 단일 위젯을 여러 섹션에 매핑하는 것은 불가능합니다.

removeMapping(), mappedSection(), clearMapping()도 참조하십시오 .

void QDataWidgetMapper::addMapping(QWidget *widget, int section, const QByteArray &propertyName)

기본적으로 addMapping()과 동일하지만, ` propertyName`을 지정하여 사용할 속성을 지정할 수 있는 기능이 추가되었습니다.

addMapping()도 참조하십시오 .

void QDataWidgetMapper::clearMapping()

모든 매핑을 지웁니다.

addMapping() 및 removeMapping()도 참조하십시오 .

[signal] void QDataWidgetMapper::currentIndexChanged(int index)

이 신호는 현재 인덱스가 변경되고 모든 위젯에 새로운 데이터가 채워진 후에 발생합니다. index 는 새로운 현재 인덱스입니다.

참고: 속성 ` currentIndex`에 대한Notifier 신호입니다.

currentIndex() 및 setCurrentIndex()도 참조하십시오 .

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()도 참조하십시오 .

[slot] void QDataWidgetMapper::revert()

모든 위젯을 모델의 현재 데이터로 다시 채웁니다. 아직 제출되지 않은 변경 사항은 모두 사라집니다.

submit() 및 setSubmitPolicy()도 참조하십시오 .

QModelIndex QDataWidgetMapper::rootIndex() const

현재 루트 인덱스를 반환합니다.

setRootIndex()도 참조하십시오 .

[slot] void QDataWidgetMapper::setCurrentModelIndex(const QModelIndex &index)

방향(orientation)이 가로(기본값)인 경우 현재 인덱스를 ` index `의 행으로 설정하고, 그렇지 않은 경우 ` index`의 열로 설정합니다.

내부에서 ` setCurrentIndex()`를 호출합니다. 이 편의 슬롯은 다른 뷰의 ` selection model`의 ` currentRowChanged()` 또는 ` currentColumnChanged()` 신호에 연결할 수 있습니다.

다음 예제는 myTableView 라는 이름의 QTableView 선택 항목이 변경될 때마다 모든 위젯을 새로운 데이터로 업데이트하는 방법을 보여줍니다:

QDataWidgetMapper *mapper = new QDataWidgetMapper;
connect(myTableView->selectionModel(), &QItemSelectionModel::currentRowChanged,
        mapper, &QDataWidgetMapper::setCurrentModelIndex);

currentIndex()도 참조하십시오 .

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()도 참조하십시오 .

[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()도 참조하십시오 .

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.