no puede pasar a través de QMap SLOT
Pregunta
Por lo tanto, esto funciona:
.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)));
Ahora, estoy tratando de pasar una 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:. También he intentado añadir un typedef, pero todavía conseguir el mismo error
.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) {
}
Solución
"Ahora, estoy tratando de pasar una QMap
Eso no es una señal general / ranura o problema expansión de macro, pero una limitación de QSignalMapper. No se puede pasar un QMap a setMapping, solamente int, QString, QWidget * y * QObject. Vea la QSignalMapper documentación .
connect(signalMapper, SIGNAL(mapped(QObject*)), this, SLOT(addMenu(passedMapType));
Eso no funcionaría bien, debido a que las firmas son incompatibles: QObject * en comparación con QMap.
Lo que yo haría: Mantenga 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...
}
Otros consejos
Uso typedefs. Mi sensación es que la coma entre los dos parámetros de plantilla QString es un problema en la expansión de macros.
Como un trabajo agradable alrededor, se puede utilizar QObject. QObject tiene un interior QMap incrustado. Aquí es cómo va:
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();
}
Esta es una suposición puro, pero puede que tenga que utilizar los tipos de puntero en su lugar? Nunca he tenido mucho suerte de pasar por referencia con y.
public slots:
void addMenu(QMap<QString, QString> *map);
signals:
void clicked(QMap<QString, QString> *map);
La señal y la ranura debe tener los mismos tipos de argumentos (que es una llamada a la función, de todo tipo), por lo que esta línea está equivocado:
connect(signalMapper, SIGNAL(mapped(QObject*)), this, SLOT(addMenu(passedMapType));
Es posible que tenga que reconsiderar su lógica un poco para hacer que el trabajo.