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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: QtableView и QSqlTableModel добавление новой строки  (Прочитано 39805 раз)
crossly
Гость
« Ответ #15 : Май 08, 2010, 15:55 »

Код:
void MainWindow::on_create_record_triggered()
{
    QSqlRecord rec = model1.record();
    model1->insertRecord(-1,rec);
    model1->submitAll();
}
Записан
trenkinan
Гость
« Ответ #16 : Май 08, 2010, 18:04 »

Никакой реакции
Записан
trenkinan
Гость
« Ответ #17 : Май 09, 2010, 14:44 »

и зачем вообще -1 в insertrow.  нам нужно число строк и это явно не -1. Я уже все мыслимые методы добавления перепробовал, не добавляет. Может зависит от конкретной совокупности виджетов...вот мои: tableview, sqlrelationtablemodel, и собсно добавляю :
Код
C++ (Qt)
QSqlRecord rec = model1.record(row);
   model1.insertRecord(row,rec);
model1.submitAll();
Хочу получить пустую строку, далее уже имеющимися средствами ее редактировать. Что же может быть не так?
Записан
trenkinan
Гость
« Ответ #18 : Май 09, 2010, 21:32 »

удаление повесил на эту же кнопку, не работает:
Код
C++ (Qt)
model1.removeRows(row-1,row);
model1.submitAll();
Может всё зависит от сигналов\слотов. Хотя остальное, что есть в этом обработчие есть выполняется да и  model1.lasterror() возвращает (-1"",""). В чем же может быть дело?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #19 : Май 09, 2010, 22:06 »

Код
C++ (Qt)
// ---------- вставка строки в модель ----------
int row = model->rowCount();
 
if (!model->insertRow(row))
{
QMessageBox::critical(this, tr("БД"),
tr("Вставка строки вызвала следующую ошибку:\r\n %1")
.arg(model->lastError().databaseText()));
return;
}
 
// ---------- Удаление строки из модели ----------
 
// Узнаем выделенную строку
QItemSelectionModel *selectionModel = view->selectionModel();
QModelIndexList indexes = selectionModel->selectedIndexes();
 
int size = indexes.size();
 
if (size > 1){
int ret = QMessageBox::critical(this,
tr("Предупреждение"),
tr("Вы уверены что хотите удалить %1 строк?").arg(),
QMessageBox::Yes | QMessageBox::Cancel
);
if (ret == QMessageBox::Cancel){
return;
}
}
 
 
 
foreach(QModelIndex index, indexes)
{
QString str;
int row = index.row();
if (!model->removeRows(row,1)){
str = model->lastError().text();
qDebug() << str << "\n\r";
break;
}
}
 
 
// ---------- Сохранение изменений ----------
if (!model->submitAll()){
qDebug() << "Model Error:" << model->lastError();
model->revertAll();
return;
}
 
 
« Последнее редактирование: Май 09, 2010, 22:08 от lit-uriy » Записан

Юра.
trenkinan
Гость
« Ответ #20 : Май 09, 2010, 22:25 »

Спасибо, добрый человек, но сам до этого додумался недавно:
Код
C++ (Qt)
if(!model1.insertRows(row,1))
{
   qDebug()<<"not insrted, because:"<<model1.lastError();
}
Выдает:
Код:
not insrted, because: QSqlError(-1, "", "") 

Но вот что выдает удаление...:
Код
C++ (Qt)
if(!model1.removeRow(row))
{
   qDebug()<<"not removed in if, because:";
   qDebug()<<model1.lastError();
}

собственно:
Код:
not removed in if, because: 
QSqlError(-1, "Unable to delete row", "")
Записан
trenkinan
Гость
« Ответ #21 : Май 09, 2010, 23:13 »

И вот что еще интересно, если написать :
Код
C++ (Qt)
model1.insertRows(row,1);
   insertIndex = model1.index(row, 0);
     qDebug()<<insertIndex;
ui->mytable->setCurrentIndex(insertIndex);
ui->mytable->edit(insertIndex);
model1.submitAll();
 
