Russian Qt Forum

Qt => Общие вопросы => Тема начата: sergun1604 от Сентябрь 30, 2010, 13:44



Название: как обновить tableView из другого окна
Отправлено: sergun1604 от Сентябрь 30, 2010, 13:44
Отцы подскажите пожалуйста как обновить эту штуковину из другого окна. Данные в этом другом окне заносятся в базу. Но вьювка которая отображает находится в родительском окне? С ума уже сошел неделю голову ломаю


Название: Re: как обновить tableView из другого окна
Отправлено: crossly от Сентябрь 30, 2010, 13:57
больше инфы.... данные пишутся на прямую в базу или в модель которую вью отображает??


Название: Re: как обновить tableView из другого окна
Отправлено: sergun1604 от Сентябрь 30, 2010, 14:08
Напрямую в базу из дочернего окна через QSqlQueryModel


Название: Re: как обновить tableView из другого окна
Отправлено: RedDog от Сентябрь 30, 2010, 14:33
сигналы и слоты для чего придуманы?


Название: Re: как обновить tableView из другого окна
Отправлено: RVZ от Сентябрь 30, 2010, 14:45
Я столкнулся с такой же проблемой!
Решил ее добавлением слота к классу в котором tableView отрисовывается и добавлением сигнала к классу где происходят изменения на основе которых tableView надо обновлять и соединил их (можно свой сигнал к tableView подключить у меня просто еще параметр подшаманить надо было)
По моему это типа протез но на первое время подойдет


Название: Re: как обновить tableView из другого окна
Отправлено: sergun1604 от Сентябрь 30, 2010, 15:14
спасибо rvz за содержательный ответ, не можете тогда подсказать как мне этот сигнал оформить (как слот сделать я понимаю, но вот сигналами обычно стандартными пользовался).


Название: Re: как обновить tableView из другого окна
Отправлено: sergun1604 от Сентябрь 30, 2010, 15:16
RedDog я же в теме "вопросы новичков" дофига еще не понимаю поэтому сюда и написал. Поэтому к Отцам с поклоном...


Название: Re: как обновить tableView из другого окна
Отправлено: crossly от Сентябрь 30, 2010, 15:20
Напрямую в базу из дочернего окна через QSqlQueryModel
вы хоть сами то поняли... :).... в общем после того как записали в базу нужно обновить модель которую отображает tableView


Название: Re: как обновить tableView из другого окна
Отправлено: sergun1604 от Сентябрь 30, 2010, 15:55
crossly я это понимаю вопрос как, вместо реплик просто помогите примером.


Название: Re: как обновить tableView из другого окна
Отправлено: Vanoor от Сентябрь 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();
}
...

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

 


Название: Re: как обновить tableView из другого окна
Отправлено: sergun1604 от Октябрь 01, 2010, 08:19
хорошо попробую отпишусь!!!!!


Название: Re: как обновить tableView из другого окна
Отправлено: voronElf от Октябрь 01, 2010, 08:31
Vanoor правильно написал, кроме одного (о чем написал crossly), обновлять нужно не tableView, а модель, которая поставляет данные в эту вьюху. коннектить сигнал можно прям к самой модели.


Название: Re: как обновить tableView из другого окна
Отправлено: sergun1604 от Октябрь 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  это будущее ближайших лет!!!!!!


Название: Re: как обновить tableView из другого окна
Отправлено: voronElf от Октябрь 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