Russian Qt Forum

Программирование => С/C++ => Тема начата: mokynis от Март 24, 2016, 19:03



Название: как передать контейнер в другой класс
Отправлено: mokynis от Март 24, 2016, 19:03
имеется класс формы, в ней QMap. И таблица в этой форме, заполняемая из модели на основе этой QMap. Как мне передать указатель на этот контейнер или его адрес во второй класс, чтобы, меняя значения контейнера, менять их в классе формы?
Хидер выглядит примерно так:
Код:
class myform : public QDialog
{
private:
QMap<QString,QString> m1;
};
class mytab:public QAbstractTableModel
{
private:
QMap<QString,QString> m2; //тут пробовал и &m2, и *m2
public:
mytab(QMap<QString,QString>&,QObject *pobj=0);
void myfunc();
};
и реализация
Код:
//заполняем m1
mytab tt=new mytab(m1);

void mytab::mytab(QMap<QString,QString>&t)
{
m2=t;
t.insert("a","aa"); //изменяется и в m1-это хорошо
}
void mytab::myfunc()
{//вот тут надо бы, чтобы тоже изменялось сразу в m1
m2.insert("b","bb");//а оно только m2 меняет
}
как сделать, чтобы потом не придумывать лишние сигналы для передачи изменений в класс формы?


Название: Re: как передать контейнер в другой класс
Отправлено: gil9red от Март 24, 2016, 20:32
Используйте, например, указатели:

Код
C++ (Qt)
class myform : public QDialog
{
private:
   QMap<QString,QString>* m1;
};
 
class mytab: public QAbstractTableModel
{
private:
   QMap<QString,QString>* m2;
 
public:
   mytab(QMap<QString,QString>*t, QObject *pobj=0) {
       m2=t;
       t->insert("a","aa");
   }
 
   void myfunc() {
       m2->insert("b","bb");
   }
 
 
   // Заглушки
   int rowCount(const QModelIndex &parent = QModelIndex()) const {return 0;}
   int columnCount(const QModelIndex &parent = QModelIndex()) const {return 0;}
   QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const {return QVariant();}
};

Проверяем:
Код
C++ (Qt)
   QMap<QString,QString>* m1 = new QMap<QString,QString>();
 
   //заполняем m1
   mytab* tt = new mytab(m1);
   qDebug() << m1->size(); // 1
   tt->myfunc();
   qDebug() << m1->size(); // 2
 
 


Название: Re: как передать контейнер в другой класс
Отправлено: Igors от Март 25, 2016, 11:27
Объявление ссылкой (&m2) более соответствует целям что Вы рассказали - хотя неплохо и указатель. Ссылка четко показывает что этот (и только этот) контейнер используется/редактируется, а с указателем контейнер может быть и другим.