Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Kirill_m от Апрель 16, 2012, 23:09



Название: один QDataWidgetMapper на разных формах
Отправлено: Kirill_m от Апрель 16, 2012, 23:09
Идея такова, есть главное окно.
Есть настройки, они вызываются как модальное окно из главного.
В настройках есть LineEdit которые собственно и содержат настройки, на главном окне эти настройки выводятся в  LineEdit(только для чтения, ибо с label не хочет работать QDataWidgetMapper).
Есть класс Settings который управляет настройками, тоесть запись в базу данных из окна настроек и вывод этих данных на главную форму.
Settings .h
Код:
#ifndef SETTINGS_H
#define SETTINGS_H

#include <QObject>
#include <QtGui>
#include <QtSql>
#include <QDataWidgetMapper>

class Settings : public QObject
{
    Q_OBJECT
public:
    explicit Settings(QObject *parent = 0);

    void initMapper();
    void initMainMapper(QLineEdit* name,QLineEdit* sodo,QLineEdit* imo,QLineEdit* signal);
    void initSettingsMapper(QLineEdit* name,QLineEdit* sodo,QLineEdit* sodokode,QLineEdit* imo,QLineEdit* signal);
    void Save();

signals:

public slots:

private:
    QSqlTableModel* settingsModel;
    QDataWidgetMapper* mapper;

    
};

#endif // SETTINGS_H


Settings .cpp
Код:
#include "settings.h"

Settings::Settings(QObject *parent) :
    QObject(parent)
{


}



void Settings::initMapper()
{
    settingsModel=new QSqlTableModel(this,QSqlDatabase::database());
    settingsModel->setTable("settingsisp");
    settingsModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
    settingsModel->select();

    mapper = new QDataWidgetMapper(this);
    mapper->setModel(settingsModel);
    mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);
}

void Settings::initMainMapper(QLineEdit *name,QLineEdit *sodo, QLineEdit *imo, QLineEdit *signal)
{
       mapper->addMapping(name,settingsModel->fieldIndex("name"));
       mapper->addMapping(sodo,settingsModel->fieldIndex("sodo"));
       mapper->addMapping(imo,settingsModel->fieldIndex("imo"));
       mapper->addMapping(signal,settingsModel->fieldIndex("signal"));
       mapper->toFirst();
}

void Settings::initSettingsMapper(QLineEdit* name,QLineEdit* sodo,QLineEdit* sodokode,QLineEdit* imo,QLineEdit* signal)
{
    mapper->addMapping(name,settingsModel->fieldIndex("name"));
    mapper->addMapping(sodo,settingsModel->fieldIndex("sodo"));
    mapper->addMapping(sodokode,settingsModel->fieldIndex("sodokode"));
    mapper->addMapping(imo,settingsModel->fieldIndex("imo"));
    mapper->addMapping(signal,settingsModel->fieldIndex("signal"));
    mapper->toFirst();
}

void Settings::Save()
{
    mapper->submit();
    settingsModel->submitAll();
    mapper->toFirst();
}

пояснения:
void Settings::initMapper()  -  инициализация мапперов
void Settings::initMainMapper(QLineEdit *name,QLineEdit *sodo, QLineEdit *imo, QLineEdit *signal) - делаем связку в мейн форме
void Settings::initSettingsMapper(QLineEdit* name,QLineEdit* sodo,QLineEdit* sodokode,QLineEdit* imo,QLineEdit* signal) - делаем связку в форме настроек

в конструкторе мейне создаем объект класса Settings, и проводим инициализацию и связку
Код:
Settings setting=new Settings();

    setting->initMapper();
    setting->initMainMapper(ui->lineEdit_name,ui->lineEdit_sodo,ui->lineEdit_imo,ui->lineEdit_signal);

дальше при сигнале(нажали на кнопку вызова настроек) .. 2 параметром передаем указатель на созданный в мейне объект Settings
Код:
    SettingsDialog* settings_dialog=new SettingsDialog(this,setting);

    settings_dialog->setModal(true);
    settings_dialog->show();


тыкк..
теперь
SettingsDialog - форма настроек.



Код:
SettingsDialog::SettingsDialog(QWidget *parent,Settings* set) :
    QDialog(parent),
    ui(new Ui::SettingsDialog)
{
    ui->setupUi(this);
    setting=set; //Settings* setting;


    //setting->initMapper();  - если вызываем то редактируем нормально при вы
    setting->initSettingsMapper(ui->lineEdit_name,ui->lineEdit_sydo,ui->lineEdit_sydo_code,ui->lineEdit_imo,ui->lineEdit_signal);


}
//setting->initMapper();  - если вызываем то редактируем нормально, при нажатии кнопки сохранить вызываем метод void Settings::Save() и  данные нормально записываются в базу
если не вызываем то данные отображаются, но редактированию не поддаются при нажатии сохранить  данные не записываются в базу, а на оборот берутся из базы и записываются в lineedit .

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


Название: Re: один QDataWidgetMapper на разных формах
Отправлено: Kirill_m от Апрель 17, 2012, 15:10
Нормальным способом решить не удалось..

сделал так из
пишем в class Settings


Код:
 public:
   void updateMapper();
Код:
void Settings::updateMapper()
{
    settingsModel->submitAll();
    mapper->submit();
    mapper->toFirst();
}


В SettingsDialog
Код:
signals:
    void UpdateMainMapper();

и вызываем наш сигнал, при сигнале от кнопки Сохранить

Код:
void SettingsDialog::on_pushButtonSave_clicked()
{
    setting->SaveMapper();
    emit UpdateMainMapper();
    qDebug()<<"Сохраняет";
}

А в мейне где создаем окно настроек добавляем
Код:
    SettingsDialog* settings_dialog=new SettingsDialog();
    connect(settings_dialog,SIGNAL(UpdateMainMapper()),this,SLOT(MainMapper())); // !это!
    settings_dialog->setModal(true);
    settings_dialog->show();

И пишем слот
Код:
private slots:

    void MainMapper();

Код:
void MainDialog::MainMapper()
{
    qDebug()<<"Сигнал из настроек";
    setting->updateMapper();
}

Как то так..