2017-01-03 34 views
0

我有子類QAbstractProxyModel和它的源模型是QSqlTableModel的子類。代理模型一次只能顯示一行源模型。下面的代碼:setData返回false爲QAbstractProxyModel

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,所以它調用QAbstractItemModel的setData,它始終返回false。因此,現在我使用EditRole調用所有setData(),data()從EditRole下存儲的源模型返回值。

+0

兩個'setData()'方法中的哪一個返回'false'? 也就是說是代理的方法自己返回「false」還是因爲源代碼模型的方法? –

+1

哪個'false'返回?代理模式中有三個「錯誤」,主模式中有兩個「錯誤」。 – 2017-01-03 10:22:24

+0

主模型和代理模型的所有setData方法都返回false。 sourceModel() - > setData()返回false。 – user2522981

回答

1

此處僅設置數據爲EditRoleDisplayRole。其他角色(例如ForegroundRole)未設置,因爲您返回false。顯然,你不需要爲這兩個模型子類化,因爲你的代碼除了標準類之外什麼都不做。如果您想在以後添加一些代碼,至少在第一個塊中第二塊改變你的最後return false

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

和最後return false

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

而且,這樣的:

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

您有與這兩個角色有關的條件。無論如何,您可以設置數據,無論是第0列還是其他數據。如果/ else塊沒有意義,因爲在這兩種情況下你都在做同樣的工作。 – 2017-01-03 13:36:13

+0

但是,我通過的值對於第一列中的任何角色都會有所不同。如果我要刪除else,那麼兩個角色的值是不是被設置爲setData()在上一次調用的角色? – user2522981