2017-01-06 2 views
0

У меня есть база данных MySQL, QSqlTableModel и QTableView с несколькими столбцами флажков. Он работает, но последний щелчок на флажке не вызывает изменений в базе данных. Это означает, что если я запустил программу, нажмите один флажок и закройте программу, никаких изменений в базе данных не будет. Если я изменю состояние нескольких флажков, последнее изменение не будет отображаться в базе данных. Может быть, что-то не так в моем методе setData?QSqlTableModel: последнее изменение checkstate не отражается на базе данных

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 Спасибо, 'submit()' before' return() 'было решением. –

+0

добавил это как ответ – E4z9

ответ

0

по умолчанию «стратегия редактирования» из QSqlTabelModel является OnRowChange, что означает, что изменения только представили, как следует из названия, когда выбранные изменения строки. Чтобы отправить изменения в базу данных в другое время, вам необходимо либо изменить стратегию редактирования на OnFieldChange, либо вручную позвонить submit() или submitAll() в соответствующее время.

Смежные вопросы