Название: как после вставки или редактирования записи в БД подсветить её в TableView?
Отправлено: ranet от Ноябрь 21, 2008, 21:07
БД - PostgressSQL. После вставки или редактирования записи в БД она может пропасть с глаз у пользователя и потеряться, а хочется чтобы он её видел.. Для отображения использую TableView, связь с таблицей QSqlTableModel и QDataWidgetMapper привинченный к LineEdit'ам. Использовать поиск в БД по содержимому записи не хочется.. Нет ли чего-нибудь аналогичного закладкам, как в Delphi у компонента Table (или других компонентов, аналогичных ему)?
Название: Re: как после вставки или редактирования записи в БД подсветить её в TableView?
Отправлено: registrationfedser87 от Ноябрь 24, 2008, 07:56
Из своего личного опыта я понял одно: там всё зависит от политики изменений: если стоит ручное обновление QDataWidgetMapper::ManualSubmit,то всё фокус держится на нужном элементе,а если стоит автообновление изменений QDataWidgetMapper::AutoSubmit,то фокус теряется. В случае с авто обновлением я ничего лучше не придумал как хранить инжекс изменяемого(или индекс вставляемого) элемента и после изменения устанавливать в qtableview запомненный индекс
Название: Re: как после вставки или редактирования записи в БД подсветить её в TableView?
Отправлено: ranet от Ноябрь 24, 2008, 18:39
у меня стоит QDataWidgetMapper::ManualSubmit, в самом mapper'е фокус держится.. а у TableView - слетает, делаю так: mapper->submit(); tableVieW->selectRow(mapper->currentIndex()); Почему-то все равно слетает, после выполнения submit значение mapper->currentIndex становится равно -1.. Версия QT 4.4.1
Можно предварительно до выполнения mapper->submit() сохранить int a = mapper->currentIndex() но это тоже не выход, потому как часто после сохранения данных индекс меняется, и в результате другая строка будет подсвечена.. Похоже поиск все равно придется делать..
Название: Re: как после вставки или редактирования записи в БД подсветить её в TableView?
Отправлено: ритт от Ноябрь 24, 2008, 22:07
если не ошибаюсь, то описание той же или схожей проблемы уже давно присутствует в трекере Троллей. обещали пофиксить, но не сказали когда именно...
Название: Re: как после вставки или редактирования записи в БД подсветить её в TableView?
Отправлено: c00ker от Ноябрь 25, 2008, 14:58
да, было в багтреккере, ид не помню. Пофиксить обещано ~ к версии QT4.5
Название: Re: как после вставки или редактирования записи в БД подсветить её в TableView?
Отправлено: ranet от Февраль 28, 2009, 00:58
Вобщем надоело ждать, пока QT4.5 появится:), поэтому пока так сделал: 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(); } }
Работает вроде нормально.. Как я понимаю, поиск ведь все равно в модели идет, без обращений к серверу. То есть ничего я на этом поиске особо не теряю по быстродействию, вполне можно жить и так. Угу?
Название: Re: как после вставки или редактирования записи в БД подсветить её в TableView?
Отправлено: ритт от Март 01, 2009, 17:26
жестоко:) но для конкретного случая (id - int primary) работать будет...
Название: Re: как после вставки или редактирования записи в БД подсветить её в TableView?
Отправлено: ranet от Март 01, 2009, 20:47
жестоко:) но для конкретного случая (id - int primary) работать будет...
Ну надо же было что-то делать, я почти каждый день проверял не вышла ли QT 4.5 :) Вот и слепил такое:) Зато теперь могу строки сортировать по любому полю, как хочу, и все равно подсвечивать последнюю редактировавшуюся запись! А иначе приложение получалось совсем неюзабельным...
Название: Re: как после вставки или редактирования записи в БД подсветить её в TableView?
Отправлено: c00ker от Март 01, 2009, 23:43
А в 4.5 ничего в этом плане так и не пофиксили, во всяком случае в последнем rc...
Название: Re: как после вставки или редактирования записи в БД подсветить её в TableView?
Отправлено: rrmini от Декабрь 02, 2009, 17:29
я сделал так : 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); для добавления строк у меня отдельно выводится диалоговое окно TruckFormDialog dialog(truckModel, this); 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; } проблема собственно с selectRow(r), в этом месте программа неожиданно завершается с кодом 0. может подскажет кто, в чем тут дело и какие должны быть значения setSelectionMode и setSelectionBehavior что бы все работало? Спасибо!
|