Почему QSortFilterProxyModel.setData () возвращает false? - PullRequest
1 голос
/ 06 сентября 2011

Я создал QSortFilterProxyModel из моего QSqlTableModel и успешно добавил в него дополнительный столбец, чтобы я мог добавить поле разницы, которое было бы пустой тратой пространства в таблице базы данных.

Однако функция setData от экземпляра модели прокси возвращает false. Никаких других ошибок компиляции или выполнения не происходит.

QSortFilterProxyModel *balanceProxyModel = new QSortFilterProxyModel(this);
balanceProxyModel->setSourceModel(balanceModel);

// add a Diff column
balanceProxyModel->insertColumn(6);
balanceProxyModel->setHeaderData(
  6, Qt::Horizontal, QObject::tr("Difference"));

for (int i = 0; i < balanceProxyModel->rowCount(); ++i) {
  float budget = balanceProxyModel->index(i, 4).data().toFloat();
  float actual = balanceProxyModel->index(i, 5).data().toFloat();
  float difference = budget - actual;

  if (balanceModel->setData(
      balanceModel->index(i, 6), QVariant(difference)) == false) {
    qDebug() << ATLINE << ":"
      << "diff not added!!!";
  }

Для каждой записи я получаю "diff not add !!!" так как setData терпит неудачу (возвращая false.)

Спасибо.

- обновление 20110907_0754-- Я попробовал предложение ixM и исправил небольшую ошибку, но это не решило проблему. Я все еще получаю "diff not add" (или false из функции setData.)

if (balanceProxyModel->setData(
    balanceProxyModel->index(i, 6), QVariant(difference)) == false) {
  qDebug() << ATLINE << ":"
    << "diff not added!!!";
}

- обновление 20110907_2205-- Я добавил следующее (кстати, поле Разница не отображается):

qDebug() << "balanceProxyModel->insertColumn(6);";
qDebug() << balanceProxyModel->insertColumn(6);

И получил в stdout следующие результаты:

Debug: balanceProxyModel->insertColumn(6); 
Debug: true 

Позже я добавил в цикл следующее:

qDebug() << "balanceModel->index(i, 6);";
qDebug() << balanceModel->index(i, 6);

в стандартный вывод:

Debug: balanceModel->index(i, 6); 
Debug: QModelIndex(128,6,0x0,QSqlTableModel(0x1d10bf0) )  

- обновление 20110908_2153-- Хм, я не рассматривал настройку свойств в столбце. Вот результат вашего теста:

qDebug() 
  << (bool)(balanceProxyModel->flags(diffModelIndex) & Qt::ItemIsEditable) 
  << (bool)(balanceProxyModel->flags(diffModelIndex) & Qt::ItemIsEnabled);

Результаты:

Debug: false true 

Из теста, предложенного ixM, результаты показывают, что Qt :: ItemIsEditable имеет значение false. Это отвечает на мой актуальный вопрос. Конечно, меня интересует, как установить этот флаг. Класс модельного индекса не имеет метода, позволяющего установить флаги. Возможно, в этот момент мне следует взглянуть на подклассы прокси-класса, чтобы он позволял редактировать столбцы.

1 Ответ

2 голосов
/ 06 сентября 2011

Может быть, вы должны сделать balanceProxyModel-> setData (balanceProxyModel-> index (i, 6))

Я думаю, вы используете не ту модель;)

При возникновении таких ошибок всегда следует проверять, какой индекс возвращается методом индекса (который в данном случае, вероятно, является недопустимым индексом).

Редактировать> Что означает qDebug() << balanceProxyModel->insertColumn(6); сказать? Человек говорит, что вставляет столбец перед указанным столбцом поз. Может стоит попробовать с 7 вместо 6? Что значит qDebug() << balanceProxyModel->index(i, 6); в цикле?

Редактировать 2> Хорошо, единственное, о чем я могу думать, это отсутствие флага для этого столбца. Не могли бы вы вставить результат qDebug() << (bool)(balanceProxyModel->flags() & Qt::ItemIsEditable) << (bool)(balanceProxyModel->flags() & Qt::ItemIsEnabled);?

Последнее редактирование> Да, единственный известный мне способ изменить флаги - это создать подкласс для используемой вами модели. В Qt есть некоторые вещи, которые немного разочаровывают: /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...