Russian Qt Forum

Qt => Model-View (MV) => Тема начата: cya-st от Январь 27, 2010, 17:58



Название: Добавление строки
Отправлено: cya-st от Январь 27, 2010, 17:58
Всем привет. Я переопредилил
Код:
    QVariant data(const QModelIndex &index, int role) const
    {
        if(role == Qt::TextColorRole)
{
    if(index.column() == 0)
return QVariant(QColor(Qt::darkGray));
}

if(role == Qt::TextAlignmentRole)
{
    if(index.column() == 0)
return QVariant(Qt::AlignRight | Qt::AlignVCenter);
        }

        return QSqlQueryModel::data(index, role);
    }
в класе QSqlTableModel, того что хотел добился, но при добавлении новой записи в таблицу через QTableView запись не отображается когда я перехожу для ввода следующего поля в строке. Надеюсь правильно выразился. Никто не сталкивался с такой ошибкой?


Название: Re: Добавление строки
Отправлено: cya-st от Январь 27, 2010, 18:23
Еще одна проблема, в таблице (PostgreSQL) есть поле: nm character varying(20) NOT NULL. Из программы в через QTableView, когда я добавляю строку и это поле оставляю пустым, то запись все равно записывается в таблицу с значением поля Nm - две одинарные кавычки, хотя не должно было добавить запись.


Название: Re: Добавление строки
Отправлено: cya-st от Январь 27, 2010, 22:18
Кто нибудь может мне помочь в этом вопросе?


Название: Re: Добавление строки
Отправлено: MoPDoBoPoT от Январь 28, 2010, 00:21
Насчет первой проблемы скорей всего дело в этом:  return QSqlQueryModel::data(index, role)  :)


Название: Re: Добавление строки
Отправлено: cya-st от Январь 28, 2010, 12:49
Насчет первой проблемы скорей всего дело в этом:  return QSqlQueryModel::data(index, role)  :)
Да, недоглядел.
А на счет второй проблемы?


Название: Re: Добавление строки
Отправлено: MoPDoBoPoT от Январь 28, 2010, 14:07
Странная ошибка. А больше ничего не переопределял? Например, setData()?
Такое ощущение, что грешок за QSqlTableModel::insertRowIntoTable(). Продебаж этот метод и посмотри какие значения имеют поля в переданной в него структуре QSqlRecord.


Название: Re: Добавление строки
Отправлено: cya-st от Январь 28, 2010, 17:57
Убрал переопределение, ошибка та же. Добавляю строку так:
Код:
    int row = model.rowCount();
    model.insertRow(row);
    QModelIndex ind = model.index(row, 1);
    ui->tableView->setCurrentIndex(ind);
    ui->tableView->edit(ind);


Название: Re: Добавление строки
Отправлено: crossly от Январь 28, 2010, 19:06
думаю грешок за драйвером....


Название: Re: Добавление строки
Отправлено: MoPDoBoPoT от Январь 28, 2010, 20:23
Хз, ща просмотрел qsql_psql.cpp и не нашел там косяка. Конечно я не досконально все изучил там...
В общем, если в ячейке стоит значение отвечающее QVariant::isNull() == true, то в подготовленный запрос перетается NULL.


Название: Re: Добавление строки
Отправлено: cya-st от Январь 29, 2010, 00:23
Сделал так:
Код:
//...
model.setEditStrategy(QSqlTableModel::OnManualSubmit);
//...
//Add record
model.insertRows(model.rowCount(), 1);
//...
//Save record
model.submitAll();
if( model.lastError().isValid() )
    QMessageBox::warning(this,tr("Error"), model.lastError().text());
Заработало.
Всем спасибо за ответы.


Название: Re: Добавление строки
Отправлено: cya-st от Февраль 08, 2010, 22:48
Вынужден вернутся к обсуждению этой проблемы. После выполнения команды model.insertRows(model.rowCount(), 1); и в tableView я не ввожу данные в поле Nm, то возникает предупреждение БД (...Поле Nm не может быть пустым...) так и должно быть. Но если после команды model.insertRows(model.rowCount(), 1); в tableView я просто щелкну мышкой на поле Nm, то в таблицу записывается запись и поле Nm со значением - две одинарные кавычки.
Помогите пожалуйста, уже не знаю где копать, может это глюк QTableView?


Название: Re: Добавление строки
Отправлено: cya-st от Февраль 08, 2010, 23:18
Может проблема в том, что БД в PostgreSQL в кодировке Win1251?


Название: Re: Добавление строки
Отправлено: cya-st от Февраль 09, 2010, 11:21
Проверил, проблема не в кодировке.


Название: Re: Добавление строки
Отправлено: MoPDoBoPoT от Февраль 09, 2010, 14:47
Где-то накосячено с экранированием апострофа, надо дебажить.


Название: Re: Добавление строки
Отправлено: cya-st от Февраль 09, 2010, 15:04
Где-то накосячено с экранированием апострофа, надо дебажить.
Не может быть, я создал порядка двух тестовых приложений, проблема присутствует. Уверен если вы создадите тоже простенькое приложение с редактированием в QTableView, то проблема будет такой же как у меня.


Название: Re: Добавление строки
Отправлено: MoPDoBoPoT от Февраль 09, 2010, 15:24
Или ты хочешь, чтобы тебе также вылетало предупреждение? Если да, то надо будет на нужный столбец/столбцы повесить свой делегат, и вот почему:
Когда ты всталяешь новую запись и не трогаешь это текстовое поле, то в модели там записан QVariant(QVariant::String) или QVariant(QString()), что тоже самое. В этом случае в это поле QSqlTableModel пытается запись в БД NULL-значение, которое запрещено по ограничению целостности. НО когда ты щелкаешь по этому полю, делегат содает для него эдитор (скорей всего QLineEdit). Этот эдитор возвращает QString, который делегат запишет в модель. Так вот, если в эдиторе ничего не будет введено, то запишется пустая строка - "", то не "инвалид"  :) как раньше.
Короче, нужен делегат примерно с таким методом setModelData():
Код:
...
void TextDelegat::setModelData(QWidget *editor, QAbstractItemModel *model,
                                  const QModelIndex &index) const
{
    QLineEdit *lineEdit = static_cast<QLineEdit *>(editor);
    if (lineEdit->text().isEmpty()) {
        model->setData(index, QVariant(QVariant::String), Qt::EditRole);
        return;
    }

    model->setData(index, lineEdit->text(), Qt::EditRole);
}
...


Название: Re: Добавление строки
Отправлено: MoPDoBoPoT от Февраль 09, 2010, 15:24
Не может быть, я создал порядка двух тестовых приложений, проблема присутствует. Уверен если вы создадите тоже простенькое приложение с редактированием в QTableView, то проблема будет такой же как у меня.
Я имел ввиду не у тебя, а в исходниках Qt.


Название: Re: Добавление строки
Отправлено: cya-st от Февраль 09, 2010, 16:10
Спасибо. Попробую, но позднее, а то я с перепугу :) начал Qt 4.6.1 ставить.