QSqlRelationalTableModel Class
QSqlRelationalTableModel 클래스는 외래 키를 지원하는 단일 데이터베이스 테이블에 대한 편집 가능한 데이터 모델을 제공합니다. 더 보기...
| 헤더: | #include <QSqlRelationalTableModel> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Sql) target_link_libraries(mytarget PRIVATE Qt6::Sql) |
| qmake: | QT += sql |
| 상속: | QSqlTableModel |
- 상속된 멤버를 포함한 모든 멤버 목록
- QSqlRelationalTableModel은 데이터베이스 클래스의 일부입니다.
공개 유형
| enum | JoinMode { InnerJoin, LeftJoin } |
공개 함수
| QSqlRelationalTableModel(QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase()) | |
| virtual | ~QSqlRelationalTableModel() |
| QSqlRelation | relation(int column) const |
| virtual QSqlTableModel * | relationModel(int column) const |
| void | setJoinMode(QSqlRelationalTableModel::JoinMode joinMode) |
| virtual void | setRelation(int column, const QSqlRelation &relation) |
재구현된 공용 함수
| virtual void | clear() override |
| virtual QVariant | data(const QModelIndex &index, int role = Qt::DisplayRole) const override |
| virtual bool | removeColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override |
| virtual bool | select() override |
| virtual bool | setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override |
| virtual void | setTable(const QString &table) override |
공개 슬롯
| virtual void | revertRow(int row) override |
재구현된 보호 함수
| virtual bool | insertRowIntoTable(const QSqlRecord &values) override |
| virtual QString | orderByClause() const override |
| virtual QString | selectStatement() const override |
| virtual bool | updateRowInTable(int row, const QSqlRecord &values) override |
상세 설명
QSqlRelationalTableModel은 QSqlTableModel 과 유사하게 작동하지만, 열을 다른 데이터베이스 테이블로의 외래 키로 설정할 수 있습니다.
![]() | ![]() |
왼쪽 스크린샷은 ` QTableView` 내의 일반 ` QSqlTableModel `을 보여줍니다. 외래 키(`city ` 및 ` country`)는 사람이 읽을 수 있는 값으로 변환되지 않습니다. 오른쪽 스크린샷은 외래 키가 사람이 읽을 수 있는 텍스트 문자열로 변환된 `QSqlRelationalTableModel`을 보여줍니다.
다음 코드 스니펫은 QSqlRelationalTableModel이 어떻게 설정되었는지 보여줍니다:
model->setTable("employee");
model->setRelation(2, QSqlRelation("city", "id", "name"));
model->setRelation(3, QSqlRelation("country", "id", "name"));setRelation() 함수 호출은 두 테이블 간의 관계를 설정합니다. 첫 번째 호출은 테이블 employee 의 2번 열이 테이블 city 의 id 필드와 매핑되는 외래 키임을 지정하며, 뷰가 city 의 name 필드를 사용자에게 표시해야 함을 명시합니다. 두 번째 호출은 3번 열에 대해 유사한 작업을 수행합니다.
읽기-쓰기용 QSqlRelationalTableModel을 사용하는 경우, 뷰에서 QSqlRelationalDelegate 를 사용하는 것이 좋습니다. 기본 델리게이트와 달리, QSqlRelationalDelegate 는 다른 테이블로의 외래 키인 필드에 대해 콤보박스를 제공합니다. 이 클래스를 사용하려면 QSqlRelationalDelegate 의 인스턴스를 사용하여 뷰에서 QAbstractItemView::setItemDelegate()를 호출하기만 하면 됩니다:
std::unique_ptr<QTableView> view{new QTableView};
view->setModel(model);
view->setItemDelegate(new QSqlRelationalDelegate(view.get()));relationaltablemodel 예제는 QSqlRelationalTableModel을 QSqlRelationalDelegate 과 함께 사용하여 테이블에 외래 키 지원을 제공하는 방법을 보여줍니다.

