Qt Quick 환경에서 SQLite 데이터를 뷰 목록에 바인딩하는 방법

Qt Quick 애플리케이션에서 로컬 데이터를 효율적으로 화면에 표현하려면 Model-View-Delegate 아키텍처를 이해하는 것이 필수적입니다. 이 패턴은 데이터 관리 (Model), 시각적 표현 (View), 개별 항목의 렌더링 방식 (Delegate) 을 명확히 분리하여 유지보수성을 높입니다.

SQLite 데이터베이스에 저장된 정보를 QML 목록 위젯으로 표시하려면, JavaScript 를 통해 데이터를 조회하고 이를 ListModel 에 주입한 후 ListView 에서 렌더링하는 흐름을 따릅니다. 아래 예시는 로컬 스토리지를 활용하여 데이터를 읽어오고 UI 에 바인딩하는 구체적인 구현 방법입니다.

먼저 JavaScript 파일에서 데이터베이스 연결 및 조회 함수를 정의합니다. 외부에서 모델 객체를 전달받아 조건에 맞는 데이터를 추출하고 모델에 추가합니다.

import QtQuick.LocalStorage 2.0 as DB

function initConnection() {
    return DB.LocalStorage.openDatabaseSync("project_db", "1.0", "record_table", 10000);
}

function loadRecords(targetModel, filterType) {
    var query = 'SELECT * FROM records;';
    if (filterType === "starred") {
        query = 'SELECT * FROM records WHERE starred = 1;';
    }

    var db = initConnection();
    targetModel.clear();

    db.transaction(function(tx) {
        var result = tx.executeSql(query);
        for (var i = 0; i < result.rows.length; i++) {
            var row = result.rows.item(i);
            targetModel.append({
                "uid": row.uid,
                "title": row.title,
                "timestamp": row.timestamp,
                "starred": row.starred
            });
        }
    });
}

이제 QML 파일에서 뷰 구조를 설계합니다. ListView 를 생성하고 앞서 정의한 데이터 모델과 연결합니다. delegate 속성을 통해 각 행이 화면에 어떻게 그려질지 지정합니다.

ListView {
    id: recordView
    anchors.fill: parent

    model: ListModel {
        id: recordModel
    }

    delegate: Item {
        width: parent.width
        height: 64

        Text {
            id: titleText
            text: title
            anchors.verticalCenter: parent.verticalCenter
            anchors.left: parent.left
            anchors.leftMargin: 10
        }
    }
}

데이터 로딩은 컴포넌트 초기화 시점에 수행됩니다. Component.onCompleted 신호를 활용하여 뷰 생성이 완료되면 JavaScript 함수를 호출하여 모델을 데이터로 채웁니다.

ListView {
    id: recordView
    // ... 기타 속성 설정

    Component.onCompleted: {
        JsModule.loadRecords(recordModel, "all")
    }
}

태그: QtQuick QML SQLite ModelView localStorage

8월 22일 10:33에 게시됨