이전 연재에서 QML에서 ListModel을 작성하여 목록으로 표시하였다. 이제 C++로 ListModel을 만들어 연동해보자.

QT에서는 관련하여 QAbstractListMode, QAbstractTableModel 을 제공하는데 우리는 ListView에 연동할 리스트를 관리하는 모델임으로 QAbstractListModel을 상속받아서 작성한다. 먼저 QAbstractListModel 은 QAbstractItemModel을 상속받고 있는데 이것이 Table, Tree 를 위한 모델을 포함하여 부모클래스가 된다. 이 클래스에서 주요 가상함수들이 리스트 모델을 구성하는데 있어 중요 함수가 된다. 

3가지 함수를 재정의하는 것이 중요하다.

rowCount 함수를 재정의하면 리스트의 전체 개수를 리턴하여 UI에서 행이 표시될 것이다. data 함수를 재정의하면 그에 따라 리스트 데이터가 출력된다. 입력 인자인 index, role이 각각 row 행 번호와 column 을 가리키다. 만약 GUI의 List를 통해 입력을 받고 싶다면 setData 를 재정의하면 된다. 마지막으로 roleNames를 재정의 해야 QML에서 모델에 각 행에서 컬럼 데이터를 얻을 수 있다. AddressBookListModel 클래스를 생성하여 위 함수를 재정의 해 보자.

위에서 이야기한 몇개 함수만 재정의 하였다. 더불어 데이터의 각 row 정보를 담당하는 구조체도 정의하였다. enum 값으로 정의한 ColumnNames의 역할도 구현부에서 추가 설명할 것인데 이름을 보아도 알 수 있듯이  model에서 접근할 수 있는 컬럼명이 된다. 하단의 QList<ADDRES_BOOK_ITEM>은 포인터 형태로서 ViewModel을 통해 넘겨받아 QML 연동시켜 준다. 구현부는 아래와 같다.

클래스의 생성자에서 enum 값에서 정의된 순서대로 column 명을 정의하였다. 그리고 roleNames에서 그 리스트를 리턴하였다.  rowCount 함수에서는 포인터로 가지고 있는 실제 리스트 데이터의 갯수를 리턴하고 있다.

가장 중요한 data 함수에서는 인자로 넘겨받은 index 정보를 바탕으로 실제 리스트 데이터에서 해당 인덱스의 정보를 가져와서 roleName에 정의된 순서대로 값을 리턴하고 있다. 예상 하겠지만 QML에서는 이 함수를 각 행마다 또 컬럼마다 반복 호출하여 화면에 출력하게 된다.

이 리스트 모델을 ViewModel 에서 멤버로 가지고 있으면서 리스트모델에 데이터를 채워넣어보자. 코드는 아래와 같다.

위에 함수를 보면  getListModel() 함수를 통해 ListModel의 포인터를 리턴하고 있다. 

QML 코드를 보면 ViewModel에 정의된 함수를 호출하여 model 과 연결시켜 주고 있다. 프로그램을 실행하면 전과 종일한 리스트를 확인할 수 있지만 데이터는 QML에서 코딩된 것이 아니라 ViewModel에 정의한 데이터를 통해서 표시되고 있는 것임으로 txt파일이나 json, xml, 혹은 db를 통해 얻은 무한대의 데이터를 화면에 표시할 수 있을 것이다.

  • 마무리 하며 다음 연재는?

QML위주로 작업하다가 QAbstractListModel을 상속받아 리스트 모델을 만드는 과정이 꾀나 복잡하게 느껴졌을지도 모르겠다. 하지만 단지 몇개의 함수만 재정의 하면 놀랍게도 간단히 화면에 C++ 기반의 데이터를 출력할 수 있다. 다음 시간에는 저 위에 버튼 Add, Remove, Edit (텍스트 복사하느라 전부 add인데 무시!) 버튼을 눌러 리스트를 추가, 삭제, 편집하는 것을 해보겠다. 추가, 편집을 위해 새로운 대화상자를 뛰우는 법, 그리고 출력된 리스트를 갱신하는 법을 배우게 될 것이다.

AddressBook.zip
0.01MB

+ Recent posts