Не могу пройти Qmap до слота
Вопрос
Итак, это работает:
.час
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 <QString, QString> через Addmenu вместо просто QSTRING, но я получаю ошибку: не соответствующую функции для вызова на «QSignalMapper :: SetMapping». Мне нужно создать Typedef или что-то?
.час
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, но все же получая одинаковую ошибку.
.час
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) {
}
Решение
«Теперь я пытаюсь пройти QMap <QString, QString> через Addmenu вместо просто QString, но я получаю ошибку: не соответствующую функции сопоставления для вызова на« QSignalMapper :: SetMapping ».
Это не общий сигнал / слот или проблема расширения макроса, а ограничение QSignalMapper. Вы не можете передавать QMAP для SetMapping, только INT, QString, Qwidget * и Qobject *. Увидеть Документация QSignalMapper.
connect(signalMapper, SIGNAL(mapped(QObject*)), this, SLOT(addMenu(passedMapType));
Это тоже не будет работать, потому что подписи несовместимы: Qobject * vs. qmap.
Что я бы сделал: держись Qmapu003CQObject*,PassedMapType> У владельца кнопок создайте слот SlotClicked (Qobject *), подключенные к сигналам щелчков () кнопок, а затем посмотрите на объект 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...
}
Другие советы
Используйте Typedefs. Мое чувство состоит в том, что запятая между двумя параметрами шаблона QString является проблемой в расширении макроса.
Как хорошая работа, которую вы можете использовать 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();
}
Это чистое угадание, но вместо этого вам нужно использовать типы указателей? У меня никогда не было повезло, проходя мимо ссылки с и.
public slots:
void addMenu(QMap<QString, QString> *map);
signals:
void clicked(QMap<QString, QString> *map);
Сигнал и слот должны иметь одинаковые типы аргументов (это функциональный вызов, сортов), поэтому эта строка неверна:
connect(signalMapper, SIGNAL(mapped(QObject*)), this, SLOT(addMenu(passedMapType));
Вам может потребоваться переосмыслить вашу логику, чтобы сделать эту работу.