Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Krow от Август 31, 2007, 08:16



Название: QSqlTableModel
Отправлено: Krow от Август 31, 2007, 08:16
На форме есть QTableView, Так же с этой формы идёт вызов другой формы на которой идёт добавление данных в базу данных отражённую в QTableView с первой формы.
Суть вопроса такова, как сделать так чтобы при добавлении данных со второй это автоматически отражалось на первой форме. т.е. происходило что то вроде model->select() если бы это всё происходило на первой форме.
надеюсь я выразился правильно... заране спасибо


Название: Re: QSqlTableModel
Отправлено: bigirbis от Август 31, 2007, 09:19
ИМХО, единственный вариант:
  • перед вызовом второй формы запомнить текущий индекс,
  • вызвать форму,
  • установить текущий индекс.


Название: Re: QSqlTableModel
Отправлено: WW от Август 31, 2007, 10:39
Если у тебя вторая форма основана на той же модели, что и TableView - то ничего делать не надо.


Название: Re: QSqlTableModel
Отправлено: Krow от Август 31, 2007, 11:09
ИМХО, единственный вариант:
  • перед вызовом второй формы запомнить текущий индекс,
  • вызвать форму,
  • установить текущий индекс.

а поподробнее???


Название: Re: QSqlTableModel
Отправлено: Krow от Август 31, 2007, 11:11
Если у тебя вторая форма основана на той же модели, что и TableView - то ничего делать не надо.
нет, вторая форма это обычный потомок QWidget на котором расположены QLineEdit для добавления данных.


Название: Re: QSqlTableModel
Отправлено: WW от Август 31, 2007, 11:17
нет, вторая форма это обычный потомок QWidget на котором расположены QLineEdit для добавления данных.
а кто мешает замапить его на ту же модель? потом просто в модели добавил строку программно, дал возможность юзеру заполнить поле. после закрытия формы твое TableView уже будет содержать всю инфу.


Название: Re: QSqlTableModel
Отправлено: bigirbis от Август 31, 2007, 11:58
Вариант. Но не всегда удачным решением является передача модели...


Название: Re: QSqlTableModel
Отправлено: Krow от Август 31, 2007, 14:31
нет, вторая форма это обычный потомок QWidget на котором расположены QLineEdit для добавления данных.
а кто мешает замапить его на ту же модель? потом просто в модели добавил строку программно, дал возможность юзеру заполнить поле. после закрытия формы твое TableView уже будет содержать всю инфу.
Всё от пользователя зависит. И от Привычек пользователей. Думал над таким вариантом, но всё же решил на более традиционном способе для пользователей остановиться.
В общем как сделал так думаю будет правильней (с моей точки зрения)

но вопрос не снят...вопрос как можно сделать рефреш из другой формы, не наследовать же вторую форму от первой???


Название: Re: QSqlTableModel
Отправлено: denka от Август 31, 2007, 15:04
Попробуй QDataWidgetMapper


Название: Re: QSqlTableModel
Отправлено: Krow от Август 31, 2007, 15:20
Попробуй QDataWidgetMapper
а это что за зверь и с чем его едят?? раньше не сталкивался с этим...


Название: Re: QSqlTableModel
Отправлено: WW от Август 31, 2007, 15:24
Попробуй QDataWidgetMapper
а это что за зверь и с чем его едят?? раньше не сталкивался с этим...
это как раз и мапит отдельные виджеты на модель.


Название: Re: QSqlTableModel
Отправлено: Krow от Август 31, 2007, 16:33
Попробуй QDataWidgetMapper
а это что за зверь и с чем его едят?? раньше не сталкивался с этим...
это как раз и мапит отдельные виджеты на модель.
что то значит мапит? Я ж говорю я с этим не связывался ещё...


Название: Re: QSqlTableModel
Отправлено: denka от Август 31, 2007, 16:51
Читаем Assistant:
Цитировать
The QDataWidgetMapper class provides mapping between a section of a data model to widgets.
QDataWidgetMapper can be used to create data-aware widgets by mapping them to sections of an item model. A section is a column of a model if the orientation is horizontal (the default), otherwise a row.
Every time the current index changes, all widgets are updated with the contents from the model. If the user edits the contents of the widget, the changes are written back to the model.
То есть данный класс отображает определенную секцию модели в конкретный виджет. При изменении текущего индекса все виджеты в которые происходит отображение будут обновлены из модели. А при изменении данных в виджете они(данные) будут заноситься в модель. А вобще думаю все таки для начало не мешало бы тебе заглянуть в Assistant:)


Название: Re: QSqlTableModel
Отправлено: Krow от Август 31, 2007, 17:21
den'ka спасиб за разъяснение.
я глянул в асисстант )) но толкм не понял поэтому решил спросить как это звучит по русски :)))


Название: Re: QSqlTableModel
Отправлено: -QT- от Сентябрь 03, 2007, 15:38
Скажите а это для всех моделей работает ?
Я на самописной модели пытался применить вот так:

Код:
   QDataWidgetMapper *mapper = new QDataWidgetMapper();
    mapper->setModel(model);
    mapper->addMapping(lineEditNameJob, 0);
    mapper->addMapping(spinBoxPlanDay, 2);
    mapper->toFirst();

Результата никакого ни ошибок ни отображения  :-\


Название: Re: QSqlTableModel
Отправлено: denka от Сентябрь 03, 2007, 16:14
Может ты как то не так модель реализовал?


Название: Re: QSqlTableModel
Отправлено: -QT- от Сентябрь 04, 2007, 08:46
Может ты как то не так модель реализовал?
Может быть.
Модель для чтения - реализации для редактирования нет создавал из QAbstractItemModel и
определял свой Node.
Наверное проблема в этом - вот только не пойму она же должна на отображение то работать или нет ?


