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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: QtableView и QSqlTableModel добавление новой строки  (Прочитано 39795 раз)
mwChief
Гость
« : Март 01, 2010, 05:44 »

Обьясните пожалуйста как добавлять новую строку в таблицу. Или дайте ссылку на внятный пример.
« Последнее редактирование: Март 01, 2010, 13:11 от mwChief » Записан
voronElf
Гость
« Ответ #1 : Март 01, 2010, 10:10 »

Если QStandardItemModel, используй insertRow, из доков понятно вполне как пользоваться. Если своя модель, то я это делал обычно внутри, средствами модели, вызывая layoutChanged сигнал.
Записан
Karl-Philipp
Гость
« Ответ #2 : Март 01, 2010, 11:15 »

Обьясните пожалуйста как добавлять новую строку в таблицу. Или дайте ссылку на внятный пример.
ссылка на внятный пример  Веселый
http://doc.qt.nokia.com/4.6/itemviews-editabletreemodel.html
Записан
mwChief
Гость
« Ответ #3 : Март 01, 2010, 13:27 »

Сразу ошибся в названии темы - написал QTableModel вместо QSqlTableModel. Правду говорят что утро вечера мудренее  Смеющийся
Загрузил я  табличку из базы, отобразил в QtableView. Пробую добавлять:
Код:
int row=model.rowCount();
model.insertRow(row);
ui->tableView->selectRow(row);
ui->tableView->setFocus();
Если не так попровьте пожалуйста.
Код выполняется по нажатию на кнопку потому возвращаю фокус TableView.
В результате строка добавляется, но если в нее не добавть значение, то в базу она не сохранится.
Если кнопку нажать сразу два раза то по первому нажатию добавится одна строка, а по второму добавится еще одна строка, но она будет не редактируемой.
То же самое будет со всеми последующими.
Что нужно чтобы все строки сразу сохранялись и их можно было редактировать.
Записан
mwChief
Гость
« Ответ #4 : Март 01, 2010, 19:41 »

Уверен что у меня неправильно. Кто-нибудь обьяснит по шагам что нужно делать чтобы добавить новую строку и чтобы она тут же сохранилась в базу?
« Последнее редактирование: Март 01, 2010, 19:54 от mwChief » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #5 : Март 01, 2010, 19:51 »

Глянь на void QSqlTableModel::setEditStrategy ( EditStrategy strategy )
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
mwChief
Гость
« Ответ #6 : Март 01, 2010, 20:13 »

Смотрел на QSqlTableModel::setEditStrategy. Написано следующее
Note: To prevent inserting only partly initialized rows into the database, OnFieldChange will behave like OnRowChange for newly inserted rows.
А для QSqlTableModel::OnRowChange :
Changes to a row will be applied when the user selects a different row.

Получается мне нужно программно имитировать "user selects a different row."
Вопрос, как это сделать? Это, конечно, с учетом правильности моих выводов и правильности написаного выше кода, в чем я сильно сомневаюсь.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #7 : Март 01, 2010, 20:44 »

Попробуй QSqlTableModel::OnFieldChange
Записан

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

Абсолютно никакого эффекта.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #9 : Март 01, 2010, 21:01 »

Приложи сюда минимальный компилябельный пример.
Записан

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

Вот пример, хотелось бы чтоб при нажатии на кнопку добавить все добавленные элементы сохранялись в базу, даже если их не править после вставки.
http://narod.ru/disk/20530310000/example.zip.html
« Последнее редактирование: Май 08, 2010, 17:18 от mwChief » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #11 : Март 01, 2010, 22:17 »

Сильно копаться времени нет, но помогло вот что:
Код
C++ (Qt)
model->insertRow(row);
model->setData(model->index(row, 0), "");
 
Т.е. нужно инициализировать хоть одно поле.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
mwChief
Гость
« Ответ #12 : Март 01, 2010, 22:37 »

Одна это строка не помогла
Код
C++ (Qt)
model->setData(model->index(row, 0), "");
 
Добавил еще
Код
C++ (Qt)
model->submitAll();
 
тогда заработало.
Спасибо.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #13 : Март 01, 2010, 23:19 »

А можно сделать ход конем - добавлять запись через QSqlQuery и обновлять модель.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
trenkinan
Гость
« Ответ #14 : Май 08, 2010, 15:47 »

А у меня почему-то не добавляется. Есть  QSqlTableModel и QTableView. в меню есть кнопка для которой сделан обработчик:
Код:
void MainWindow::on_create_record_triggered()
{
    QSqlRecord rec = model1.record();
    ui->mytable->selectRow(row);//Где row - число строк
    model1->insertRow(row);
    model1->setData(model1->index(row, 0), "");//Пустая строка
    ui->mytable->setFocus();//Так как вызываю ф-ию из меню
}
При нажатии на кнопку реакции никакой, сам обработчик срабатывает
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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