Название: Обмен данными между QTableView Отправлено: developer от Июнь 26, 2007, 23:58 Привет всем. Может кто знает как решить проблему.
Есть одна база данных, пользователь запускает екземпляр программы с QTableView, где ети данные отображаются, и редагирует их. В тоже время другой пользователь на том же компъютере запускает другой екземпляр той же программы. Нужно сделать так чтобы данные в QTableView постоянно обновлялись, как у первого так и у второго пользователя. Название: Обмен данными между QTableView Отправлено: Admin от Июнь 27, 2007, 08:36 Нужно нечто третье - обычно это сервер.
Сервером может выступать база данных - например MySQL. Название: Обмен данными между QTableView Отправлено: developer от Июнь 27, 2007, 15:07 Я сделал с сервером, но теперь иная проблема: как заставить ети QTableView обновляться только тогда когда данные изменяются из одного екземпляра программы. Я пробовал через QTimer, он периодически заставлял QSqlTableModel обновляться если только существовала запись в таблице control(таблица control создавалась с 1 строкой и 1 столбцом) из значением "1" (ето значение создавалось как только пользователь заканчивал редагирование ячейки), которая менялась на "0" при обновлении QSqlTableModel. Но етот вариант оказался не совсем удалым. QTableView по непонятным причинам тормозил когда количество строк было равно 1000(количество столбцов - 11).
Код примерно такой //конструктор DialogImpl::DialogImpl( QWidget * parent, Qt::WFlags f) : QDialog(parent, f) { setupUi(this); LineEditDelegate* delegate = new LineEditDelegate; tableView->setItemDelegate(delegate); model = new QSqlTableModel(this); model->setEditStrategy(QSqlTableModel::OnFieldChange); control = new QSqlTableModel(this); control->setEditStrategy(QSqlTableModel::OnFieldChange); control->setTable("control"); control->select(); model->setTable("fox"); model->select(); tableView->setModel(model); timer = new QTimer(); timer->start(800); connect(delegate,SIGNAL(endEdit()),this,SLOT(start_t())); connect(timer,SIGNAL(timeout()),this,SLOT(up())); } // slot start_t() void start_t() { control->setData(control->index(0,0),"1"); control->select(); } //slot up() void up() { int ch = control->record(0).value(0).toInt(); control->select(); if (ch==1) { model->select(); tableView->setModel(model); control->setData(control->index(0,0),"0"); } } Если можно придумать иначе, или кто-то уже подобное делал подскажите. Версия Qt 4.3.0+MinGW Название: Re: Обмен данными между QTableView Отправлено: itan от Июнь 27, 2007, 16:19 Цитата: "developer" Привет всем. Может кто знает как решить проблему. Есть одна база данных, пользователь запускает екземпляр программы с QTableView, где ети данные отображаются, и редагирует их. В тоже время другой пользователь на том же компъютере запускает другой екземпляр той же программы. Нужно сделать так чтобы данные в QTableView постоянно обновлялись, как у первого так и у второго пользователя. У меня была похожая задача на MSSQL 2000. Нужно было обеспечить непротиворечивость и актуальность редактируемых данных. Задача решалась с использованием блокировок на уровне приложения. Например, пользователь №1 заходит в таблицу и начинает ее редактировать. В базе выставляется флаг блокировки данного объекта, таки образом пользователь №2 не может начать редактировать тот же самый объект, пока пользователь №1 не закончит. После того как пользователь №1 закончил редактировать объект - флаг блокировки в БД снимается. После этого пользователь №2 пытается взять на редактирование этот же объект: проверяется актуальность отображаемых данных в объекте и если данные в БД более новые, то объект перегружается (refresh) и затем уже берется на редактирование. |