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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: как обновить tableView из другого окна  (Прочитано 5516 раз)
sergun1604
Гость
« : Сентябрь 30, 2010, 13:44 »

Отцы подскажите пожалуйста как обновить эту штуковину из другого окна. Данные в этом другом окне заносятся в базу. Но вьювка которая отображает находится в родительском окне? С ума уже сошел неделю голову ломаю
Записан
crossly
Гость
« Ответ #1 : Сентябрь 30, 2010, 13:57 »

больше инфы.... данные пишутся на прямую в базу или в модель которую вью отображает??
Записан
sergun1604
Гость
« Ответ #2 : Сентябрь 30, 2010, 14:08 »

Напрямую в базу из дочернего окна через QSqlQueryModel
Записан
RedDog
Гость
« Ответ #3 : Сентябрь 30, 2010, 14:33 »

сигналы и слоты для чего придуманы?
Записан
RVZ
Гость
« Ответ #4 : Сентябрь 30, 2010, 14:45 »

Я столкнулся с такой же проблемой!
Решил ее добавлением слота к классу в котором tableView отрисовывается и добавлением сигнала к классу где происходят изменения на основе которых tableView надо обновлять и соединил их (можно свой сигнал к tableView подключить у меня просто еще параметр подшаманить надо было)
По моему это типа протез но на первое время подойдет
Записан
sergun1604
Гость
« Ответ #5 : Сентябрь 30, 2010, 15:14 »

спасибо rvz за содержательный ответ, не можете тогда подсказать как мне этот сигнал оформить (как слот сделать я понимаю, но вот сигналами обычно стандартными пользовался).
Записан
sergun1604
Гость
« Ответ #6 : Сентябрь 30, 2010, 15:16 »

RedDog я же в теме "вопросы новичков" дофига еще не понимаю поэтому сюда и написал. Поэтому к Отцам с поклоном...
Записан
crossly
Гость
« Ответ #7 : Сентябрь 30, 2010, 15:20 »

Напрямую в базу из дочернего окна через QSqlQueryModel
вы хоть сами то поняли... Улыбающийся.... в общем после того как записали в базу нужно обновить модель которую отображает tableView
Записан
sergun1604
Гость
« Ответ #8 : Сентябрь 30, 2010, 15:55 »

crossly я это понимаю вопрос как, вместо реплик просто помогите примером.
Записан
Vanoor
Гость
« Ответ #9 : Сентябрь 30, 2010, 18:12 »

по моему все достаточно просто если я все правильно понял. Если вам нужно по сигналу из дочернего окна обновить таблевью в родительском. То это тупа сигнал слот.

В дочерем окне вы создаете ваш сигнал, который будете испускать каждый раз когда заносите данные в базу из дочернего окна.

А в родительском окне, там  где вы создаете объект дочернего окна, сразу же привязываете конект.

Например:

 mydialog.h:

Код:
...
signals:
       void mySignal();

...

mydialog.cpp

Код:
...

void Mydialog::dataWrite(){
      //данные записаны в базу
      emit mySignal();
}
...

parentwindow.cpp

Код:
...

void Parentwindow::createMyDialog(){
      dialog = new Mydialog;
      connect(dialog, SIGNAL(mySignal()), this, SLOT(refreshView());
      dialog.show();
}
...

блин как то так я думаю

 
Записан
sergun1604
Гость
« Ответ #10 : Октябрь 01, 2010, 08:19 »

хорошо попробую отпишусь!!!!!
Записан
voronElf
Гость
« Ответ #11 : Октябрь 01, 2010, 08:31 »

Vanoor правильно написал, кроме одного (о чем написал crossly), обновлять нужно не tableView, а модель, которая поставляет данные в эту вьюху. коннектить сигнал можно прям к самой модели.
Записан
sergun1604
Гость
« Ответ #12 : Октябрь 01, 2010, 08:51 »

Ребята спасибо вам большое а то я в трех соснах заблудился, понимал что надо както с сигналами работать по примеру последнего сделал и все пошло.
вот мой код (вдруг кому интересно)
kol.h
Код:
signals:
     void mySignal();

kol.cpp

Код:
void kol::addWrem()                       //кнопка добавить к позиции
{
...
    emit mySignal();
...
}

nomen.h

Код:
public slots:
    void SelectTow();                   //реакция на выбор товара
    void nom();                            //слот с обновлением вьюва

nomen.cpp

void nomen::SelectTow()                                                 //выбираем товар в таблице 2
Код:
{
kol  kl;                                                       //
        QObject::connect(&kl, SIGNAL(mySignal()), this, SLOT(nom()));
        kl.exec();                                                         //вызываем запрос на количество и цену
}

Код:
void nomen::nom()
{
    md = new QSqlQueryModel;
    QString strF;
    strF="SELECT * FROM vrem";
    md->setQuery(strF);

    ui->tableView_3->setModel(md);                                                 //привязыва*/ем набор данных к таблице
    ui->tableView_3->resizeColumnsToContents();

}

Успехов всем в освоении qt  это будущее ближайших лет!!!!!!
Записан
voronElf
Гость
« Ответ #13 : Октябрь 01, 2010, 09:53 »

хорошо, суть понял, только вот в слоте с моделью жестоко как то ))
старая модель в памяти остается (100 редактирований => 100 старых объектов сидит в памяти и не используется)
лучше вообще не менять модель:

Код:
void nomen::nom()
{
    QSqlQueryModel * model = static_cast<QSqlQueryModel *>(ui->tableView_3->model());
    if (model != 0)
        model->setQuery("SELECT * FROM vrem");
}

ну нужно быть уверенным конечно, что вьюхе была ранее выставлена именно QSqlQueryModel
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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