Название: Проблема с навигацией по строкам после их редактирования
Отправлено: browncoat от Август 17, 2010, 17:05
Разбираюсь с редактированием данных с использованием форм. Столкнулся с проблемой. Для демонстрации написал программу (исходники есть во вложении). Создается БД SqLite с 2-мя строками, программа осуществляет навигацию по ним. При редактировании изменения должны сохраняться. Теперь в чем проблема. Если после редактирования нажать вперед, то переход на новую запись не осуществляется, нужно нажать вперед еще раз. Если после редактирования последней записи нажать вперед, то почему-то происходит переход на первую запись. Что я делаю не так? Буду благодарен за помощь. (http://img18.imageshack.us/img18/8650/testgv.gif) 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() { }
Название: Re: Проблема с навигацией по строкам после их редактирования
Отправлено: crossly от Август 17, 2010, 17:11
после сабмита происходит обновление таблицы... т.е. данные селектятся по новой... соответственно и текущий индекс сбрасывается...
Название: Re: Проблема с навигацией по строкам после их редактирования
Отправлено: browncoat от Август 17, 2010, 22:43
Спасибо за наводку, буду копать в этом направлении. Задача вроде бы обыденная.
Название: Re: Проблема с навигацией по строкам после их редактирования
Отправлено: browncoat от Август 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); }
Название: Re: Проблема с навигацией по строкам после их редактирования
Отправлено: crossly от Август 24, 2010, 10:12
долго же решение искалось... :)
Название: Re: Проблема с навигацией по строкам после их редактирования
Отправлено: browncoat от Август 24, 2010, 13:47
Извиняюсь, это была фоновая задача (: Кроме того, только начал изучать QT. Вообще по-моему странно, что это не делается автоматически, вроде бы высокоуровневый интерфейс, а тут такое...
|