2013-01-07 2 views
8

Qt를 사용하여 테이블을 구현해야합니다.QAbstractTableModel 내에서 데이터를 설정하는 방법

저는이 모델을 사용하는 QTableView를 사용하여 QAbstractTableModel을 고소 할 것이라고 믿습니다.

모델의 rowCount(), columnCount() 및 data() 함수를 편집해야한다는 것을 알고 있습니다.

는이 목적을 위해 제공되는 사항 setData() 함수인가 .. 데이터() 함수를 검색 할 수 있도록

그러나, 나는 정확히 모델 내부의 데이터를 설정하는 방법을 이해하지? 필자는 필자의 테이블을 편집 가능하게하지 않기 때문에 필자가 원치 않는 EditRole을 매개 변수로 사용하는 것을 보았습니다.

그래서 data() 함수를 사용하여 모델 내부의 데이터를 "설정"하거나 모델의 데이터를 가져 오는 방법은 무엇입니까?

또한 data() 함수를 호출하는 사람, 즉 누가 그것을 호출하고 어떻게 호출해야합니까?

도와주세요.

감사합니다.

+2

[This] (http://qt-project.org/doc/qt-4.8/itemviews-addressbook.html)는 예입니다. –

+0

고마워요. 많은 도움이되었습니다. – user1173240

답변

14

데이터 저장소에서 실제 데이터를 메모리에 저장하거나 생성하거나 쿼리하는 방법은 전적으로 귀하에게 달려 있습니다. 정적 데이터 인 경우 Qt container classes 또는 사용자 정의 데이터 구조를 사용할 수 있습니다.

편집 가능한 모델의 경우 setData() 메서드 만 다시 구현하면됩니다. 이러한 메소드가 호출된다

  • int rowCount()
  • int columnCount()
  • QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole)
  • QVariant data(const QModelIndex & index, int role = Qt::DisplayRole)

:

는 편집 할 수없는 QAbstractTableModel 하위 클래스에서 구현해야하는 4 가지 방법이 있습니다 보기, 일반적으로 QTableView 인스턴스. 처음 두 메서드는 테이블의 크기를 반환해야합니다. 예를 들어 rowCount()이 이고 columnCount()4을 반환하면 뷰는 모델의 내부 데이터 구조에서 실제 데이터를 요청하는 data() 메서드를 40 번 (각 셀당 한 번) 호출합니다.

예를 들어 모델에 사용자 정의 슬롯 retrieveDataFromMarsCuriosity()을 구현했다고 가정합니다. 이 슬롯은 데이터 구조를 채우고 QPushButton 인스턴스에 연결되어 있기 때문에 버튼을 클릭하여 새로운 데이터를 얻을 수 있습니다. 이제 데이터를 올바르게 업데이트 할 수 있도록 데이터가 변경되는 시점을보기에 알려야합니다. 따라서 beginRemoveRows(), endRemoveRows(), beginInsertRows(), endInsertRows() 및 해당 열을 방출해야합니다.

Qt Documentation에는 이에 대해 알아야 할 모든 것이 있습니다.

+0

신속한 도움을 제공해 주셔서 감사합니다. 나는 확실히 그것을 들여다 볼 것이다. – user1173240

+0

@dschulz, 첫 번째 초기화에 beginInsertRows() 등을 사용하는 것이 절대적으로 필요합니까? 그럼 나는 dataChanged()의 목적을 이해하지 못한다. Qt가 rowCount(), columnCount() & data()를 사용하여 정보를 검색 할 수없는 이유는 무엇입니까? beginInsertRows() 등을 사용하여 행 및 열을 작성해야하는 이유는 무엇입니까? –

+0

@Cool_Coder 네,'insertRows()'를 다시 구현해야합니다. 모델의 데이터 컨테이너에 항목을 추가하기 전에'beginInsertRows()'를 호출해야합니다 ('QList' 또는 사용하는 컨테이너 클래스). "변경된 데이터"는 반드시 행 또는 열이 추가 또는 제거된다는 의미는 아닙니다. 'dataChanged()'는 모델에서 존재하는 아이템 _의 데이터가 업데이트되었음을 ​​의미하므로 뷰는 업데이트 된 데이터를 검색 할 수 있습니다. 편집 가능한'QTableView' 셀에서 이름을 수정할 때 일어나는 일에 대해서 생각해보십시오. – dschulz