테이블 뷰에서 데이터 표시하기

QSqlQueryModel, QSqlTableModel 및 QSqlRelationalTableModel 클래스는 QListView, QTableView, QTreeView 와 같은 Qt 뷰 클래스의 데이터 소스로 사용할 수 있습니다. 실제로 SQL 결과 집합은 본질적으로 2차원 데이터 구조이므로, QTableView 가 가장 일반적으로 사용됩니다.

QSqlTableModel을 표시하는 테이블 뷰

다음 예제는 SQL 데이터 모델을 기반으로 뷰를 생성합니다:

    QTableView *view = new QTableView;
    view->setModel(model);
    view->show();

모델이 읽기-쓰기 모델(예: QSqlTableModel)인 경우, 뷰를 통해 사용자가 필드를 편집할 수 있습니다. 다음을 호출하여 이 기능을 비활성화할 수 있습니다.

    view->setEditTriggers(QAbstractItemView::NoEditTriggers);

동일한 모델을 여러 뷰의 데이터 소스로 사용할 수 있습니다. 사용자가 뷰 중 하나를 통해 모델을 편집하면 다른 뷰에도 변경 사항이 즉시 반영됩니다. 테이블 모델 예제에서 그 작동 방식을 확인할 수 있습니다.

뷰 클래스는 상단에 열 레이블을 표시하는 헤더를 표시합니다. 헤더 텍스트를 변경하려면 모델에서 ` setHeaderData()`를 호출하십시오. 헤더 레이블은 기본적으로 테이블의 필드 이름을 따릅니다. 예를 들어:

    model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
    model->setHeaderData(1, Qt::Horizontal, QObject::tr("Name"));
    model->setHeaderData(2, Qt::Horizontal, QObject::tr("City"));
    model->setHeaderData(3, Qt::Horizontal, QObject::tr("Country"));

QTableView 또한 왼쪽에는 행을 식별하는 번호가 표시된 세로 헤더가 있습니다. QSqlTableModel::insertRows()를 사용하여 프로그래밍 방식으로 행을 삽입하면, submitAll()를 통해 제출되거나 사용자가 다른 레코드로 이동할 때( edit strategy 가 QSqlTableModel::OnRowChange 인 경우) 자동으로 제출될 때까지 새 행에는 별표(*)가 표시됩니다.

모델에 행 삽입하기

마찬가지로, removeRows()을 사용하여 행을 제거하면, 변경 사항이 제출될 때까지 해당 행에는 느낌표(!)가 표시됩니다.

뷰의 항목들은 델리게이트를 사용하여 렌더링됩니다. 기본 델리게이트인 QStyledItemDelegate 는 가장 일반적인 데이터 유형(int, QString, QImage 등)을 처리합니다. 또한 사용자가 뷰에서 항목 편집을 시작할 때 편집기 위젯(예: 콤보박스)을 제공하는 역할도 델리게이트가 담당합니다. QAbstractItemDelegate 나 QStyledItemDelegate 를 상속하여 사용자 정의 델리게이트를 만들 수 있습니다. 자세한 내용은 ‘모델/뷰 프로그래밍’을 참조하십시오.

QSqlTableModel 는 한 번에 하나의 테이블을 처리하도록 최적화되어 있습니다. 임의의 결과 집합을 처리하는 읽기-쓰기 모델이 필요한 경우, QSqlQueryModel 을 상속받아 flags() 및 setData() 메서드를 재구현하여 읽기-쓰기 모델로 만들 수 있습니다. 다음 두 함수는 쿼리 모델의 필드 1과 2를 편집 가능하게 만듭니다:

Qt::ItemFlags EditableSqlModel::flags(const QModelIndex &index) const
{
    Qt::ItemFlags flags = QSqlQueryModel::flags(index);
    if (index.column() == 1 || index.column() == 2)
        flags |= Qt::ItemIsEditable;
    return flags;
}

bool EditableSqlModel::setData(const QModelIndex &index, const QVariant &value, int /* role */)
{
    if (index.column() < 1 || index.column() > 2)
        return false;

    QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 0);
    int id = data(primaryKeyIndex).toInt();

    clear();

    bool ok;
    if (index.column() == 1)
        ok = setFirstName(id, value.toString());
    else
        ok = setLastName(id, value.toString());
    refresh();
    return ok;
}

setFirstName() 헬퍼 함수는 다음과 같이 정의됩니다:

bool EditableSqlModel::setFirstName(int personId, const QString &firstName)
{
    QSqlQuery query;
    query.prepare("update person set firstname = ? where id = ?");
    query.addBindValue(firstName);
    query.addBindValue(personId);
    return query.exec();
}

setLastName() 함수도 이와 유사합니다. 전체 소스 코드는 쿼리 모델 예제를 참조하십시오.

모델을 서브클래싱하면 다양한 방식으로 모델을 사용자 정의할 수 있습니다. 항목에 툴팁을 제공하거나, 배경색을 변경하거나, 계산된 값을 제공하거나, 보기 모드와 편집 모드에서 서로 다른 값을 제공하거나, null 값을 특별하게 처리하는 등의 작업이 가능합니다. 자세한 내용은 'Model/View 프로그래밍' 및 ' QAbstractItemView ' 참조 문서를 참조하십시오.

단순히 외래 키를 사람이 이해하기 쉬운 문자열로 변환하기만 필요하다면 ` QSqlRelationalTableModel`를 사용할 수 있습니다. 최상의 결과를 얻으려면 외래 키 편집을 위한 콤보박스 편집기를 제공하는 델리게이트인 ` QSqlRelationalDelegate`도 함께 사용해야 합니다.

관계형 테이블에서 외래 키 편집하기

'관계형 테이블 모델 ( Relational Table Model )' 예제는 QSqlRelationalTableModel 과 QSqlRelationalDelegate 을 함께 사용하여 테이블에 외래 키 지원을 제공하는 방법을 보여줍니다.

© 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.