2017-01-03 3 views
0

У меня есть subclassed 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, который вызывает setData QSqlQueryModel для любой роли, отличной от EditRole. Поскольку QSqlQueryModel сам по себе не переопределяет setData, он вызывает setData QAbstractItemModel, который всегда возвращает false.

Итак, теперь я делаю все вызовы setData() с помощью EditRole, а data() возвращает значения из исходной модели, хранящейся в EditRole.

+0

Какой метод 'setData()' возвращает 'false'? I.e. является ли метод прокси, возвращающий «ложь» самостоятельно или потому, что меход исходной модели сделал? –

+1

Какой 'false' возвращается? У вас есть три «фальши» в прокси-модели и два в основной модели. –

+0

Все методы setData для основной и прокси-модели возвращают false. sourceModel() -> setData() возвращает false. – user2522981

ответ

1

Здесь Вы данные устанавливаете только для EditRole и DisplayRole. Другие роли, такие как 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 блок не имеет смысла, потому что в обоих случаях вы выполняете ту же работу. –

+0

Но значение, которое я передаю, будет отличаться для обеих ролей в первом столбце. Если бы я должен был удалить else, не было ли значение для обеих ролей задано в зависимости от того, какая функция setData() вызывается с последним? – user2522981

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