所以,这是可行的:
.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) {
}
最佳答案
“现在,我试图将 QMap < QString, QString > 传递给 addMenu 而不仅仅是 QString,但我收到错误消息:没有匹配函数来调用 'QSignalMapper::setMapping'。”
这不是一般的信号/槽或宏扩展问题,而是 QSignalMapper 的局限性。您不能将 QMap 传递给 setMapping,只能传递 int、QString、QWidget* 和 QObject*。查看QSignalMapper documentation .
connect(signalMapper, SIGNAL(mapped(QObject*)), this, SLOT(addMenu(passedMapType));
那也行不通,因为签名不兼容:QObject* 与 QMap。
我会做什么:在按钮的所有者中持有一个 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...
}
关于c++ - 无法将 QMap 传递给 SLOT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4229080/