Russian Qt Forum

Qt => Базы данных => Тема начата: strength2008 от Апрель 27, 2011, 07:47



Название: QSqlQueryModel - создание редактируемого класса -наследника
Отправлено: strength2008 от Апрель 27, 2011, 07:47
Всем доброго времени суток.
Возникла следующая проблема.
Для своих нужд пришось создать новый класс - наследник от QSqlQueryModel, все делал на основании Qt-шных примеров. Что от нового класса я хотел -
1)Возможность редактирования некотрых полей.
2)Подсветка цветом текста в нужных колонках
3)Отображение пиктограмм в некоторых колонках заместо текста.

Первая задача решилась на ура. Вторая и третья не решились никак.
Код переопределения QSqlEditableModel::data() в части пиктограммы и подсветки цветом:

Код:
if (data.isValid() && item.column() == 4 && role == Qt::DisplayRole)
    {
        QImage image;
        if (data.toString() == QString("YES"))
        {
            image.load(":/images/ok.PNG","PNG");
           
        }
        else if (data.toString() == QString("NO"))
        {
            image.load(":/images/no.PNG","PNG");
        }



        return image;
    }

    if (data.isValid() && role == Qt::TextColorRole)
    {
        if (item.column() == 2)
        {
            return qVariantFromValue(QColor(Qt::blue));
        }
        else if (item.column() == 3)
        {
            return qVariantFromValue(QColor(Qt::green));
        }
    }

Не пашет ни в какую. Отладчиком проверял, картинка грузится, цвет тоже, но не отображается ни то, ни другое.
Как это можно исправить?


Название: Re: QSqlQueryModel - создание редактируемого класса -наследника
Отправлено: alexman от Апрель 27, 2011, 08:17
Про цвет. Попробуй так:
Код:
        if (item.column() == 2)
        {
            return Qt::blue;
        }
        else if (item.column() == 3)
        {
            return Qt::green;
        }

А для иконки обрабатывай роль Qt::DecorationRole.


Название: Re: QSqlQueryModel - создание редактируемого класса -наследника
Отправлено: strength2008 от Апрель 27, 2011, 08:32
спасибо за ответ, но не помогло(( Все по-прежнему((
Попробовал так:
Код:
if (item.column() == 2)
        {
            return QVariant(Qt::blue);
        }
        else if (item.column() == 3)
        {
            return QVariant(Qt::green);
        }
И так тоже не пашет...

С иконкой попробовал переписать так:

Код:
if (data.isValid() && item.column() == 4 && role == Qt::DecorationRole)
    {

        if (data.toString() == QString("YES"))
        {

            return QIcon(":/images/ok.PNG");

        }
        else if (data.toString() == QString("NO"))
        {

            return QIcon(":/images/no.PNG");
        }

    }
Тоже не помогло...


Название: Re: QSqlQueryModel - создание редактируемого класса -наследника
Отправлено: Troglodit от Апрель 27, 2011, 10:14
а как решилась проблема редактирования полей. имхо -это на порялок сложнее, чем изменение цвета?


Название: Re: QSqlQueryModel - создание редактируемого класса -наследника
Отправлено: Troglodit от Апрель 27, 2011, 10:18
возможно вы не верно указали заголовок data() и поэтому вызывается метод родителя.
проверьте хэдэр.
Код:
QVariant data(const QModelIndex &item, int role) const; 


Название: Re: QSqlQueryModel - создание редактируемого класса -наследника
Отправлено: strength2008 от Апрель 27, 2011, 11:11
Да поля-то нормально редактируются, говорю же,что сделано так же, как в примерах Qt-шных.
Т.е. переопределены функции -члены
Код:
bool setData(const QModelIndex &item, const QVariant &value, int role = Qt::DisplayRole);
Qt::ItemFlags flags(const QModelIndex &index) const;
А вот с цветом и с картинками загвоздка.

В хэдере вроде все нормально:
Код:
QVariant data(const QModelIndex &item, int role = Qt::DisplayRole) const;


Название: Re: QSqlQueryModel - создание редактируемого класса -наследника
Отправлено: Troglodit от Апрель 27, 2011, 11:17
насчет методов -это понятно, но тогда для изменения одной записи, вызывать кучу обновлений, либо самому реализовывать отложенное обновление как в QSqlTableModel.

По поводу цвета: хедер точно соответствует родительскому методу data()?
Вы уверены,что ваш метод вызывается, а не метод родителя?


Название: Re: QSqlQueryModel - создание редактируемого класса -наследника
Отправлено: strength2008 от Апрель 27, 2011, 11:39
Ну да, уверен, т.к. отладчиком проверял, в новом методе точку останова где цвет ставил.


Название: Re: QSqlQueryModel - создание редактируемого класса -наследника
Отправлено: strength2008 от Апрель 27, 2011, 11:51
Ура! Проблема с цветом разрешилась. Причина бага была в следующем:

Функция(переопределенная) начинается с вызова функции класса-родителя
 
Код:
QVariant data=QSqlQueryModel::data(item,role);

Так вот, в случае, когда вызывается role == Qt::TextColorRole, значение data.isValid == INVALID!
Соответственно, переписав конец функции с цветом следующим образом:

Код:
if (role == Qt::TextColorRole)
    {
        if (item.column() == 2)
        {
            return QVariant(Qt::blue);
        }
        else if (item.column() == 3)
        {
            return QVariant(Qt::green);
        }
    }

имеем желамое, т.е. цвет отображается.
А вот с картинкой по-прежнему все плохо...((((


Название: Re: QSqlQueryModel - создание редактируемого класса -наследника
Отправлено: strength2008 от Апрель 28, 2011, 16:59
Насчет картинки больше никто ничего не может подсказать? :)


Название: Re: QSqlQueryModel - создание редактируемого класса -наследника
Отправлено: Troglodit от Апрель 29, 2011, 22:31
А если попробовать возвращать QColor. Если я правильно понял , то должен отбражать просто закрашенный квадрат.


Название: Re: QSqlQueryModel - создание редактируемого класса -наследника
Отправлено: Troglodit от Апрель 29, 2011, 22:36
и попробовать

Код:
if (item.column() == 4 && role == Qt::DecorationRole)
    {

        if (data.toString() == QString("YES"))
        {

            return QIcon(":/images/ok.PNG");

        }
        else
        {

            return QIcon(":/images/no.PNG");
        }

    }


Название: Re: QSqlQueryModel - создание редактируемого класса -наследника
Отправлено: strength2008 от Апрель 30, 2011, 07:23
Я так, как в последнем листинге написано, уже пробовал. Собственно, у меня щас там такой код и есть. Но все-по прежнему((
Попробую еще раз документацию перечитать, может там будет что-то подходящее.. Хотя у Макса Шлее в книге пример отображения иконки в табличной модели именно такой, какой в последнем листинге.