Название: Добавление строки Отправлено: cya-st от Январь 27, 2010, 17:58 Всем привет. Я переопредилил
Код: QVariant data(const QModelIndex &index, int role) const Название: 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(); Название: 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 Сделал так:
Код: //... Всем спасибо за ответы. Название: 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(): Код: ... Название: Re: Добавление строки Отправлено: MoPDoBoPoT от Февраль 09, 2010, 15:24 Не может быть, я создал порядка двух тестовых приложений, проблема присутствует. Уверен если вы создадите тоже простенькое приложение с редактированием в QTableView, то проблема будет такой же как у меня. Я имел ввиду не у тебя, а в исходниках Qt.Название: Re: Добавление строки Отправлено: cya-st от Февраль 09, 2010, 16:10 Спасибо. Попробую, но позднее, а то я с перепугу :) начал Qt 4.6.1 ставить.
|