Domanda

Quindi, questo funziona:

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

Ora, sto cercando di passare un QMap fino alla addMenu invece di una QString, ma ottengo l'errore: nessuna funzione di corrispondenza per la chiamata a 'QSignalMapper :: setMapping'. Ho bisogno di creare un typedef o qualcosa del genere?

.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:. Ho anche provato ad aggiungere un typedef, ma ancora ottenere lo stesso errore

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

}
È stato utile?

Soluzione

"Ora, sto cercando di passare un QMap fino alla addMenu invece di una QString, ma ottengo l'errore:. Nessuna funzione di corrispondenza per la chiamata a 'QSignalMapper :: setMapping'"

Non è un segnale generale / fessura o problema di espansione macro, ma una limitazione di QSignalMapper. Non è possibile passare un QMap a setMapping, solo int, QString, QWidget * e * QObject. Vedere la QSignalMapper documentazione .

connect(signalMapper, SIGNAL(mapped(QObject*)), this, SLOT(addMenu(passedMapType));

Che non avrebbe funzionato sia, perché le firme sono incompatibili: QObject * vs. QMap.

Quello che vorrei fare: Tenere un QMap nel proprietario dei pulsanti, creare una fessura slotClicked (QObject *) lì, collegato ai cliccato () segnali dei pulsanti, e poi cercare il PassedMapType oggetto dalla mappa, utilizzando il QObject passato *. Modifica aggiunto qualche pseudo codice per illustrare che:

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...
}

Altri suggerimenti

Usa typedef. La mia sensazione è che la virgola tra i due parametri di modello QString è un problema in espansione di macro.

Come un lavoro piacevole intorno è possibile utilizzare QObject. QObject ha un dentro QMap incorporato. Ecco come 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();
  }

Questa è una congettura pura, ma potrebbe essere necessario utilizzare i tipi di puntatore, invece? Non ho mai avuto molto fortuna passaggio per riferimento con &.

public slots:
void addMenu(QMap<QString, QString> *map);

signals:
void clicked(QMap<QString, QString> *map);

Il segnale e lo slot deve avere i tipi stesso argomento (si tratta di una chiamata di funzione, di genere), in modo da questa linea è sbagliata:

connect(signalMapper, SIGNAL(mapped(QObject*)), this, SLOT(addMenu(passedMapType));

Potrebbe essere necessario ripensare la logica un po 'per fare quel lavoro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top