crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QSqlTableModel+QListView добавление новой записи вручную..., хнык :(
LE0N
  опции профиля:
сообщение 17.3.2009, 6:19
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 97
Регистрация: 10.3.2009
Из: Беларусь
Пользователь №: 604

Спасибо сказали: 0 раз(а)




Репутация:   0  


Имеется простенькая задача - при нажатии на кнопку "добавить" нужно добавить ещё одну запись в модель.
Редактирование произвести через QListView. Всё бы хорошо. Всё добавляется. Кроме одного - мне нужно на ходу в другие ( не редактируемые QListView поля, добавить свои переменные...
НИ ХЕРА НЕ ВЫХОДИТ! Уже пол ночи с этим колупаюсь!
Вот, собственно, слот с данным действием. (Заменил QListView, на QTableView ноль реакции, ещё и неприятные визуальные эффекты стали возникать...).
void admin_products::add_new_product() {
    QModelIndex insertIndex = ui.tableView->currentIndex();
    int row = insertIndex.row() == -1 ? 0 : insertIndex.row();
    this->products_model->insertRow(row);
    this->products_model->record(row).setValue(2,this->selected_product_type_id);
    insertIndex = this->products_model->index(row, 0);
    ui.tableView->setCurrentIndex(insertIndex);
    ui.tableView->edit(insertIndex);
}

Кроме(внутри функции, приведённой выше):
    this->products_model->insertRow(row);
    this->products_model->record(row).setValue(2,this->selected_product_type_id);

Пробывал и insertRecord...Ноль реакции. В таблицу попадает полностью пустая запись...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 17.3.2009, 9:10
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(LE0N @ 17.3.2009, 6:19) *
void admin_products::add_new_product() {
       ...
    this->products_model->record(row).setValue(2,this->selected_product_type_id);
       ...
}

record как описанна?
Если так QSqlRecord record( int ), то ты изменяешь локальную копию записи.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
LE0N
  опции профиля:
сообщение 17.3.2009, 9:43
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 97
Регистрация: 10.3.2009
Из: Беларусь
Пользователь №: 604

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата
Если так QSqlRecord record( int ), то ты изменяешь локальную копию записи.

Да хоть так пишу... Разницы НОЛЬ!
    QSqlRecord *r=new QSqlRecord();
    r->setValue(1,"Новый продукт");
    r->setValue(2,this->selected_product_type_id);
    this->products_model->insertRecord(row,*r);

[offtopic]
ЗЫ. маленький ликбез...Правильно ли я понял, что если передаёшь ссылку на переменную, инициализированную локально (QSqlRecord bla;) в какую-нибудь функцию, то она убивается после того, как функция, в которой она инициализировалась, завершается? Если это так. То как в последствии поступают тру Си-Плюс-Плюснеги, когда им требуется уничтожить эту самую QSqlRecord, инициализированную через new ? Создают свойство и убивают в деструкторе? Даже если эта QSqlRecord используется в одном месте ? =\
ЗЫ.ЗЫ. Перехожу с чистого СИ, на СИ++ QT :)
[/offtopic]

Сообщение отредактировал LE0N - 17.3.2009, 9:47
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 17.3.2009, 9:52
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(LE0N @ 17.3.2009, 9:43) *
Да хоть так пишу... Разницы НОЛЬ!

Как и писал раньше, сам QSqlTableModel не пользуюсь, но вот цитата из assistent:
Раскрывающийся текст

Цитата
Use QSqlTableModel::record() to retrieve a row in the table, and QSqlTableModel::setRecord() to modify the row. For example, the following code will increase every employee's salary by 10 per cent:
for (int i = 0; i < model.rowCount(); ++i) {
QSqlRecord record = model.record(i);
double salary = record.value("salary").toInt();
salary *= 1.1;
record.setValue("salary", salary);
model.setRecord(i, record);
}
model.submitAll();
You can also use QSqlTableModel::data() and QSqlTableModel::setData(), which are inherited from QAbstractItemModel, to access the data. For example, here's how to update a record using setData():
model.setData(model.index(row, column), 75000);
model.submitAll();
Here's how to insert a row and populate it:
model.insertRows(row, 1);
model.setData(model.index(row, 0), 1013);
model.setData(model.index(row, 1), "Peter Gordon");
model.setData(model.index(row, 2), 68500);
model.submitAll();
Here's how to delete five consecutive rows:
model.removeRows(row, 5);
model.submitAll();
The first argument to QSqlTableModel::removeRows() is the index of the first row to delete.
When you're finished changing a record, you should always call QSqlTableModel::submitAll() to ensure that the changes are written to the database.

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 17.3.2009, 9:58
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


QSqlRecord работает только в одну сторону - принимает данные из базы, но менять их не может. А вот SqlTableMode::submitAll уже транслирует твои действия с моделью на базу данных.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
LE0N
  опции профиля:
сообщение 17.3.2009, 10:05
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 97
Регистрация: 10.3.2009
Из: Беларусь
Пользователь №: 604

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата
но вот цитата из assistent:

Скорее бы и я так научился с асистентом работать.
Заманал QT со своими двойными стандартами реализации :(
setData сработал...Спасибо..
Цитата
QSqlRecord работает только в одну сторону - принимает данные из базы

Интересно, а зачем тогда в нём есть методы публичные setValue ????
Мне не в базе нужно менять. А в модели. А уже модель будет менять в базе.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.4.2024, 20:52