Ne peut pas passer à travers QMap SLOT
Question
Alors, cela fonctionne:
.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)));
Maintenant, je suis en train de passer un QMap
.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 >)));
EDIT:. J'ai aussi essayé d'ajouter un typedef, mais toujours obtenir la même erreur
.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) {
}
La solution
« Maintenant, je suis en train de passer un QMap
Ce n'est pas un signal général / fente ou un problème d'expansion macro, mais une limitation de QSignalMapper. Vous ne pouvez pas passer un QMap à setMapping, seul int, QString, QWidget * et * QObject. Voir QSignalMapper documentation .
connect(signalMapper, SIGNAL(mapped(QObject*)), this, SLOT(addMenu(passedMapType));
Ce ne fonctionne pas non plus, parce que les signatures sont incompatibles: QObject * par rapport à QMap.
Qu'est-ce que je ferais: Tenir un QMap
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...
}
Autres conseils
Utilisez typedefs. Mon sentiment est que la virgule entre les deux paramètres du modèle de QString est un problème dans l'expansion macro.
En tant que travail agréable autour de vous pouvez utiliser QObject. QObject a un intérieur QMap intégré. Voici comment ça se passe:
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();
}
Ceci est une supposition pure, mais vous devrez peut-être utiliser à la place des types de pointeurs? Je ne ai jamais eu beaucoup de chance très passage par référence avec &.
public slots:
void addMenu(QMap<QString, QString> *map);
signals:
void clicked(QMap<QString, QString> *map);
Le signal et la fente doit avoir les mêmes types d'arguments (il est un appel de fonction, en quelque sorte), de sorte que cette ligne est erroné:
connect(signalMapper, SIGNAL(mapped(QObject*)), this, SLOT(addMenu(passedMapType));
Vous devrez peut-être repenser votre logique un peu pour faire ce travail.