crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> проблема с моделью на основе QSqlQueryModel
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 индекс передается со строкой и столбцом.
В чем может быть проблема?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 30.8.2010, 0:32
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

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




Репутация:   9  


Пока навскидку: нумерация столбцов начинается с 0, то есть редактируемыми должны быть столбцы 1 и 2 (просто из запроса не ясно сколько фактически столбцов).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maniakus
  опции профиля:
сообщение 30.8.2010, 0:44
Сообщение #3


Новичок


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

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




Репутация:   0  


Да нет там все правильно. Первые два столбца (0 и 1) в последствии будут скрыты, а последние два (2 и 3) как раз и будут использоваться.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_xls_*
сообщение 30.8.2010, 16:31
Сообщение #4





Гости








    


ты упустил модификатор const при объявлении функции data(...)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maniakus
  опции профиля:
сообщение 30.8.2010, 16:52
Сообщение #5


Новичок


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

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




Репутация:   0  


Omg в самом деле. Заработало! Спасибо! А то 2й день втыкаю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.8.2010, 22:20
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


maniakus, убрав
Цитата(Гость_xls_* @ 30.8.2010, 20:31) *
модификатор const
ты просто создал новую перегруженную функцию, вместо переопределения виртуальной.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 25.4.2024, 17:19