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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSqlQueryModel - создание редактируемого класса -наследника  (Прочитано 5695 раз)
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));
        }
    }

Не пашет ни в какую. Отладчиком проверял, картинка грузится, цвет тоже, но не отображается ни то, ни другое.
Как это можно исправить?
Записан
alexman
Гость
« Ответ #1 : Апрель 27, 2011, 08:17 »

Про цвет. Попробуй так:
Код:
        if (item.column() == 2)
        {
            return Qt::blue;
        }
        else if (item.column() == 3)
        {
            return Qt::green;
        }

А для иконки обрабатывай роль Qt::DecorationRole.
« Последнее редактирование: Апрель 27, 2011, 08:19 от alexman » Записан
strength2008
Гость
« Ответ #2 : Апрель 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");
        }

    }
Тоже не помогло...
« Последнее редактирование: Апрель 27, 2011, 08:44 от strength2008 » Записан
Troglodit
Гость
« Ответ #3 : Апрель 27, 2011, 10:14 »

а как решилась проблема редактирования полей. имхо -это на порялок сложнее, чем изменение цвета?
Записан
Troglodit
Гость
« Ответ #4 : Апрель 27, 2011, 10:18 »

возможно вы не верно указали заголовок data() и поэтому вызывается метод родителя.
проверьте хэдэр.
Код:
QVariant data(const QModelIndex &item, int role) const; 
Записан
strength2008
Гость
« Ответ #5 : Апрель 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;
« Последнее редактирование: Апрель 27, 2011, 11:14 от strength2008 » Записан
Troglodit
Гость
« Ответ #6 : Апрель 27, 2011, 11:17 »

насчет методов -это понятно, но тогда для изменения одной записи, вызывать кучу обновлений, либо самому реализовывать отложенное обновление как в QSqlTableModel.

По поводу цвета: хедер точно соответствует родительскому методу data()?
Вы уверены,что ваш метод вызывается, а не метод родителя?
Записан
strength2008
Гость
« Ответ #7 : Апрель 27, 2011, 11:39 »

Ну да, уверен, т.к. отладчиком проверял, в новом методе точку останова где цвет ставил.
Записан
strength2008
Гость
« Ответ #8 : Апрель 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);
        }
    }

имеем желамое, т.е. цвет отображается.
А вот с картинкой по-прежнему все плохо...((((
« Последнее редактирование: Апрель 27, 2011, 11:53 от strength2008 » Записан
strength2008
Гость
« Ответ #9 : Апрель 28, 2011, 16:59 »

Насчет картинки больше никто ничего не может подсказать? Улыбающийся
Записан
Troglodit
Гость
« Ответ #10 : Апрель 29, 2011, 22:31 »

А если попробовать возвращать QColor. Если я правильно понял , то должен отбражать просто закрашенный квадрат.
Записан
Troglodit
Гость
« Ответ #11 : Апрель 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");
        }

    }
Записан
strength2008
Гость
« Ответ #12 : Апрель 30, 2011, 07:23 »

Я так, как в последнем листинге написано, уже пробовал. Собственно, у меня щас там такой код и есть. Но все-по прежнему((
Попробую еще раз документацию перечитать, может там будет что-то подходящее.. Хотя у Макса Шлее в книге пример отображения иконки в табличной модели именно такой, какой в последнем листинге.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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