Frage

Also, das funktioniert:

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

Nun, ich versuche, ein QMap durchlaufen zu addMenu statt nur einen QString, aber ich habe den Fehler: keine passende Funktion für Aufruf von ‚QSignalMapper :: setMapping‘. Muss ich eine typedef oder etwas schaffen?

.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:. Ich habe auch versucht, ein typedef Zugabe, aber immer noch gleiche Fehler

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

}
War es hilfreich?

Lösung

„Jetzt versuche ich, ein QMap durchlaufen zu addMenu statt nur einen QString, aber ich den Fehler:. Keine passende Funktion für Aufruf von‚QSignalMapper :: setMapping‘“

Das ist nicht ein allgemeines Signal / Slot oder Makroerweiterung Problem, aber eine Beschränkung von QSignalMapper. Sie können keine QMap zu setMapping, nur int, QString, QWidget * und QObject * übergeben. Sehen Sie sich die QSignalMapper Dokumentation .

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

Das würde nicht funktionieren, weil die Signaturen sind nicht kompatibel: QObject * vs. QMap.

Was ich tun würde: Halten Sie eine QMap in dem Besitzer der Schaltflächen, erstellen Sie einen Schlitz slotClicked (QObject *) gibt, auf die geklickt () Signale der Tasten verbunden ist, und sehen dann die PassedMapType Objekt aus der Karte, die übergebene QObject mit *. Edit: einige Pseudo-Code hinzugefügt, um es zu verdeutlichen:

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

Andere Tipps

Mit typedefs. Mein Gefühl ist, dass das Komma zwischen den beiden QString Template-Parametern ein Problem in Makroerweiterung ist.

Als schöne Arbeit um Sie herum QObject verwenden können. QObject verfügt über einen integrierten QMap innen. Hier ist, wie es geht:

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();
  }

Dies ist eine reine Vermutung, aber Sie können stattdessen Zeigertypen verwenden müssen? Ich hatte nie viel Glück mit Bezug vorbei mit &.

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

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

Das Signal und Schlitz müssen die gleichen Argumenttypen haben (es ist ein Funktionsaufruf, die Sorten), so dass diese Zeile ist falsch:

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

Sie können Ihre Logik ein wenig zu überdenken müssen, um diese Arbeit zu machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top