Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: PavelVX от Июль 18, 2011, 09:33



Название: QTableView - как установить пустое значение?
Отправлено: PavelVX от Июль 18, 2011, 09:33
На форме есть QTableView. Если устанавливать любое значение(1,2,3), то все нормально, а вот если хочу установить пустое(null) значение, то возвращает предыдущее. Подскажите, как быть-то?


Название: Re: QTableView - как установить пустое значение?
Отправлено: Пантер от Июль 18, 2011, 09:44
Что за модель используешь? Как устанавливаешь значение?


Название: Re: QTableView - как установить пустое значение?
Отправлено: PavelVX от Июль 18, 2011, 09:56
Наследник от QSqlQueryModel, с переопределенными флагами для редактирования, раскраской.
Значения пишутся в базу через переопределенный setData. Но уже туда приходит старое значение, если я пытаюсь пустое значение ручками прописать в QTableView.
Редактирую руками. Например нужно убрать не туда проставленное количество.


Название: Re: QTableView - как установить пустое значение?
Отправлено: Пантер от Июль 18, 2011, 09:57
Реализацию setData покажи.


Название: Re: QTableView - как установить пустое значение?
Отправлено: PavelVX от Июль 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]
 


Название: Re: QTableView - как установить пустое значение?
Отправлено: Пантер от Июль 18, 2011, 10:03
А query.exec() что возвращает? Если false, то глянь query.lastError ().text ().


Название: Re: QTableView - как установить пустое значение?
Отправлено: PavelVX от Июль 18, 2011, 10:12
bool EditableSqlModel::setDataToQuery(QVariant keyValue, int fNumber, const QVariant &value)
{
//если тут сделать так:
qDebug() << value;
//то когда мы захотим убрать значение, вставить пустышку, то уже сюда придет старое значение. Это-то меня и удивляет :(
А как правильно код убирать? Типа как вы мой в нормальный скроллинг убрали.


Название: Re: QTableView - как установить пустое значение?
Отправлено: Пантер от Июль 18, 2011, 10:18
Странно это все... Можешь минимальный компилябельный пример приложить?

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

Для этого есть тег code.
Код
C++ (Qt)
 


Название: Re: QTableView - как установить пустое значение?
Отправлено: PavelVX от Июль 18, 2011, 10:24
хмм, а к базе его как цеплять будете?
Переделывать, что бы он к чему-то другому цеплялся нужно время :(
teamview не используете? Могу вживую тогда показать :)


Название: Re: QTableView - как установить пустое значение?
Отправлено: Пантер от Июль 18, 2011, 10:25
Можно попробовать через teamview, давай в личку параметры.


Название: Re: QTableView - как установить пустое значение?
Отправлено: Странник от Июль 18, 2011, 10:30
по-моему, надо в сторону setModelData делегата копать, если в setData модели уже старое значение приходит.


Название: Re: QTableView - как установить пустое значение?
Отправлено: PavelVX от Июль 18, 2011, 10:38
по-моему, надо в сторону setModelData делегата копать, если в setData модели уже старое значение приходит.
хмм, а это мысль. Правда делегат там по умолчанию похоже ставится.


Название: Re: QTableView - как установить пустое значение?
Отправлено: Странник от Июль 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;
}


Название: Re: QTableView - как установить пустое значение?
Отправлено: PavelVX от Июль 18, 2011, 11:24
это ничего не меняет, на входе в эту функцию или старое значене. или новое, не пустое. А как в сторону делегата в данном случае копать? Появляется спинбокс. Или можно как-то вообще запретить делегата для данной колонки?


Название: Re: QTableView - как установить пустое значение?
Отправлено: Пантер от Июль 18, 2011, 11:27
Можно своего делегата навесить.


Название: Re: QTableView - как установить пустое значение?
Отправлено: Странник от Июль 18, 2011, 11:28
о, тогда уже никуда копать не надо. пустое значение не проходит валидацию в QSpinBox. пишите свой делегат, либо ищите обходные пути для сброса значения. например, по нажатию кнопки записывать в модель нулевое значение через setData.


Название: Re: QTableView - как установить пустое значение?
Отправлено: PavelVX от Июль 18, 2011, 12:05
нда, уж сколько раз накалывался на такое: за тебя все придумают, а тебе потом ломать. :( Потому как придуманное не работает :(. Чем дальше. тем меньше мне нравится Qt. Уже и баг один отловил с делегатами и QSqlRelation. :( Для новичка это полный перебор.
Тогда такой вопрос: а что, я могу к к любой модели привинтить своего делегата???? А отвинтить не могу???


Название: Re: QTableView - как установить пустое значение?
Отправлено: Пантер от Июль 18, 2011, 12:40
Делегат не к модели прикручивается, а к вьюхе.


Название: Re: QTableView - как установить пустое значение?
Отправлено: PavelVX от Июль 20, 2011, 06:58
спасибо!
Создал своего делегета на основе QLineEdit и все заработало как надо.