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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Обмен данными между QTableView  (Прочитано 3778 раз)
developer
Гость
« : Июнь 26, 2007, 23:58 »

Привет всем. Может кто знает как решить проблему.

Есть одна база данных, пользователь запускает екземпляр программы с QTableView, где ети данные отображаются, и редагирует их. В тоже время другой пользователь на том же компъютере запускает другой екземпляр той же программы. Нужно сделать так чтобы данные в QTableView постоянно обновлялись, как у первого так и у второго пользователя.
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #1 : Июнь 27, 2007, 08:36 »

Нужно нечто третье - обычно это сервер.

Сервером может выступать база данных - например MySQL.
Записан
developer
Гость
« Ответ #2 : Июнь 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
Записан
itan
Гость
« Ответ #3 : Июнь 27, 2007, 16:19 »

Цитата: "developer"
Привет всем. Может кто знает как решить проблему.

Есть одна база данных, пользователь запускает екземпляр программы с QTableView, где ети данные отображаются, и редагирует их. В тоже время другой пользователь на том же компъютере запускает другой екземпляр той же программы. Нужно сделать так чтобы данные в QTableView постоянно обновлялись, как у первого так и у второго пользователя.

У меня была похожая задача на MSSQL 2000. Нужно было обеспечить непротиворечивость и актуальность редактируемых данных. Задача решалась с использованием блокировок на уровне приложения. Например, пользователь №1 заходит в таблицу и начинает ее редактировать. В базе выставляется флаг блокировки данного объекта, таки образом пользователь №2 не может начать редактировать тот же самый объект, пока пользователь №1 не закончит. После того как пользователь №1 закончил редактировать объект - флаг блокировки в БД снимается. После этого пользователь №2 пытается взять на редактирование этот же объект: проверяется актуальность отображаемых данных в объекте и если данные в БД более новые, то объект перегружается (refresh) и затем уже берется на редактирование.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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