Russian Qt Forum
Ноябрь 24, 2024, 04:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Модель на основе QSqlQueryModel с режимом редактирования и полем checkbox  (Прочитано 4509 раз)
alex-v
Гость
« : Июнь 24, 2011, 16:01 »

Добрый день!
Нужна своя модель на основе QSqlQueryModel с возможность редактирования некоторых полей. Эта задача решена. Остаётся непонятным как реализовать изменения состояния поля БД когда ему в QTableView соответствует checkable поле.
Подскажите как это сделать?

Вот мой код:

Код:
#include "OrdersSqlModel.h"

#include <QSqlQuery>


OrdersSqlModel::OrdersSqlModel(QObject *parent) :
    QSqlQueryModel(parent)
{
}
//---------------------------------------------------------------------

bool OrdersSqlModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 0);
    const int id = data(primaryKeyIndex).toInt();
    QString fieldName;

    if (index.column()==1)
        fieldName = "fio";
    else if (index.column()==3)
        fieldName = "stoimost_byr";
    else if (index.column()==4)
        fieldName = "predoplata";
    else if (index.column()==6)
        fieldName = "dolg_robert";
    else if (index.column()==7)
        fieldName = "vozvrat_robert";
    else if (index.column()==8)
        fieldName = "vozvrat_date";
    else if (index.column()==9)
        fieldName = "zp_montazhniki";
    else if (index.column()==12)
        fieldName = "zp_director";
    else if (index.column()==13)
        fieldName = "zp_otkosy";
    else if (index.column()==14)
        fieldName = "count_windows";
    else if (index.column()==15)
        fieldName = "count_skrutki";
    else if (index.column()==16)
        fieldName = "count_balkony";
    else if (index.column()==17)
        fieldName = "count_otkosy";
    else if (index.column()==18)
        fieldName = "count_mask_setki";
    else
        return false;

    QSqlQuery sql;

    bool res = sql.exec(QString("UPDATE orders SET %1='%2' WHERE id=%3").arg(fieldName).arg(value.toString()).arg(id));

    setQuery(query().lastQuery());

    return res;
}
//---------------------------------------------------------------------

Qt::ItemFlags OrdersSqlModel::flags(const QModelIndex &index) const
{
    if (index.column()==1 ||
        index.column()==3 ||
        index.column()==4 ||
        index.column()==6 ||
        index.column()==7 ||
        index.column()==8 ||
        index.column()==9 ||
        index.column()==12 ||
        index.column()==13 ||
        index.column()==14 ||
        index.column()==15 ||
        index.column()==16 ||
        index.column()==17 ||
        index.column()==18)
        return Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled;

    if (index.column()==2)
        return Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable;

    return Qt::ItemIsEnabled;
}
//---------------------------------------------------------------------

QVariant OrdersSqlModel::data(const QModelIndex &index, int role) const
{
    if (index.column()==2)
    {
        if (role==Qt::DisplayRole)
            return QVariant();

        const int state = QSqlQueryModel::data(index).toInt();
        return QVariant( state ? Qt::Checked : Qt::Unchecked );
    }

    return QSqlQueryModel::data(index, role);
}
//---------------------------------------------------------------------

Записан
alex-v
Гость
« Ответ #1 : Июнь 24, 2011, 16:02 »

в таблице на экране флажек в checkable поле не меняется вообще... что тут исправить?
Записан
MoPDoBoPoT
Гость
« Ответ #2 : Июнь 24, 2011, 21:10 »

Так ты в методе setData() пропустил обработку этого столбца (index.column()==2)
Записан
alex-v
Гость
« Ответ #3 : Июнь 25, 2011, 09:19 »

Да. Спасибо. Упустил как-то...
Еще такой вопрос - в поле с чекбоксом рядом еще стоит спин-бокс, где можно менять число этого поля (т.к. оно INTEGER в базе).
Как скрыть этот спин-бокс?
Записан
MoPDoBoPoT
Гость
« Ответ #4 : Июнь 25, 2011, 13:45 »

Попробуй для этого столбца убрать флаг Qt::ItemIsEditable
Записан
alex-v
Гость
« Ответ #5 : Июнь 25, 2011, 14:03 »

да. работает. благодарю.
последний наверно вопрос - как сделать чтобы чекбокс был посреди поля, а не по левому краю?
С Богом.
Записан
RVZ
Гость
« Ответ #6 : Июль 13, 2011, 09:25 »

Доброго времени суток!
В общем идея такая есть модель по типу той которая описана здесь только в основе
Код
SQL
SELECT *, 0 AS Choice , '' AS Coment FROM myTable
То есть поля Choice и Coment в базе не существуют и инфа из них требуется только при принятии решения о формировании отчета по данному объекту(из списка приведенного в моделе).
Подскажите пожалуйста как мне сделать так чтобы модель хранила данные ЧекБоксов(Choice) и Едитов(Coment) без отправки в базу данных?
Заранее всем спасибо.
« Последнее редактирование: Июль 13, 2011, 09:27 от RVZ » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.167 секунд. Запросов: 20.