Я создал 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. Это отвечает на мой актуальный вопрос. Конечно, меня интересует, как установить этот флаг. Класс модельного индекса не имеет метода, позволяющего установить флаги. Возможно, в этот момент мне следует взглянуть на подклассы прокси-класса, чтобы он позволял редактировать столбцы.