Не могу передать QMap через слот - PullRequest
2 голосов
/ 19 ноября 2010

Итак, это работает:

.h

public slots:
void addMenu(QString passedName);

signals:
void clicked(const QString &text);

.cpp

signalMapper = new QSignalMapper(this);
signalMapper->setMapping(button, QString("passed_value"));
connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
connect(signalMapper, SIGNAL(mapped(QString)), this, SLOT(addMenu(QString)));

Теперь я пытаюсь передать QMap через addMenu вместо просто QString, но я получаю ошибку: нет соответствующей функции для вызова QSignalMapper :: setMapping. Нужно ли мне создавать typeDef или что-то еще?

.h

public slots:
void addMenu(QMap < QString, QString > map);

signals:
void clicked(const QMap < QString, QString > &map);

.cpp

//map is defined above

signalMapper = new QSignalMapper(this);
signalMapper->setMapping(button, map);
connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
connect(signalMapper, SIGNAL(mapped(QObject*)), this, SLOT(addMenu(QMap < QString, QString >)));

РЕДАКТИРОВАТЬ: я также попытался добавить typeDef, но все еще получаю ту же ошибку.

.h

public:
typedef QMap < QString, QString > passedMapType;

public slots:
void addMenu(passedMapType map);

signals:
void clicked(passedMapType map);

.cpp

passedMapType passedMap;
passedMap.insert(QString("key"), QString("value"));

signalMapper = new QSignalMapper(this);
signalMapper->setMapping(button, passedMap);
connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
connect(signalMapper, SIGNAL(mapped(QObject*)), this, SLOT(addMenu(passedMapType));

....

addMenu(passedMapType passedMap) {

}

Ответы [ 5 ]

3 голосов
/ 19 ноября 2010

Используйте typedefs.У меня такое ощущение, что запятая между двумя параметрами шаблона QString - проблема в расширении макроса.

3 голосов
/ 20 ноября 2010

"Теперь я пытаюсь передать QMap через addMenu вместо просто QString, но я получаю ошибку: нет соответствующей функции для вызова 'QSignalMapper :: setMapping'."

Это не общая проблема расширения сигнала / слота или макроса, а ограничение QSignalMapper. Вы не можете передать QMap в setMapping, только int, QString, QWidget * и QObject *. См. Документацию QSignalMapper .

connect(signalMapper, SIGNAL(mapped(QObject*)), this, SLOT(addMenu(passedMapType));

Это тоже не сработает, потому что подписи несовместимы: QObject * против QMap.

Что бы я сделал: удерживая QMap в владельце кнопок, создайте там слот slotClicked (QObject *), подключенный к сигналам clicked () кнопок, а затем найдите PassedMapType объект из карты, используя переданный QObject *. Редактировать: добавлен псевдокод для иллюстрации:

QMap<QWidget*, QMap<QString, QString> > map; //member of the class

//when creating the buttons:

for each button b:
    signalMapper->setMapping( b, b );
    map.insert( b, someMapForThisButton );
connect( signalMapper, SIGNAL(mapped(QWidget*)), this, SLOT(addMenuForButton(QWidget*)) );

//the slot:
void addMenuForButton(QWidget* w) {
     const QMap<QString, QString> m = map.value( w );
     create menu...
}
1 голос
/ 08 марта 2014

В качестве хорошей работы вы можете использовать QObject. QObject имеет встроенный QMap внутри. Вот как это происходит:

void sender() {
  ...
  ...
  QObject *data = new QObject(0);
  data->setProperty("Name","xxxx");
  data->setProperty("Address","yyyy");

  //You can also send QImage
  QImage image;
  ...
  data->setProperty("Image",image);

  emit dataReady(data);
 }

signals:
  void dataReady(QObject*);

public slots:
  void receiver(QObject *data) {
    QString Name = data->property("Name").toString();
    QString Address = data->property("Address").toString();
    QImage image = data->property("Image").value<QImage>();
    data->deleteLater();
  }
0 голосов
/ 20 ноября 2010

Сигнал и слот должны иметь одинаковые типы аргументов (это своего рода вызов функции), поэтому эта строка неверна:

connect(signalMapper, SIGNAL(mapped(QObject*)), this, SLOT(addMenu(passedMapType));

Возможно, вам придется немного переосмыслить свою логику, чтобы заставить это работать.

0 голосов
/ 19 ноября 2010

Это чистое предположение, но вам может понадобиться вместо этого использовать типы указателей? Мне никогда не очень везло, передавая по ссылке с &.

public slots:
void addMenu(QMap<QString, QString> *map);

signals:
void clicked(QMap<QString, QString> *map);
...