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

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

A table view displaying a 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 strategyQSqlTableModel::OnRowChange 이라고 가정할 때).

Inserting a row in a model

마찬가지로 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 값을 특별히 처리하는 등의 작업을 할 수 있습니다. 자세한 내용은 모델/보기 프로그래밍QAbstractItemView 참조 문서를 참조하세요.

외래 키를 보다 인간 친화적인 문자열로 해석하기만 하면 되는 경우 QSqlRelationalTableModel 을 사용할 수 있습니다. 최상의 결과를 얻으려면 외래 키 편집을 위한 콤보박스 편집기를 제공하는 델리게이트 QSqlRelationalDelegate 도 사용해야 합니다.

Editing a foreign key in a relational table

관계형 테이블 모델 예제에서는 QSqlRelationalTableModelQSqlRelationalDelegate 과 함께 사용하여 테이블에 외래 키 지원을 제공하는 방법을 보여 줍니다.

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