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 a través de Addmenu en lugar de sólo un QString, pero me sale el error: ninguna función coincidente para la llamada a 'QSignalMapper :: setMapping'. ¿Es necesario crear un typedef o algo?

.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) {

}
¿Fue útil?

Solución

"Ahora, estoy tratando de pasar una QMap a través de Addmenu en lugar de sólo un QString, pero me sale el error:. Ninguna función coincidente para la llamada a 'QSignalMapper :: setMapping'"

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 en el propietario de los botones, crear una ranura slotClicked (QObject *) allí, conectado a los hecho clic () señales de los botones, y luego buscar el PassedMapType objeto del mapa, usando el QObject pasado *. Editar: añadido algunos pseudo código para ilustrarlo:

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top