2017-01-03 130 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