이 페이지에서

QSqlRelationalTableModel Class

QSqlRelationalTableModel 클래스는 외래 키를 지원하는 단일 데이터베이스 테이블에 대한 편집 가능한 데이터 모델을 제공합니다. 더 보기...

헤더: #include <QSqlRelationalTableModel>
CMake: find_package(Qt6 REQUIRED COMPONENTS Sql)
target_link_libraries(mytarget PRIVATE Qt6::Sql)
qmake: QT += sql
상속: QSqlTableModel

공개 유형

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::InnerJoin0- 내부 조인(Inner join) 모드: 두 테이블 모두에 적어도 하나의 일치하는 행이 있을 때 해당 행을 반환합니다.
QSqlRelationalTableModel::LeftJoin1- 왼쪽 조인(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.