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 jusqu'à addMenu au lieu d'un QString, mais je reçois l'erreur: aucune fonction de mise en correspondance pour l'appel à « QSignalMapper :: setMapping ». Ai-je besoin de créer un typedef ou quelque chose?

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

}
Était-ce utile?

La solution

« Maintenant, je suis en train de passer un QMap jusqu'à addMenu au lieu d'un QString, mais je reçois l'erreur:. Pas de fonction concordante pour appel à « QSignalMapper :: setMapping » »

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 dans le propriétaire des boutons, créer une fente slotClicked (QObject *) là, connecté aux signaux clicked () des boutons, puis rechercher la PassedMapType objet de la carte, en utilisant le QObject passé *. Modifier a ajouté un code pseudo pour l'illustrer:

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top