C++ (Qt)//получаем и сохраняем значение индексного столбца int ind; QSqlRecord record = towns_model->record(towns_mapper->currentIndex()); ind = record.value("id").toInt();(у меня по полю id первичный ключ сделан, привинчен к sequence имя к-рой towns_id_seq)диалог для случая редактирования и вставки записи общий, при вставке ind всегда равен 0, поэтому: //сохранить изменения в БД towns_model->submitAll(); if (ind == 0) //срабатывает при вставке новой записи { //смотрим куда вставилось QSqlQuery qq; qDebug() << qq.exec("SELECT last_value from towns_id_seq"); qDebug() << qq.lastError(); qq.first(); //подменяем значение ind = qq.value(0).toInt(); }//подровнять вьюху towns_ui.towns_TV->resizeColumnsToContents(); towns_ui.towns_TV->resizeRowsToContents(); towns_header->setStretchLastSection(true); //находим и подсвечиваем отредактированную строчку if (ind !=-1) { for (int row = 0; row < towns_model->rowCount(); ++ row) { record = towns_model->record(row); if (record.value("id").toInt()== ind) { //собственно само подсвечивание строки во вьюхе towns_ui.towns_TV->selectRow(row); towns_ui.towns_TV->setFocus(); break; } } } else { towns_mapper->toFirst(); } //спрятать диалог dialog_win->close(); }}
truckModel = new QSqlRelationalTableModel(this); truckModel->setTable("truck"); truckModel->setEditStrategy(QSqlTableModel::OnManualSubmit); truckModel->setRelation(1, QSqlRelation("body", "id", "name")); truckModel->setRelation(2, QSqlRelation("automodel", "id", "name")); truckModel->setRelation(11, QSqlRelation("driver", "id", "name")); truckModel->setHeaderData(1, Qt::Horizontal, trUtf8("тип")); truckModel->setHeaderData(2, Qt::Horizontal, trUtf8("марка")); truckModel->setHeaderData(3, Qt::Horizontal, trUtf8("т.")); truckModel->setHeaderData(4, Qt::Horizontal, trUtf8("д.")); truckModel->setHeaderData(5, Qt::Horizontal, trUtf8("ш.")); truckModel->setHeaderData(6, Qt::Horizontal, trUtf8("в.")); truckModel->setHeaderData(7, Qt::Horizontal, trUtf8("об.")); truckModel->setHeaderData(8, Qt::Horizontal, trUtf8("верх")); truckModel->setHeaderData(9, Qt::Horizontal, trUtf8("бок")); truckModel->setHeaderData(10, Qt::Horizontal, trUtf8("зад")); truckModel->setHeaderData(11, Qt::Horizontal, trUtf8("водитель")); truckModel->setHeaderData(12, Qt::Horizontal, trUtf8("№ машины")); truckModel->setHeaderData(13, Qt::Horizontal, trUtf8("№ прицепа")); truckModel->setHeaderData(14, Qt::Horizontal, trUtf8("комментарий")); truckModel->setSort(1, Qt::AscendingOrder); truckModel->select();
truckView = new TableView; truckView->setModel(truckModel); truckView->setItemDelegate(new QSqlRelationalDelegate(this)); truckView->setItemDelegateForColumn(8,new LoadDelegate(8)); // это для отображения булева truckView->setItemDelegateForColumn(9,new LoadDelegate(9)); // значения в виде "+" или "-" truckView->setItemDelegateForColumn(10,new LoadDelegate(10)); truckView->setColumnHidden(0, true); truckView->resizeColumnsToContents(); truckView->horizontalHeader()->setStretchLastSection(true); truckView->setSelectionMode(QAbstractItemView::SingleSelection); truckView->setSelectionBehavior(QAbstractItemView::SelectRows); truckView->setSortingEnabled(true); truckView->setEditTriggers(QAbstractItemView::NoEditTriggers); truckView->setWindowTitle(QObject::trUtf8("таблица машин")); truckView->action->setText(trUtf8("таблица машин")); truckView->setAlternatingRowColors(true); truckView->addAction(tabEditAction); truckView->addAction(addRecordAction); truckView->addAction(deleteRecordAction); truckView->setContextMenuPolicy(Qt::ActionsContextMenu);
void MainWindow::addRecord(){ if(activeTableView()->model() == truckModel) { int row = truckModel->rowCount(); truckModel->insertRow(row);//задаю дефолтные значения truckModel->setData(truckModel->index(row, 1), 1); truckModel->setData(truckModel->index(row, 2), 1); truckModel->setData(truckModel->index(row, 11), 1); QModelIndex index = truckModel->index(row, 1); truckView->setCurrentIndex(index);// вызываю диалоговое окно TruckFormDialog dialog(truckModel, this); dialog.mapper->setCurrentIndex(row); dialog.m_ui->bodyComboBox->setFocus(); dialog.exec();// truckModel->submitAll() делаю в диалоге по нажатию кнопки ОК//отыскиваю последнюю запись в таблице по максимальному id , он же первичный ключ в таблице//добавляется автоинкрементом int id = -1; QSqlQuery query(QString("SELECT MAX (id) FROM truck")); if(query.next()) id = query.value(0).toInt();//отыскиваю добавленную запись for( int r = 0; r < truckModel->rowCount(); ++r) { QSqlRecord record = truckModel->record(r); if ( record.value(0).toInt() == id) { QMessageBox::information(0,"",trUtf8("Значение найдено %1").arg(r)); truckView->selectRow(r); // здесь проблема: программа неожиданно заканчивается с кодом // 0 truckView->setFocus(); break; } } QMessageBox::information(0,"",trUtf8("конец цикла")); return; }