2013-07-22 10 views
4

나는 내 TreeItem 제외 열 == 1의 인스턴스를 채울 모델QAbstractItemModel에서 QCheckBox를 설정하는 방법은 무엇입니까?

class TreeModel : public QAbstractItemModel 

있습니다.

QVariant TreeModel::data(const QModelIndex &index, int role) const { 
    if (!index.isValid()) 
     return QVariant(); 

    if (role != Qt::DisplayRole) { 
     if (role == Qt::CheckStateRole) { 
      if (index.column() == 1) { 
       if (index.row() == 1) { 
        return Qt::Unchecked; 
       } else 
        return Qt::Checked; 
      } 
     } 
     return QVariant(); 
    } 
    if (role == Qt::DisplayRole) { 
     if (index.column() != 1) { 
      TreeItem *item = static_cast<TreeItem*>(index.internalPointer()); 
      return item->data(index.column()); 
     } 
    } 
    return QVariant(); 
    } 

내가 Qt::Checked 또는 Qt::Unchecked 이러한 확인란에게 동상을 설정할 수 있지만 내 문제는 다음과 같습니다 : 1 열에서 내가 CheckBoxes을 만든 그들은를 클릭 할 때 은 나중에 변경할 수 없습니다 (그러나 setData가 호출됩니다 적절한 index.column==1role==Qt::CheckStateRole). ItemDelegate으로 예를 보았습니다. 사실입니까? 이 시나리오에서는 대리인을 사용해야합니까?

bool TreeModel::setData(const QModelIndex & index, const QVariant & value, 
     int role) { 
    if (role==Qt::CheckStateRole && index.column() == 1) { 
     TreeItem *item = static_cast<TreeItem*>(index.internalPointer()); 
     QTreeWidgetItem *check = static_cast<QTreeWidgetItem*>(index.internalPointer()); 

     //if (item->data(index.column()) == Qt::Checked) 
     if (value == Qt::Checked){ 
      int i=1; 
      //check->setCheckState(1,Qt::Checked); //SIGSEGV 
     }else{ 
      //(item->data(index.column())) = Qt::Unchecked; 
      int i=2; 
      //check->setCheckState(1,Qt::Unchecked); 
     } 

     emit dataChanged(index, index); 
     return true; 
    } 
    emit dataChanged(index, index); 
    return true;; 
} 


Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const { 
    if (!index.isValid()) 
     return 0; 

    return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEditable; 
    } 

답변

4

나는 Qt 개념을 이해하지 못했습니다.

) (

사항 setData()

bool TreeModel::setData(const QModelIndex & index, const QVariant & value, 
     int role) { 
    if (role==Qt::CheckStateRole && index.column() == 1) { 
     TreeItem *item = static_cast<TreeItem*>(index.internalPointer()); 
     QTreeWidgetItem *check = static_cast<QTreeWidgetItem*>(index.internalPointer()); 

     if (value == Qt::Checked){ 
      int i=1; 
      checkedState_=Qt::Checked; 
     }else{ 
      int i=2; 
      checkedState_=Qt::Unchecked; 
     } 

데이터 :이 새 값으로 데이터()에서 모델을 채우는 다음 사항 setData (저장 체크 상태)에 데이터를 설정하고 있고, 체크 박스 모두이 반환되는 당신이 플래그를 반환해야합니다 flags 방법에

QVariant TreeModel::data(const QModelIndex &index, int role) const { 
    if (!index.isValid()) 
     return QVariant(); 

    if (role != Qt::DisplayRole) { 
     if (role == Qt::CheckStateRole) { 
      if (index.column() == 1) { 
        return checkedState_; 
      } 
     } 
     return QVariant(); 
    } 
    if (role == Qt::DisplayRole) { 
     if (index.column() != 1) { 
      TreeItem *item = static_cast<TreeItem*>(index.internalPointer()); 
      return item->data(index.column()); 
     } 
    } 
    return QVariant(); 
    } 
    emit dataChanged(index, index); 
    return true; 
} 
emit dataChanged(index, index); 
return true;; 

} 어떤 ItemDelegate없이

+0

그래서, 내가 한 말) – Trompa

+0

대단히 또한 감사합니다. setData()에 데이터를 저장하는 것은 내가 놓친 것이다. – 4pie0

2

그것은 당신이 항상 데이터의 동일한 결과 (CheckStateRole)에 대한 체크되지

if (role == Qt::CheckStateRole) { 
      if (index.column() == 1) { 
       if (index.row() == 1) { 
        return Qt::Unchecked; 
       } else 
        return Qt::Checked; 
      } 
     } 

(1,1)를 반환하는 것을 나에게 이상한 것 : 여기

setData() 기능입니다 (0, 1로 구분)

setData()가 호출되고 있지만 뷰에서 모델에 값을 쿼리하면 항상 동일한 데이터()가 반환됩니다

0

사용 예를 내가 @Trompa 우리가 그것을 다른 값을 반환하거나이 값을 저장하고 검색 할 필요가 제안,이 작업 예제를 만들 관리 우리 data()는 특정 인덱스에서 실제 상태를 가져옵니다.

QVector<int> status; 
int SData::getStatus(int pos) 
{ 
    return status.at(pos); 
} 

void SData::setStatus(int pos,int value) 
{ 
    status.insert(pos, value); 
} 
QVariant STableModel::data(const QModelIndex &index, int role) const 
{ 
    if (!index.isValid()) 
     return QVariant(); 

    if (role == Qt::DisplayRole) 
     return rowList[index.row()][index.column()]; 
    else if (role == Qt::CheckStateRole && index.column() == 0) 
    { 

     int status = SData::instance().getStatus(index.row()); 
     if (status) 
      return Qt::Checked; 
     else 
      return Qt::Unchecked; 
    } 
    else 
     return QVariant(); 
} 

bool STableModel::setData(const QModelIndex &index, 
         const QVariant &value, int role) 
{ 
    if (!index.isValid() /*|| role != Qt::EditRole*/) 
     return false; 
    if (role == Qt::CheckStateRole) 
    { 
     if ((Qt::CheckState)value.toInt() == Qt::Checked) 
     { 
      SData::instance().setStatus(index.row(),1); 
      return true; 
     } 
     else 
     { 
      SData::instance().setStatus(index.row(), 0); 
      return true; 
     } 
    }