참고 사항:
- 테이블에는 기본 키가 선언되어 있어야 합니다.
- 테이블의 기본 키에는 다른 테이블과의 관계가 포함되어서는 안 됩니다.
- 관계형 테이블에 참조 대상 테이블에 존재하지 않는 행을 가리키는 키가 포함된 경우, 해당 무효한 키를 포함하는 행은 모델을 통해 노출되지 않습니다. 참조 무결성을 유지하는 것은 사용자 또는 데이터베이스의 책임입니다.
- 관계의 표시 열 이름이 관계 테이블의 열 이름으로도 사용되거나, 두 개 이상의 관계에서 표시 열 이름으로 사용되는 경우 별칭이 지정됩니다. 별칭은 관계의 테이블 이름, 표시 열 이름 및 고유 ID를 밑줄(_)로 연결한 것입니다(예: tablename_columnname_id). QSqlRecord::fieldName()는 별칭이 지정된 열 이름을 반환합니다. 중복된 표시 열 이름이 감지되면 해당 이름이 모두 별칭 처리되지만, 메인 테이블의 열 이름에는 별칭 처리가 적용되지 않습니다. 이 별칭 처리는 ` QSqlRelation` 함수에는 영향을 미치지 않으므로, ` QSqlRelation::displayColumn()`는 원래의 표시 열 이름을 반환합니다.
- 참조 테이블 이름에는 별칭이 부여됩니다. 별칭은 "relTblAl"이라는 단어와 밑줄(_)로 연결된 관련 열 인덱스로 구성됩니다(예: relTblAl_2). 이 별칭을 사용하여 테이블을 필터링할 수 있습니다(예: setFilter("relTblAl_2='Oslo' OR relTblAl_3='USA'")).
- setData()를 사용할 때는 역할이 항상 Qt::EditRole 이어야 하며, data()를 사용할 때는 역할이 항상 Qt::DisplayRole 이어야 합니다.
QSqlRelation, QSqlRelationalDelegate 및 관계형 테이블 모델 예제도참조하십시오 .
멤버 유형 문서
enum QSqlRelationalTableModel::JoinMode
| 상수 | 값 | 설명 |
|---|---|---|
QSqlRelationalTableModel::InnerJoin | 0 | - 내부 조인(Inner join) 모드: 두 테이블 모두에 적어도 하나의 일치하는 행이 있을 때 해당 행을 반환합니다. |
QSqlRelationalTableModel::LeftJoin | 1 | - 왼쪽 조인(Left join) 모드로, 오른쪽 테이블(table_name2)에 일치하는 행이 없더라도 왼쪽 테이블(table_name1)의 모든 행을 반환합니다. |
QSqlRelationalTableModel::setJoinMode()도 참조하십시오 .
멤버 함수 문서
[explicit] QSqlRelationalTableModel::QSqlRelationalTableModel(QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase())
빈 QSqlRelationalTableModel을 생성하고, 부모를 parent 로, 데이터베이스 연결을 db 로 설정합니다. db 가 유효하지 않은 경우, 기본 데이터베이스 연결이 사용됩니다.
[virtual noexcept] QSqlRelationalTableModel::~QSqlRelationalTableModel()
객체를 삭제하고 할당된 리소스를 모두 해제합니다.
[override virtual] void QSqlRelationalTableModel::clear()
QSqlTableModel::clear() 메서드를 재구현합니다.
[override virtual] QVariant QSqlRelationalTableModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const
QSqlTableModel::data(const QModelIndex &index, int role) const를 재구현합니다.
setData()도 참조하십시오 .
[override virtual protected] bool QSqlRelationalTableModel::insertRowIntoTable(const QSqlRecord &values)
QSqlTableModel::insertRowIntoTable(const QSqlRecord &values)를 재구현합니다.
[override virtual protected] QString QSqlRelationalTableModel::orderByClause() const
QSqlTableModel::orderByClause() const를 재구현합니다.
QSqlRelation QSqlRelationalTableModel::relation(int column) const
column 열에 대한 관계를 반환하거나, 관계가 설정되어 있지 않은 경우 유효하지 않은 관계를 반환합니다.
setRelation() 및 QSqlRelation::isValid()도 참조하십시오 .
[virtual] QSqlTableModel *QSqlRelationalTableModel::relationModel(int column) const
column 가 외래 키로 설정된 테이블에 접근하기 위한 ` QSqlTableModel ` 객체를 반환하거나, 지정된 ` column`에 대한 관계가 없는 경우 ` nullptr `를 반환합니다.
반환된 객체는 QSqlRelationalTableModel 가 소유합니다.
setRelation() 및 relation()도 참조하십시오 .
[override virtual] bool QSqlRelationalTableModel::removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())
QSqlTableModel::removeColumns(int column, int count, const QModelIndex &parent)을 재구현합니다.
[override virtual slot] void QSqlRelationalTableModel::revertRow(int row)
QSqlTableModel::revertRow(int row)를 재구현합니다.
[override virtual] bool QSqlRelationalTableModel::select()
QSqlTableModel::select()을 재구현합니다.
[override virtual protected] QString QSqlRelationalTableModel::selectStatement() const
QSqlTableModel::selectStatement() const를 재구현합니다.
[override virtual] bool QSqlRelationalTableModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)
QSqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role)를 재구현합니다.
지정된 ` index `를 가진 항목의 ` role `에 대한 데이터를 주어진 ` value `로 설정합니다. 편집 전략에 따라 값이 데이터베이스에 즉시 반영되거나 모델에 캐시될 수 있습니다.
값을 설정할 수 있으면 true 를 반환하고, 오류가 발생하면 (예: index 가 범위를 벗어난 경우) false를 반환합니다.
관계형 열의 경우, value 는 표시 값이 아닌 인덱스여야 합니다. 인덱스가 지정된 경우, 해당 인덱스는 참조된 테이블에 존재해야 하며, 그렇지 않으면 이 함수는 false 를 반환합니다. 인덱스 대신 QVariant()가 전달되면 인덱스는 지워집니다.
editStrategy(), data(), submit() 및 revertRow()도 참조하십시오 .
void QSqlRelationalTableModel::setJoinMode(QSqlRelationalTableModel::JoinMode joinMode)
NULL 외래 키를 가진 행을 표시하거나 숨기도록 SQL joinMode 을 설정합니다. ‘ InnerJoin ’ 모드(기본값)에서는 이러한 행이 표시되지 않습니다. 해당 행을 표시하려면 ‘ LeftJoin ’ 모드를 사용하십시오.
QSqlRelationalTableModel::JoinMode도 참조하십시오 .
[virtual] void QSqlRelationalTableModel::setRelation(int column, const QSqlRelation &relation)
지정된 ` column `를 ` relation`로 지정된 외부 인덱스로 설정합니다.
예시:
model->setTable("employee");
model->setRelation(2, QSqlRelation("city", "id", "name"));setRelation() 호출은 테이블 employee 의 2번 열이 테이블 city 의 id 필드와 매핑되는 외래 키임을 지정하며, 뷰가 city 의 name 필드를 사용자에게 표시해야 함을 나타냅니다.
참고: 테이블의 기본 키에는 다른 테이블과의 관계가 포함되어서는 안 됩니다.
참조: relation().
[override virtual] void QSqlRelationalTableModel::setTable(const QString &table)
QSqlTableModel::setTable(const QString &tableName)를 재구현합니다.
[override virtual protected] bool QSqlRelationalTableModel::updateRowInTable(int row, const QSqlRecord &values)
QSqlTableModel::updateRowInTable(int row, const QSqlRecord &values)를 재구현합니다.
© 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.

