Название: QSqlModel и ёё редактирование
Отправлено: Max Payne от Март 12, 2012, 10:56
Есть БД Sql на Sqlite, создаю модель QSqlTableModel и устанавливаю таблицу с базы, после чего вставляю пустую строчку в конце таблицы для добавления новой записи, проблема в том , что при редактировании любой ячейки в таблицы новое значение переносится в последнюю пустую строчку куда перемещается и фокус, подскажите где я ошибся, заранее спасибо . Код: QSqlTableModel * mod2 = new QSqlTableModel(this,dbSql); mod2->setTable("Animals"); mod2->select();
ui->tableView_2->setModel(mod2);
Строчку вставляю так : mod2->insertRow(mod2->rowCount()); Политика редактирования по нажатии кнопки: mod2->select(); if (mod2->submit()== false) { QMessageBox::critical(this,tr("Error"), tr(" Erorr ").append(tabM->lastError().text())); return;
} mod2->insertRow(mod2->rowCount());
return;
Название: Re: QSqlModel и ёё редактирование
Отправлено: Пантер от Март 12, 2012, 11:00
А зачем ты mod2->select(); делаешь перед submit?
Название: Re: QSqlModel и ёё редактирование
Отправлено: Max Payne от Март 12, 2012, 11:24
Так как я могу работать с другой моделью , все модели - это наследники main class... и чтобы работать именно с этой я ее выбираю.
Название: Re: QSqlModel и ёё редактирование
Отправлено: Пантер от Март 12, 2012, 11:31
Нифига не понял. select - это не выбор модели, а ее резет.
Название: Re: QSqlModel и ёё редактирование
Отправлено: Max Payne от Март 12, 2012, 12:25
Да, точно, но удаление этой строчки ничего не изменяет =/
Название: Re: QSqlModel и ёё редактирование
Отправлено: Bepec от Март 12, 2012, 12:29
mod2->insertRow(mod2->rowCount());
Перевожу на естественный язык - вставь строку на сааааамое послеееееднеее место.
Даже если тыкал ты на самой первой.
Название: Re: QSqlModel и ёё редактирование
Отправлено: Max Payne от Март 12, 2012, 18:18
По вашему строк в таблице rowCount() +1 ?
Название: Re: QSqlModel и ёё редактирование
Отправлено: Bepec от Март 13, 2012, 07:05
Помоему в функции insertRow() передаётся число, указывающее на место, в которое надо вставить отредактированный элемент. Т.е. создать новый элемент с данными от пользователя и вставить его на "N" место. проблема в том , что при редактировании любой ячейки в таблицы новое значение переносится в последнюю пустую строчку куда перемещается и фокус, подскажите где я ошибся, заранее спасибо .
Прочитай свой вопрос. Осознай. Посмотри на код редактирования по нажатию клавиш . Теперь посмотри на выделенные слова и заметь: mod2->insertRow(mod2->rowCount()); - это вставка в последнюю строчку
Название: Re: QSqlModel и ёё редактирование
Отправлено: Max Payne от Март 14, 2012, 00:40
Уважаемый Верес, читать я умею и выделять красным шрифтом не обязательно. mod2->insertRow(mod2->rowCount());
это вставка пустой строчки в конец таблицы, я ее не редактирую, это строчка на случай когда пользователь захочет добавить новую запись в таблицу, он записывает в каждую ячейку данные через делегат, и жмет Она есть всегда - пустая строчка. Я же не могу понять почему при редактировании другой ячейки в таблицы (заполненной, просто редактирование данных в таблице), данные меняются в заданной ячейке, кроме того , данные переносятся в последнюю строчку в соответствующем столбце (такой же как и в редактируемой ячейке) и фокус тоже смещается на последнюю пустую ячейку. Верес, либо я Вас не могу понять , либо вы не поняли в чем проблема, кричать в принципе не обязательно. Политика изменений : (QSqlTableModel::OnFieldChange)
Название: Re: QSqlModel и ёё редактирование
Отправлено: Bepec от Март 14, 2012, 07:00
Тьфу.
Умываю руки. Молодец. Тогда где у тебя редактирование ячейки? Где код?
В общем пошёл я отсюда.
PS а для остальных, не тормози - выложи куски кода с ф-циями вставки/редактирования. Полные.
Название: Re: QSqlModel и ёё редактирование
Отправлено: Max Payne от Март 17, 2012, 14:35
Все редактирование реализовано через делегаты QWidget *LineDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem &, const QModelIndex &index) const {
QDoubleValidator * dV = new QDoubleValidator(-999999999,99999999,2,parent); QWidget *editor;
switch(typeeditor) { case TLine: { QLineEdit *lin = new QLineEdit(parent); lin->setReadOnly(true); return static_cast<QWidget *>(lin); } case TCombo: { QComboBox *cmbox = new QComboBox(parent); cmbox->addItem("true"); cmbox->addItem("false"); return static_cast<QWidget *>(cmbox); } case TLine_add: { QLineEdit *line = new QLineEdit(parent); line->setReadOnly(false); return static_cast<QWidget *>(line); } case TLine_html: { QLineEdit *line = new QLineEdit(parent); line->setReadOnly(false); return static_cast<QWidget *>(line); } case TLineInt: { QLineEdit *line = new QLineEdit(parent); line->setValidator(dV); line->setReadOnly(false); return static_cast<QWidget *>(line); } case TLine_regInt: { QLineEdit *line = new QLineEdit(parent); line->setValidator(dV); //line->setValidator(new QDoubleValidator(-99999999.0,999999999.0, 2,editor)); line->setReadOnly(false); return static_cast<QWidget *>(line); } case TLabel: { QLabel *line= new QLabel(parent); return static_cast<QWidget *>(line); } case ComboCl: { QVariant data = index.model()->data(index, Qt::DisplayRole); QComboBox *cbox = new QComboBox(parent); for (int i = 0 ; i < lC.size(); i++) { cbox->addItem(lC.at(i)); } cbox->addItem(data.toString());
cbox->view()->setCornerWidget(new QSizeGrip(cbox)); cbox->setAutoCompletion(true);
qint32 width = 0; QFontMetrics fm(cbox->font()); for(int i = 0; i < cbox->count(); ++i) width = qMax(fm.width(cbox->itemText(i)), width); cbox->view()->setMinimumWidth(width + 10);
return static_cast<QWidget *>(cbox); } case ComboCl2: { QVariant data = index.model()->data(index, Qt::DisplayRole); QComboBox *cbox = new QComboBox(parent); cbox->setEditable(true); for (int i = 0 ; i < lC.size(); i++) { cbox->addItem(lC.at(i)); } cbox->addItem(data.toString()); return static_cast<QWidget *>(cbox); } case Calendar: { QDateEdit *editor = new QDateEdit(parent); editor->setDisplayFormat("dd.MM.yyyy"); editor->setCalendarPopup(true); editor->setDate(QDate::currentDate()); return editor; }
} return editor;
}
void LineDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { QVariant data = index.model()->data(index, Qt::DisplayRole); switch(typeeditor) { case TLine: { QLineEdit *lin = static_cast<QLineEdit *>(editor); lin->setText(data.toString()); break; } case TCombo: { QComboBox *cmbox = static_cast<QComboBox *>(editor); if (data.toString()=="true") { cmbox->setCurrentIndex(cmbox->findText("true")); } else { cmbox->setCurrentIndex(cmbox->findText("false")); } break; } case TLine_add: { QLineEdit *line = static_cast<QLineEdit *>(editor); line->setText(data.toString()); break; } case TLine_html: { QLineEdit *line = static_cast<QLineEdit *>(editor); line->setText(data.toString()); break; } case TLineInt: { QLineEdit *line = static_cast<QLineEdit *>(editor); line->setText(data.toString()); break; } case TLine_regInt: { QLineEdit *line = static_cast<QLineEdit *>(editor); line->setText(data.toString()); break; } case TLabel: { QLabel *line= static_cast<QLabel *>(editor); line->setText(data.toString()); break; } case ComboCl: { QComboBox * cbox = static_cast < QComboBox *> (editor); QString text = data.toString(); int ig =0; for (int i = 0 ; i < cbox->count() ; i++) { QStringList op = cbox->itemText(i).split(" "); if (op.contains(text)) { ig = i; break; }
} cbox->setCurrentIndex(ig); break; } case ComboCl2: { QComboBox * cbox = static_cast < QComboBox *> (editor); QString text = data.toString(); int t = cbox->findText(text); cbox->setCurrentIndex(t); break; } case Calendar: { QDateTimeEdit * date = static_cast < QDateTimeEdit *> (editor); date->setDate(QDate::fromString( index.model()->data(index, Qt::EditRole).toString(), "dd.MM.yyyy"));
break; } } }
void LineDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { QVariant data; switch(typeeditor) { case TLine: { QLineEdit *lin = static_cast<QLineEdit *>(editor); data = lin->text(); break; } case TCombo: { QComboBox *cmbox = static_cast<QComboBox *>(editor); if (cmbox->currentText()=="true") { cmbox->setCurrentIndex(cmbox->findText("true")); data = "true"; } else { cmbox->setCurrentIndex(cmbox->findText("false")); data = "false"; } break; } case TLine_add: { QLineEdit *line = static_cast<QLineEdit *>(editor); //line->setText(re); data = line->text(); break; } case TLine_html: { QLineEdit *line = static_cast<QLineEdit *>(editor); QString ret = line->text(); if(line->text().isEmpty())model->revert(); else { data = line->text(); break; } break; } case TLineInt: { QLineEdit *line = static_cast<QLineEdit *>(editor); //line->setText(re); data = line->text(); break; } case TLine_regInt: { QLineEdit *line = static_cast<QLineEdit *>(editor); QString ret = line->text(); if(line->text().isEmpty())model->revert(); else { data = line->text(); break; } break; } case TLabel: { QLabel *line= static_cast<QLabel *>(editor); data = line->text(); break; } case ComboCl: { QComboBox * cbox = static_cast < QComboBox *> (editor); int t = cbox->currentIndex(); QString str = cbox->itemText(t); QStringList ret = str.split(" "); str = ret.first(); if (str.isEmpty() == true) { break; } data = ret.first(); break; } case ComboCl2: { QComboBox * cbox = static_cast < QComboBox *> (editor); int t = cbox->currentIndex(); QString str = cbox->itemText(t); if (str.isEmpty() == true) { break; } data = str; break; } case Calendar: { QDateTimeEdit * date = static_cast < QDateTimeEdit *> (editor); QStringList ret = data.toString().split("."); data = date->date().toString("dd.MM.yyyy"); break; }
} model->setData(index, data, Qt::EditRole); }
Но я думаю проблема не в делегатах, а скорее всего в свойствах модели, я перечитал кучу доков и не могу никак решить эту проблему , политика редактирования setEditStrategy(QSqlTableModel::OnFieldChange);
Название: Re: QSqlModel и ёё редактирование
Отправлено: PavelVX от Март 22, 2012, 08:08
видимо ТС так же как и я переходит на Qt с мс аксеса. Там, если не запретить, внизу всегда будет пустая строчка для внесения новой строки. ТС, вы путаете понятия места для новой строки и собственно вставку новой строки. То-что вы делаете это ВСТАВКА новой строки, а не места для нее. Поэтому любые изменения после попытки вставки будут идти в новой строке. Со всеми вытекающими ...
|