所以,这有效:
·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)));
现在,我正在尝试传递QMap< QString,QString>通过addMenu而不仅仅是一个QString,但我得到错误:没有匹配函数来调用'QSignalMapper :: setMapping'。我是否需要创建typeDef或其他东西?
·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 >)));
编辑:我也尝试添加typeDef,但仍然遇到同样的错误。
·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) {
}
答案 0 :(得分:3)
使用typedef。我的感觉是两个QString模板参数之间的逗号是宏扩展中的问题。
答案 1 :(得分:3)
“现在,我正在尝试将QMap&lt; QString,QString&gt;传递给addMenu而不仅仅是一个QString,但我得到错误:没有匹配函数来调用'QSignalMapper :: setMapping'。” / p>
这不是一般的信号/槽或宏扩展问题,而是QSignalMapper的限制。您不能将QMap传递给setMapping,只能传递int,QString,QWidget *和QObject *。请参阅QSignalMapper documentation。
connect(signalMapper, SIGNAL(mapped(QObject*)), this, SLOT(addMenu(passedMapType));
这也行不通,因为签名不兼容:QObject *与QMap。
我会做什么:保持QMap&lt; QObject *,PassedMapType&gt;在按钮的所有者中,在那里创建一个插槽slotClicked(QObject *),连接到按钮的clicked()信号,然后使用传递的QObject *从地图中查找PassedMapType对象。 编辑添加了一些伪代码来说明它:
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...
}
答案 2 :(得分:1)
作为一个很好的工作,你可以使用QObject。 QObject里面有一个嵌入的QMap。这是怎么回事:
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();
}
答案 3 :(得分:0)
这是一个纯粹的猜测,但您可能需要使用指针类型?我从未通过&amp;。
的参考传递过多的运气public slots:
void addMenu(QMap<QString, QString> *map);
signals:
void clicked(QMap<QString, QString> *map);
答案 4 :(得分:0)
信号和插槽必须具有相同的参数类型(它是一个函数调用,排序),所以这一行是错误的:
connect(signalMapper, SIGNAL(mapped(QObject*)), this, SLOT(addMenu(passedMapType));
您可能需要重新考虑一下您的逻辑以使其发挥作用。