Название: Re: QSqlTableModel
Отправлено: denka от Сентябрь 04, 2007, 09:08
А у тя данные возврощаються только по Qt::DisplayRole?
Я тут глянул исходники QDataWidgetMapper данные там устанавливаються через делегат, а у делегата уже в setEditorData данные выбираються с помощью Qt::EditRole. Может правда я чета не так понял.


Название: Re: QSqlTableModel
Отправлено: -QT- от Сентябрь 04, 2007, 12:25
да данные возвращаются только по Qt::DisplayRole.
Видимо нужна реализация с Qt::EditRole (если я правильно понял) ???


Название: Re: QSqlTableModel
Отправлено: denka от Сентябрь 04, 2007, 12:41
Получаеться так... Или писать свой делегат :)
Очень жаль что в ассистенте об этом не написано...


Название: Re: QSqlTableModel
Отправлено: Krow от Сентябрь 06, 2007, 11:16
этот вопрос косвенно касается моего предыдущего в данной теме.
есть форма в MDI приложении вызываетсяы она с QMainWindow соответвенно при добавлении её к уже существующему экземпляру QWorkspace проблем не доставляет. так вот с этой формы вызываетсчя новая форма, как её можно так же привязать к уже существующему экземпляру QWorkspace?


Название: Re: QSqlTableModel
Отправлено: denka от Сентябрь 06, 2007, 11:37
На скока я понял проблема в не доступности workspace в первой форме.
Можно сделать так:
Код:
...
YourForm * f = new YourForm( this );
QWorkspace * w = qobject_cast<QWorkspace *>( parent()->parent() );
w->addWindow( f );
...


Название: Re: QSqlTableModel
Отправлено: -QT- от Сентябрь 06, 2007, 14:03
Сделал реализацию setData()  в модели вообще пурга пошла....
Пытаюсь поставить ....
Все дошло нуно асситант читать правильно  ;D ;D >:( >:( :o :o


Название: Re: QSqlTableModel
Отправлено: Krow от Сентябрь 06, 2007, 19:14
не буду открывать новый топик...
проблема в следующем.. собрал таки в винде свою програмку. всё вроде бы хорошо, только вот при добавлении в мускульную базу юникод данных (по умолчанию мускул настроен на эту кодировку) QTableView выдает вместо русского шрифта сплошные вопросы, в лине работало отлично всё. как это можно исправить?


Название: Re: QSqlTableModel
Отправлено: -QT- от Сентябрь 07, 2007, 08:01
не буду открывать новый топик...
проблема в следующем.. собрал таки в винде свою програмку. всё вроде бы хорошо, только вот при добавлении в мускульную базу юникод данных (по умолчанию мускул настроен на эту кодировку) QTableView выдает вместо русского шрифта сплошные вопросы, в лине работало отлично всё. как это можно исправить?

А у тебя типа fromUtf8() нету если есть заменить на fromLocal8bit и правильно устанавливать локальную кодировку.


Название: Re: QSqlTableModel
Отправлено: -QT- от Сентябрь 07, 2007, 08:04
Сделал реализацию setData()  в модели вообще пурга пошла....
Пытаюсь поставить ....
Все дошло нуно асситант читать правильно  ;D ;D >:( >:( :o :o
В общем реализацию я сделал НО немогу спозиционировать на нужную запись.
Вот в чем вопрос (Ну почти Шекспир  ;D)


Название: Re: QSqlTableModel
Отправлено: Krow от Сентябрь 07, 2007, 10:17
не буду открывать новый топик...
проблема в следующем.. собрал таки в винде свою програмку. всё вроде бы хорошо, только вот при добавлении в мускульную базу юникод данных (по умолчанию мускул настроен на эту кодировку) QTableView выдает вместо русского шрифта сплошные вопросы, в лине работало отлично всё. как это можно исправить?

А у тебя типа fromUtf8() нету если есть заменить на fromLocal8bit и правильно устанавливать локальную кодировку.
а где в QTableView это менять надо?
у базы дефолтовая кодировка утф8... пишу в лине, а в винде только собираю для виндовых пользователей....
кстати вопрос. пускай програ непрально базу отображает щас... собрал я её пользую MS Visual Studio 2005. пытаюсь запустить на другом компе эту программу, пишет программа не запускается и всё... и как тут понять как её запускать надо????


Название: Re: QSqlTableModel
Отправлено: Krow от Сентябрь 08, 2007, 13:54
На скока я понял проблема в не доступности workspace в первой форме.
Можно сделать так:
Код:
...
YourForm * f = new YourForm( this );
QWorkspace * w = qobject_cast<QWorkspace *>( parent()->parent() );
w->addWindow( f );
...

сделал как ты написал. форма добавляется в workspace, но после добавления программа зависает и не реагирует ни на что...
пыталдлся сделать вот так после
Код:
f->show();
w->setActiveWindow( f );

не помогает. программа просто не отвечает ни накакие сигналы из вне...


Название: Re: QSqlTableModel
Отправлено: Krow от Сентябрь 08, 2007, 14:20
вот функиция создания дочернего окна:
Код:
void fDisk::createDiskInsert()
{
 fDiskInsert *child = new fDiskInsert(this);
 child->ui.pbInsert->setText(QString::fromUtf8("Добавить"));
 child->setWindowTitle(QString::fromUtf8("Новый диск"));
 QWorkspace *workspace = qobject_cast<QWorkspace *>(parent()->parent());
 workspace->addWindow(child);
 child->show();
 workspace->setActiveWindow(child);
 close();
}
может кто скажет в чем ошибка?


Название: Re: QSqlTableModel
Отправлено: Krow от Сентябрь 16, 2007, 12:24
сори за поднятие тему вверх без новго вопроса... но предыдущий ещё актуален. не могу найти решение :(