Russian Qt Forum
Ноябрь 22, 2024, 12:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: как передать контейнер в другой класс  (Прочитано 4537 раз)
mokynis
Самовар
**
Offline Offline

Сообщений: 176


Просмотр профиля
« : Март 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 меняет
}
как сделать, чтобы потом не придумывать лишние сигналы для передачи изменений в класс формы?
Записан

QT4, Qt5, Qt6 Debian, ArchLinux
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Март 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
 
 
Записан

Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Март 25, 2016, 11:27 »

Объявление ссылкой (&m2) более соответствует целям что Вы рассказали - хотя неплохо и указатель. Ссылка четко показывает что этот (и только этот) контейнер используется/редактируется, а с указателем контейнер может быть и другим.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.161 секунд. Запросов: 22.