2014-07-25 2 views
1

QT를 처음 사용했습니다. qml tableview의 모든 행을 확인 가능하게 만들고 싶지만 작동하지 않습니다.QML qml tableview를 사용하여 QAbstractTableModel을 확인하는 방법

데이터가있는 테이블 뷰가 성공적으로 표시되지만 선택되지는 않습니다.

flags() 및 setData() 함수가 실행되지 않고 role == Qt :: CheckStateRole이 true가 아닌 것으로 보입니다.

도와주세요.

C++ 코드

내가 좋아하는 코드를 수정했지만 작동하지 않습니다 여기

QVariant TableModel::data(const QModelIndex & index, int role) const { 

    if (index.row() < 0 || index.row() >= _fields->size()) 
     return QVariant(); 

    if(role == Qt::CheckStateRole) { 
     return rowsChk.contains(index.row()) ? Qt::Checked : Qt::Unchecked; 
    } 

    switch(role) { 
     case NameRole: 
      return model.name(); 
     case DescriptionRole: 
      return model.description(); 
     case TypeRole: 
      return model.type(); 
    } 

    return QVariant(); 
} 

bool TableModel::setData(const QModelIndex & index, const QVariant & value, int role){ 
     rowsChecked(index.row(), value) ; 
     emit dataChanged(index, index); 
     return true; 
} 

이 사항 setData() 메소드가 당신 때문에 호출되지 않습니다

TableView { 
     model: tableModel 
     anchors.fill: parent 
     frameVisible: true 
     headerVisible: true 
     sortIndicatorVisible: false 
     alternatingRowColors: true 

     Component { 
      id: checkBoxDelegate 

      Item { 
       CheckBox { 
        anchors.fill: parent 
        checked: styleData.value 
       } 
      } 
     } 

     TableViewColumn { 
      role: "check" 
      title: "" 
      width: 30 
      delegate: checkBoxDelegate 
     } 


     TableViewColumn { 
      role: "name" 
      title: "Name" 
      width: 200 

     } 
     TableViewColumn { 
      role: "description" 
      title: "Description" 
      width: 100 
     } 

     TableViewColumn { 
      role: "type" 
      title: "Type" 
      width: 100 
     } 

답변

0

내 QML 파일입니다 아마도 메소드를 다시 구현하지 않았습니다 :

QHash<int, QByteArray> roleNames() const; 

이것은 QAbstractTableModel이 상속하는 클래스 인 QAbstractItemModel의 가상 메서드입니다. QML은 이것이 없으면 귀하의 역할이 무엇을 의미하는지 알지 못하며 데이터를 신경 쓰지 않습니다. - 같은 문제가

QHash<int, QByteArray> FieldModel::roleNames() const 
{ 
    QHash<int, QByteArray> roles; 
    roles[NameRole] = "name"; 
    roles[DescriptionRole] = "description"; 
    roles[FilterRole] = "filter"; 
    roles[TypeRole] = "type"; 
    return roles; 
} 

가 개인적으로, 나는

Qt::ItemFlags flags(const QModelIndex &index) const; 

메서드가 호출되지 않는 이유 아무 생각이 : 귀하의 경우에는이 방법이 방법을 정의해야합니다. 그러나 당신은 당신의 QML에서 TableViewColumn의 대리자를 정의하여이를 해결할 수 :

Component { 
    id: checkBoxDelegate 

Item { 
    CheckBox { 
     anchors.fill: parent 
     checked: styleData.value 
    } 
} 
} 

다음 열이 대리자를 할당합니다

TableViewColumn { 
      role: "name" 
      title: "Name" 
      width: 200 
      delegate: checkBoxDelegate 
     } 

그런 다음 열이 값에 의해 지정됩니다 CheckBox 컨트롤을 포함 방법

QVariant FieldModel::data(const QModelIndex & index, int role) const; 

단지 선택 상태의 체크 및 QString 1 ("참")에 대한 값은 0 또는 QString ("FALSE")를 반환한다.

+0

"checked : styleData.value"를 사용했는데 클릭했을 때 확인란이 업데이트되지 않았습니다. –

+0

체크 가능한 행과 같은 것은 없다고 생각합니다. 체크 가능한 행은 열만 가능합니다. 확인란이있는 세로 테이블 머리글을 정의하는 것보다 확인 가능한 행 동작이 필요한 경우 TableView 행 대리자를 정의하고 해당 onClicked (int 행) 신호가 출력 될 때이 확인란을 설정하십시오. 나는 더 구체적 일 수는 없다는 것을 유감스럽게 생각합니다. – vitakot

+0

내 첫 번째 게시물을 참조하십시오. 제안한 코드를 수정했지만 여전히 작동하지 않습니다. –