crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

maniakus
  опции профиля:
сообщение 30.8.2010, 0:20
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 30.8.2010
Пользователь №: 1990

Спасибо сказали: 0 раз(а)




Репутация:   0  


Доброго времени суток.
Делаю свою модель на основе QSqlQueryModel. Нужно чтобы столбцы 2 и 3 были редактируемые и 3й представлялся в виде чекбокса. Скопипастил из примера, доработал. Получилось следующее:
answersqlmodel.h :
#ifndef ANSWERSQLMODEL_H
#define ANSWERSQLMODEL_H

#include <QSqlQueryModel>

class AnswerSqlModel : public QSqlQueryModel //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 /* role */)
{
    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 индекс передается со строкой и столбцом.
В чем может быть проблема?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 16.6.2025, 12:52