Russian Qt Forum

Qt => Общие вопросы => Тема начата: sector от Октябрь 08, 2009, 14:13



Название: Как лучше пробросить модель в друой диалог?
Отправлено: sector от Октябрь 08, 2009, 14:13
Есть некая форма, у нее есть своя модель и вью. При определенном событии или клике на вью или на кнопке должен открываться новый диалог с данными выбраными на вью. Подскажите каким более правильным способом лучше передать данные из модели? Всю обработку хотелось бы проводить в новом диалоге. Заранее благодарен)


Название: Re: Как лучше пробросить модель в друой диалог?
Отправлено: CroCIV от Октябрь 09, 2009, 08:19
Можно указатель на модель сделать public, можно создать родительский класс с protected указателем на модель и унаследовать от него взаимодействующие с этой моделью классы, можно эти классы обьявить дружественными друг к другу и написать функцию получения указателя на модель, можно запихнуть указатель в конструктор нового класса, даже можно указатель кинуть во временный файл, или использовать QSettings, или QResource для хранения указателя, даже можно прокинуть указатель в базу данных на сервере  ::), можно еще что-нибудь придумать, все зависит от той задачи которую ты решаешь и от того как ты хочешь реализовать ее  ;D


Название: Re: Как лучше пробросить модель в друой диалог?
Отправлено: ranet от Октябрь 09, 2009, 09:03
Можно указатель на модель сделать public.....    можно запихнуть указатель в конструктор нового класса
Я так и делаю ;), самый естественный в простейшем случае способ.. конечно по моему скромному мнению:)
Код:
//класс главного окошка приложения
class energy_MainWin : public QMainWindow
{
    Q_OBJECT

public:
    energy_MainWin(QWidget *parent = 0);
    ~energy_MainWin();
    Ui::energy_MainWin *ui;

private:
 //   Ui::energy_MainWin *ui;

......../дофига чего

    //указатель на модель для работы с таблицами площадок, городов и устройств
   QSqlRelationalTableModel * sites_model;

......../еще дофига чего
}

диалог редактирования должен получать этот указатель как параметр при вызове конструктора, то есть:
Код:
class Towns_dialog : public QDialog, public Ui::Towns_dialogClass
{
    Q_OBJECT

public:
    Towns_dialog(QWidget *parent = 0,  QSqlRelationalTableModel * model_in_dialog = 0);
    ~Towns_dialog();
    Ui::Towns_dialogClass dialog_ui;

............//дофига всякой фигни


}

При вызове конструктора передаем указателя:
Код:
//где-нибудь в главное_окошко.cpp
if (!dialog_sites)
    {
        dialog_sites = new SitesDialog(this, sites_model);
    }

Если используем QDataWidgetMapper, то с ним стоит обойтись так же, чтобы потом "спрятать" внутри конструктора нового класса привинчивание его к lineEdit'ам например.


Название: Re: Как лучше пробросить модель в друой диалог?
Отправлено: sector от Октябрь 09, 2009, 10:38
Огромное спасибо)) Этот вариант полностью подходит... он более естественен... а я было начал с QModelIndex заморачиваться))