2017-01-03 16 views
0

私はサブクラス化されたQAbstractProxyModelを持ち、そのソースモデルはQSqlTableModelのサブクラスです。プロキシモデルは、一度にソースモデルの行を1つだけ表示する必要があります。QAbstractProxyModelのsetDataはfalseを返します

bool SensorDisplayModel::setData(const QModelIndex &index, const QVariant &value, int role) 
{ 
    if(!index.isValid()) 
     return false; 

    QModelIndex sourceIdx = mapToSource(index); 

    if(role == Qt::DisplayRole || role == Qt::EditRole) 
    { 
     if(sourceIdx.isValid()) 
     { 
      if(sourceModel()->setData(sourceIdx, value, role)) 
      { 
//    emit dataChanged(index, index); 
       return true; 
      } 
      return false; 
     } 
     else 
      return false; 
    } 

    return false; 
} 

ソースモデル::ここでは、コードです

bool SensorModel::setData(const QModelIndex &index, const QVariant &value, int role) 
{ 
    if(!index.isValid()) 
     return false; 

    if(role == Qt::EditRole || role == Qt::DisplayRole) 
    { 
     if(index.column() != 0) 
      return QSqlTableModel::setData(index, value, Qt::EditRole) && 
       QSqlTableModel::setData(index, value, Qt::DisplayRole); 
     else 
      return QSqlTableModel::setData(index, value, role); 
    } 

    return false; 
} 

新しい行がソースモデルに追加する必要があるときに呼び出され、次の

void SensorDisplayModel::addSensor() 
{ 
    QString ro_id; 
    bool success = false; 

    if(sensorModel->insertRows(sensorModel->rowCount(), 1)) 
    { 
     selectedRow = sensorModel->rowCount() - 1; 
     ro_id = "DB-" + QString("%1").arg(SensorDisplayModel::id_no, 
              3, 10, QChar('0')); 
     comboBoxItems.append(ro_id); 
     success = setData(createIndex(0, 0), QVariant(comboBoxItems), Qt::EditRole); 
     success &= setData(createIndex(0, 0), QVariant(ro_id), Qt::DisplayRole); 
     SensorDisplayModel::id_no++; 
     success &= setData(createIndex(0, 1), QVariant(QString("Name"))); 
     success &= setData(createIndex(0, 2), QVariant(-1)); 
     success &= setData(createIndex(0, 3), QVariant(-1)); 
     success &= setData(createIndex(0, 4), QVariant((long long)0)); 
     success &= setData(createIndex(0, 5), QVariant(QString("??"))); 
     success &= setData(createIndex(0, 6), QVariant(QString("??"))); 

     if(success) 
      emit dataChanged(createIndex(0, 0), createIndex(0, columnCount() - 1)); 

     ID2Row[data(createIndex(0, 0)).toString()] = selectedRow; 
    } 
} 

selectedRowがプライベートメンバーですソースモデルの現在の行を保存します。

setData()は常にfalseを返します。ソースモデルは手動送信に設定されています。私は間違って何をしていますか?

編集:

私は問題を把握しました。私が使用するソースモデルは、QSqlTableModelのサブクラスで、EditRole以外のロールに対してQSqlQueryModelのsetDataを呼び出します。 QSqlQueryModel自体はsetDataを再実装しないため、常にfalseを返すQAbstractItemModelのsetDataを呼び出します。

これで、EditRoleですべてのsetData()呼び出しを行い、data()はEditRoleの下に保存されたソースモデルから値を返します。

+0

2つの 'setData()'メソッドのどれが 'false'を返しますか? I.それ自身で 'false'を返すプロキシのメソッドか、ソースモデルのメードが行ったものなのでしょうか? –

+1

'false'が返されますか?プロキシモデルには3つの「偽り」があり、メインモデルには2つあります。 –

+0

メインモデルとプロキシモデルのすべてのsetDataメソッドはfalseを返します。 sourceModel() - > setData()はfalseを返します。 – user2522981

答えて

1

ここでは、EditRoleDisplayRoleのデータのみを設定します。 ForegroundRoleなどの他のロールは、falseを返すため設定されません。コードでは標準クラス以外の何もしないので、明らかに両方のモデルをサブクラス化する必要はありません。後でいくつかのコードを追加したい場合は、少なくとも、また

return QSqlTableModel::setData(index,value,role); 

に2つ目のブロックに

return QAbstractProxyModel::setData(index,value,role); 

と最後return falseに最初のブロックでこれを最後return falseを変更:

if(index.column() != 0) 
     return QSqlTableModel::setData(index, value, Qt::EditRole) && 
      QSqlTableModel::setData(index, value, Qt::DisplayRole); 
    else 
     return QSqlTableModel::setData(index, value, role); 

には意味がありません。

+0

私は残念です。しかし、私はQtを使ってモデル/ビュープログラミングを始めました。最初の列を除くすべてのロールに対して、編集ロールと表示ロールの両方に同じ値を設定したいとします。私が間違っていることを説明できますか? – user2522981

+0

これらの2つの役割に関する条件があります。とにかくデータを設定します。それは0番目の列かそれ以外のものです。両方の場合に同じ仕事をしているので、/ elseブロックには意味がありません。 –

+0

しかし、私が渡す値は、最初の列のどちらの役割でも異なります。 elseを削除する場合、両方のロールの値を、setData()が最後に呼び出されたロールに設定しないでください。 – user2522981

関連する問題