Kann nicht QMap durch SCHLITZ passieren
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
.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) {
}
Lösung
„Jetzt versuche ich, ein QMap
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
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.