2017-01-06 10 views
0

私はMySQLデータベース、QSqlTableModelQTableViewのチェックボックス列がほとんどありません。それは動作しますが、チェックボックスを最後にクリックしてもデータベースは変更されません。つまり、プログラムを起動すると、チェックボックスを一回クリックしてプログラムを終了すると、データベースの変更は行われません。複数のチェックボックスの状態を変更すると、最後の変更はデータベースに表示されません。おそらく私のsetDataメソッドに何か問題がありますか?QSqlTableModel:最後のチェックステートの変更がデータベースに反映されません

bool PartyModel::setData(const QModelIndex &index, const QVariant &value, int role) 
{ 
    QString h=headerData(index.column(),Qt::Horizontal).toString(); 
    QVariant v=value; 
    switch(role) 
    { 
    case Qt::CheckStateRole: 
     if(h=="One" || h=="Two" || h=="Three" || h=="Four") 
     { 
      if(value.toInt()==Qt::Unchecked) v=0; 
      else v=1; 
      bool ret = QSqlTableModel::setData(index,v,Qt::EditRole); 
      if(ret) emit dataChanged(index,index); 
      return ret; 
     } 
     break; 
    case Qt::DisplayRole: 
    case Qt::EditRole: 
     ....... 
     break; 
    default: 
     break; 
    } 
    return QSqlTableModel::setData(index,v,role); 
} 

QVariant PartyModel::data(const QModelIndex &idx, int role) const 
{ 
    QString h=headerData(idx.column(),Qt::Horizontal).toString(); 
    QVariant v=QSqlTableModel::data(idx,role); 
    switch(role) 
    { 
    case Qt::CheckStateRole: 
     if(h=="One" || h=="Two" || h=="Three" || h=="Four") 
      v = (QSqlTableModel::data(idx,Qt::DisplayRole).toInt()==0 ? Qt::Unchecked : Qt::Checked); 
     break; 
    case Qt::DisplayRole: 
     if(h=="One" || h=="Two" || h=="Three" || h=="Four") 
      v=""; 
     break; 
    default: 
     break; 
    } 
    return v; 
} 

Qt::ItemFlags PartyModel::flags(const QModelIndex &index) const 
{ 
    QString h=headerData(index.column(),Qt::Horizontal).toString(); 
    Qt::ItemFlags f=QSqlQueryModel::flags(index); 
    if(h=="One" || h=="Two" || h=="Three" || h=="Four") 
    { 
     f |= Qt::ItemIsUserCheckable; 
     f &= ~Qt::ItemIsEditable; 
    } 
    return f; 
} 
+1

"デフォルトの編集方法はOnRowChangeです。"おそらく、あなたは 'OnFieldChange'に編集戦略を設定するか、モデルが破壊されたときに' model-> submitAll() 'を確認する必要があります。 – E4z9

+0

@ E4z9ありがとうございました、 'return()'の前の 'submit()'が解決策でした。 –

+0

が回答として追加されました – E4z9

答えて

0

QSqlTabelModelのデフォルトの「編集方針は」名前が、時に選択された行の変更を示唆するよう変更のみが、提出されていることを意味し、OnRowChangeです。他の時点でデータベースに変更を提出するには、編集方法をOnFieldChangeに変更するか、submit()またはsubmitAll()を手動で適切なタイミングで呼び出す必要があります。

関連する問題