Доброго времени суток.
Делаю свою модель на основе QSqlQueryModel. Нужно чтобы столбцы 2 и 3 были редактируемые и 3й представлялся в виде чекбокса. Скопипастил из примера, доработал. Получилось следующее:
answersqlmodel.h :
#ifndef ANSWERSQLMODEL_H
#define ANSWERSQLMODEL_H
#include <QSqlQueryModel>
class AnswerSqlModel : public QSqlQueryModel
{
Q_OBJECT
public:
AnswerSqlModel(QObject *parent = 0);
Qt::ItemFlags flags(const QModelIndex &index) const;
QVariant data(const QModelIndex &index, int role);
bool setData(const QModelIndex &index, const QVariant &value, int role);
void setCurrentQuestion(int question);
void refresh();
private:
bool setAnswerText(int answerId, const QString &answerText);
bool setIsTrue(int answerId, bool isTrue);
int CurrentQuestion;
};
#endif // ANSWERSQLMODEL_H
answersqlmodel.cpp :
#include "answersqlmodel.h"
#include <QtSql>
#include <QDebug>
AnswerSqlModel::AnswerSqlModel(QObject *parent)
: QSqlQueryModel(parent)
{
}
Qt::ItemFlags AnswerSqlModel::flags(
const QModelIndex &index) const
{
Qt::ItemFlags flags = QSqlQueryModel::flags(index);
if (index.column() == 2)
flags |= Qt::ItemIsEditable;
if (index.column() == 3)
flags |= Qt::ItemIsEnabled |Qt::ItemIsEditable | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable;
return flags;
}
QVariant AnswerSqlModel::data(const QModelIndex &index, int role)
{
QVariant value = QSqlQueryModel::data(index, role);
qDebug() << ">> " << index.column() << index.row() << " value " << value << "\n";
switch (role) {
case Qt::DisplayRole:
case Qt::EditRole:
if (index.column() == 3)
{
return value.toInt() != 0 ? tr("Yes") : tr("No");
}
case Qt::CheckStateRole:
if (index.column() == 3)
{
return (QSqlQueryModel::data(index).toInt() != 0) ? Qt::Checked : Qt::Unchecked;
}
else
return value;
}
return value;
}
bool AnswerSqlModel::setData(const QModelIndex &index, const QVariant &value, int )
{
qDebug() << ">> " << index.column() << index.row() << " value " << value << "\n";
if (index.column() < 2 || index.column() > 3)
return false;
QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 0);
int id = data(primaryKeyIndex, Qt::DisplayRole).toInt();
clear();
bool ok;
if (index.column() == 2) {
ok = setAnswerText(id, value.toString());
} else
if (index.column() == 3) {
ok = setIsTrue(id, value.toBool());
}
refresh();
return ok;
}
void AnswerSqlModel::setCurrentQuestion(int question)
{
CurrentQuestion = question;
}
void AnswerSqlModel::refresh()
{
QSqlQuery query;
query.prepare("SELECT * FROM answers WHERE question_id=:question_id");
query.bindValue(":question_id", CurrentQuestion);
query.exec();
this->setQuery(query);
this->setHeaderData(2, Qt::Horizontal, QObject::tr("Answer Text"));
this->setHeaderData(3, Qt::Horizontal, QObject::tr("Correct?"));
}
bool AnswerSqlModel::setAnswerText(int answerId, const QString &answerText)
{
QSqlQuery query;
query.prepare("UPDATE answers SET answerText = :answerText WHERE answer_id = :answers_id");
query.bindValue(":answerText",answerText);
query.bindValue(":answer_id",answerId);
return query.exec();
}
bool AnswerSqlModel::setIsTrue(int answerId, bool isTrue)
{
QSqlQuery query;
query.prepare("UPDATE answers SET isTrue = :isTrue WHERE answer_id = :answers_id");
query.bindValue(":isTrue", isTrue);
query.bindValue(":answer_id",answerId);
return query.exec();
}
Проблема в том что при вызове data (при клике на ячейку например) в index передается индекс только с номером строки, а номер столбца всегда нулевой. Поэтому условие if (index.column() == 3) не срабатывает и никакого чекбокса не появляется. При вызове же setData индекс передается со строкой и столбцом.
В чем может быть проблема?