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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: как после вставки или редактирования записи в БД подсветить её в TableView?  (Прочитано 10018 раз)
ranet
Гость
« : Ноябрь 21, 2008, 21:07 »

БД - PostgressSQL. После вставки или редактирования записи в БД она может пропасть с глаз у пользователя и потеряться, а хочется чтобы он её видел.. Для отображения использую TableView, связь с таблицей QSqlTableModel и QDataWidgetMapper привинченный к LineEdit'ам. Использовать поиск в БД по содержимому записи не хочется.. Нет ли чего-нибудь аналогичного закладкам, как в Delphi у компонента Table (или других компонентов, аналогичных ему)?
Записан
registrationfedser87
Гость
« Ответ #1 : Ноябрь 24, 2008, 07:56 »

Из своего личного опыта я понял одно: там всё зависит от политики изменений: если стоит ручное обновление QDataWidgetMapper::ManualSubmit,то всё фокус держится на нужном элементе,а если стоит автообновление изменений QDataWidgetMapper::AutoSubmit,то фокус теряется.
   В случае с авто обновлением я ничего лучше не придумал как хранить инжекс изменяемого(или индекс вставляемого) элемента и после изменения устанавливать в qtableview запомненный индекс
Записан
ranet
Гость
« Ответ #2 : Ноябрь 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() но это тоже не выход, потому как часто после сохранения данных индекс меняется, и в результате другая строка будет подсвечена.. Похоже поиск все равно придется делать..
Записан
ритт
Гость
« Ответ #3 : Ноябрь 24, 2008, 22:07 »

если не ошибаюсь, то описание той же или схожей проблемы уже давно присутствует в трекере Троллей. обещали пофиксить, но не сказали когда именно...
Записан
c00ker
Гость
« Ответ #4 : Ноябрь 25, 2008, 14:58 »

да, было в багтреккере, ид не помню. Пофиксить обещано ~ к версии QT4.5
Записан
ranet
Гость
« Ответ #5 : Февраль 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();
}
}
 
Работает вроде нормально.. Как я понимаю, поиск ведь все равно в модели идет, без обращений к серверу. То есть ничего я на этом поиске особо не теряю по быстродействию, вполне можно жить и так. Угу?


« Последнее редактирование: Февраль 28, 2009, 17:22 от pastor » Записан
ритт
Гость
« Ответ #6 : Март 01, 2009, 17:26 »

жестоко:)
но для конкретного случая (id - int primary) работать будет...
Записан
ranet
Гость
« Ответ #7 : Март 01, 2009, 20:47 »

жестоко:)
но для конкретного случая (id - int primary) работать будет...
Ну надо же было что-то делать, я почти каждый день проверял не вышла ли QT 4.5 Улыбающийся Вот и слепил такое:) Зато теперь могу строки сортировать по любому полю, как хочу, и все равно подсвечивать последнюю редактировавшуюся запись! А иначе приложение получалось совсем неюзабельным...
Записан
c00ker
Гость
« Ответ #8 : Март 01, 2009, 23:43 »

А в 4.5 ничего в этом плане так и не пофиксили, во всяком случае в последнем rc...
Записан
rrmini
Гость
« Ответ #9 : Декабрь 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 что бы все  работало?
Спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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