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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QTableView - как установить пустое значение?  (Прочитано 7523 раз)
PavelVX
Гость
« : Июль 18, 2011, 09:33 »

На форме есть QTableView. Если устанавливать любое значение(1,2,3), то все нормально, а вот если хочу установить пустое(null) значение, то возвращает предыдущее. Подскажите, как быть-то?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Июль 18, 2011, 09:44 »

Что за модель используешь? Как устанавливаешь значение?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
PavelVX
Гость
« Ответ #2 : Июль 18, 2011, 09:56 »

Наследник от QSqlQueryModel, с переопределенными флагами для редактирования, раскраской.
Значения пишутся в базу через переопределенный setData. Но уже туда приходит старое значение, если я пытаюсь пустое значение ручками прописать в QTableView.
Редактирую руками. Например нужно убрать не туда проставленное количество.
« Последнее редактирование: Июль 18, 2011, 09:57 от PavelVX » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Июль 18, 2011, 09:57 »

Реализацию setData покажи.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
PavelVX
Гость
« Ответ #4 : Июль 18, 2011, 10:00 »

Я использую переделанный пример!
Код
C++ (Qt)
//! [1]
bool EditableSqlModel::setData(const QModelIndex &index, const QVariant &value, int /* role */)
{
   if (!editableFields.contains(index.column()))
       return false;
 
   QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), keyFieldNumber);
   int id = data(primaryKeyIndex).toInt();
 
   clear();
 
   bool ok = setDataToQuery(id, index.column(), value);
 
   refresh();
   return ok;
}
//! [1]
 
//! [2]
bool EditableSqlModel::setDataToQuery(QVariant keyValue, int fNumber, const QVariant &value)
{
   QString lSQL = "update " + tableName + " set " + editableFields[fNumber] + " = ? where " + keyFieldName + " = ?";
   QSqlQuery query;
   query.prepare(lSQL);
   query.addBindValue(value);
   query.addBindValue(keyValue);
   return query.exec();
}
//! [2]
 
« Последнее редактирование: Июль 18, 2011, 10:03 от Пантер » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Июль 18, 2011, 10:03 »

А query.exec() что возвращает? Если false, то глянь query.lastError ().text ().
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
PavelVX
Гость
« Ответ #6 : Июль 18, 2011, 10:12 »

bool EditableSqlModel::setDataToQuery(QVariant keyValue, int fNumber, const QVariant &value)
{
//если тут сделать так:
qDebug() << value;
//то когда мы захотим убрать значение, вставить пустышку, то уже сюда придет старое значение. Это-то меня и удивляет Грустный
А как правильно код убирать? Типа как вы мой в нормальный скроллинг убрали.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Июль 18, 2011, 10:18 »

Странно это все... Можешь минимальный компилябельный пример приложить?

Цитировать
А как правильно код убирать? Типа как вы мой в нормальный скроллинг убрали.

Для этого есть тег code.
Код
C++ (Qt)
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
PavelVX
Гость
« Ответ #8 : Июль 18, 2011, 10:24 »

хмм, а к базе его как цеплять будете?
Переделывать, что бы он к чему-то другому цеплялся нужно время Грустный
teamview не используете? Могу вживую тогда показать Улыбающийся
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Июль 18, 2011, 10:25 »

Можно попробовать через teamview, давай в личку параметры.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Странник
Гость
« Ответ #10 : Июль 18, 2011, 10:30 »

по-моему, надо в сторону setModelData делегата копать, если в setData модели уже старое значение приходит.
Записан
PavelVX
Гость
« Ответ #11 : Июль 18, 2011, 10:38 »

по-моему, надо в сторону setModelData делегата копать, если в setData модели уже старое значение приходит.
хмм, а это мысль. Правда делегат там по умолчанию похоже ставится.
Записан
Странник
Гость
« Ответ #12 : Июль 18, 2011, 10:57 »

еще меня конкретно смущает, что setData переопределяется для любой роли. корректнее будет
Код:
bool EditableSqlModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if (role != Qt::EditRole) return QSqlQueryModel::setData(index, value, role);

    if (!editableFields.contains(index.column()))
        return false;
 
    QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), keyFieldNumber);
    int id = data(primaryKeyIndex).toInt();
 
    clear();
 
    bool ok = setDataToQuery(id, index.column(), value);
 
    refresh();
    return ok;
}
Записан
PavelVX
Гость
« Ответ #13 : Июль 18, 2011, 11:24 »

это ничего не меняет, на входе в эту функцию или старое значене. или новое, не пустое. А как в сторону делегата в данном случае копать? Появляется спинбокс. Или можно как-то вообще запретить делегата для данной колонки?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #14 : Июль 18, 2011, 11:27 »

Можно своего делегата навесить.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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