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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с навигацией по строкам после их редактирования  (Прочитано 3975 раз)
browncoat
Гость
« : Август 17, 2010, 17:05 »

Разбираюсь с редактированием данных с использованием форм. Столкнулся с проблемой. Для демонстрации написал программу (исходники есть во вложении). Создается БД SqLite с 2-мя строками, программа осуществляет навигацию по ним. При редактировании изменения должны сохраняться.

Теперь в чем проблема. Если после редактирования нажать вперед, то переход на новую запись не осуществляется, нужно нажать вперед еще раз. Если после редактирования последней записи нажать вперед, то почему-то происходит переход на первую запись.

Что я делаю не так? Буду благодарен за помощь.



main.cpp
Код
C++ (Qt)
#include <QtGui/QApplication>
#include <QtSql>
#include <QMessageBox>
#include "dialog.h"
 
bool createConnection()
{
   QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
   db.setDatabaseName("test.dat");
   if (!db.open()) {
       QMessageBox::warning(0, QObject::tr("Database Error"),
                            db.lastError().text());
       return false;
   }
   return true;
}
 
void createFakeData()
{
   QSqlQuery query;
   query.exec("CREATE TABLE users ("
              "id INTEGER PRIMARY KEY AUTOINCREMENT, "
              "name VARCHAR(40) NOT NULL)");
 
   query.exec("INSERT INTO users (name) VALUES ('john')");
   query.exec("INSERT INTO users (name) VALUES ('bill')");
}
 
 
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
 
   bool existingData = QFile::exists("test.dat");
   if (!createConnection())
       return 1;
   if (!existingData)
       createFakeData();
 
   Dialog w;
   w.show();
 
   return a.exec();
}

dialog.h
Код
C++ (Qt)
#ifndef DIALOG_H
#define DIALOG_H
 
#include <QtGui/QDialog>
#include <QPushButton>
#include <QLineEdit>
#include <QHBoxLayout>
#include <QSqlRelationalTableModel>
#include <QDataWidgetMapper>
#include <QLabel>
 
class Dialog : public QDialog
{
   Q_OBJECT
 
public:
   Dialog(QWidget *parent = 0);
   ~Dialog();
private:
   QLineEdit *lineEdit_name;
   QPushButton *btn_next;
   QPushButton *btn_prev;
   QHBoxLayout *layout;
 
   QSqlRelationalTableModel *model;
   QDataWidgetMapper *mapper;
};
 
#endif // DIALOG_H
 

dialog.cpp
Код
C++ (Qt)
#include "dialog.h"
#include <QPushButton>
#include <QLineEdit>
#include <QHBoxLayout>
#include <QSqlRelationalTableModel>
#include <QDataWidgetMapper>
#include <QtSql>
#include <QLabel>
 
Dialog::Dialog(QWidget *parent)
   : QDialog(parent)
{
   lineEdit_name = new QLineEdit;
   btn_next = new QPushButton(">");
   btn_prev = new QPushButton("<");
   layout = new QHBoxLayout;
   layout->addWidget(btn_prev);
   layout->addWidget(lineEdit_name);
   layout->addWidget(btn_next);
   setLayout(layout);
 
   model = new QSqlRelationalTableModel(this);
   model->setTable("users");
   model->setEditStrategy(QSqlTableModel::OnFieldChange);
   model->select();
 
   mapper = new QDataWidgetMapper(this);
   mapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);
   mapper->setModel(model);
   mapper->addMapping(lineEdit_name, 1);
   mapper->toFirst();
 
   QObject::connect(btn_next, SIGNAL(clicked()),
                    mapper, SLOT(toNext()));
   QObject::connect(btn_prev, SIGNAL(clicked()),
                    mapper, SLOT(toPrevious()));
}
 
Dialog::~Dialog()
{
 
}
 
« Последнее редактирование: Август 23, 2010, 21:17 от browncoat » Записан
crossly
Гость
« Ответ #1 : Август 17, 2010, 17:11 »

после сабмита происходит обновление таблицы... т.е. данные селектятся по новой... соответственно и текущий индекс сбрасывается... 
Записан
browncoat
Гость
« Ответ #2 : Август 17, 2010, 22:43 »

Спасибо за наводку, буду копать в этом направлении. Задача вроде бы обыденная.
Записан
browncoat
Гость
« Ответ #3 : Август 23, 2010, 21:14 »

Вроде бы решил проблему.

Код
C++ (Qt)
QDialog::connect(model, SIGNAL(beforeUpdate(int,QSqlRecord&)),
                    this, SLOT(saveIndexBeforeUpdate()));
QDialog::connect(model, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
                    this, SLOT(restoreIndexAfterUpdate()));

Код
C++ (Qt)
void Dialog::saveIndexBeforeUpdate()
{
   savedIndex = mapper->currentIndex();
}
 
void Dialog::restoreIndexAfterUpdate()
{
   mapper->setCurrentIndex(savedIndex);
}
Записан
crossly
Гость
« Ответ #4 : Август 24, 2010, 10:12 »

долго же решение искалось... Улыбающийся
Записан
browncoat
Гость
« Ответ #5 : Август 24, 2010, 13:47 »

Извиняюсь, это была фоновая задача (: Кроме того, только начал изучать QT. Вообще по-моему странно, что это не делается автоматически, вроде бы высокоуровневый интерфейс, а тут такое...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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