то выдаёт:
Код:
QModelIndex(-1,-1,0x0,QObject(0x0) ) 
edit: index was invalid
edit: editing failed
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #22 : Май 09, 2010, 23:39 »

>>not insrted, because: QSqlError(-1, "", "")
а в представлении строка появляется?
Записан

Юра.
trenkinan
Гость
« Ответ #23 : Май 10, 2010, 08:08 »

нет, туда я ее и хочу получить и вручную редактировать.
Проблема в индексе, только не могу понять , почему такое может быть и как с этим бороться...
Код
C++ (Qt)
insertIndex = model1.index(22, 0);
   qDebug()<<model1.index(22,0);
   qDebug()<<insertIndex;
Результат одинаковый:
Код:
QModelIndex(-1,-1,0x0,QObject(0x0) ) 
QModelIndex(-1,-1,0x0,QObject(0x0) )
при этом rowcount() выдает верное число
Записан
trenkinan
Гость
« Ответ #24 : Май 10, 2010, 13:12 »

ни у кого больше нет мыслей по этому поводу?
Записан
trenkinan
Гость
« Ответ #25 : Май 10, 2010, 14:17 »

Почти отрыл собаку, были проблемы с указателем... теперь, вроде как колонки добавляет, думаю строки тоже, но ... таблица теперь не отображается...
В хедере:
Код
C++ (Qt)
QSqlTableModel model1;
QTableView view;
В исходнике:
Код
C++ (Qt)
   model1.setTable("peoples4");
   model1.select();
   ui->mytable->setModel(&model1);
   ui->mytable->setEditTriggers(QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed);
  view.setModel(&model1);
До этого у меня в исходнике создавался указатель и в setmodel  я указвал просто model1 без &. Почему может не отображаться содержимое таблицы?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #26 : Май 10, 2010, 15:07 »

Расскажи подробнее об этих объектах:
ui->mytable
и
view
Где создаются какой тип имеют.
Также интересно услышать причину создания объекта на стеке вместо динамического создания
Записан

Юра.
trenkinan
Гость
« Ответ #27 : Май 10, 2010, 16:11 »

mytable это мой центральный виджет qtableview. Но теперь это не важно, создал тестовый проект , в нем реализовал часть функционала и добавление строк. Добавление работает отлично! А вот с моим проектом интересное творится...: Добавляю в ui новый элемент через дизайнер, ну предположим еще одну кнопку в меню. Все прекрасно добавляется, при запуске предлагает сохранить изменения в project.ui сохраняю и запускась , только вот кнопки созданной нету в программе. Я писал несколько информационыых сообщений в qDebug() чтобы отследить работу некоторых частей и они меня информировали, писали нужные данные, стали мне не нужны - я их удалил, только они по прежнему пишут... Прямо код -призрак. Сделал rebuild all, перенес проект в другую папку, Убрал "только для чтения" ничего не помогло, по прежнему изменения не вносятся, с остальным разобрался, проект немаленький, не хочется с нуля переписывать... Кто-нибудь сталкивался с такой магией?
Записан
trenkinan
Гость
« Ответ #28 : Май 10, 2010, 18:06 »

В Общем имеет место у меня неправильное использование указателей:
В хедере:
Код
C++ (Qt)
  QSqlTableModel model1;

Далее в исходнике использую указатель, иначе не будет добавлять строки...
Код
C++ (Qt)
  ui->mytable->setModel(&model1);
А вот в другой функции как мне применить указатель, когда я хочу сделать в
Код
C++ (Qt)
void rowexper::on_actionFrty_triggered()
{
  model1.insertRow(model1.rowCount());
  model1.submitAll();//Тут мы не работаем с указателем, поэтому , наверное, строки не добавляются
 
 
}
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #29 : Май 10, 2010, 18:34 »

>>Далее в исходнике использую указатель,
Вобще-то указатель ты не используешь, ты используешь адрес объекта созданого на стеке (так же известного под именем "обычная переменная" и "скаляр").

>>А вот в другой функции как мне применить указатель
А к чему ты его собрался применять?

И вопрос в силе: "Также интересно услышать причину создания объекта на стеке вместо динамического создания"
Записан

Юра.
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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