2

所以,这有效:

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

}
4

5 回答 5

3

使用类型定义。我的感觉是两个QString模板参数之间的逗号是宏扩展的问题。

于 2010-11-19T20:36:45.833 回答
3

“现在,我试图将 QMap < QString, QString > 传递给 addMenu 而不仅仅是 QString,但我得到错误:没有匹配函数调用 'QSignalMapper::setMapping'。”

这不是一般的信号/槽或宏扩展问题,而是 QSignalMapper 的限制。您不能将 QMap 传递给 setMapping,只能传递 int、QString、QWidget* 和 QObject*。请参阅QSignalMapper 文档

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

这也行不通,因为签名不兼容:QObject* 与 QMap。

我会做什么:在按钮的所有者中持有一个 QMap<QObject*,PassedMapType> ,在那里创建一个插槽 slotClicked(QObject*) ,连接到按钮的 clicked() 信号,然后查找 PassedMapType 对象地图,使用传递的 QObject*。 编辑:添加了一些伪代码来说明它:

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...
}
于 2010-11-19T21:29:59.480 回答
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();
  }
于 2014-03-08T03:22:17.633 回答
0

这是一个纯粹的猜测,但您可能需要使用指针类型来代替?我从来没有很幸运地通过 & 引用传递。

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

signals:
void clicked(QMap<QString, QString> *map);
于 2010-11-19T20:28:55.640 回答
0

信号和槽必须具有相同的参数类型(它是一个函数调用,排序),所以这一行是错误的:

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

您可能需要重新考虑您的逻辑才能使其发挥作用。

于 2010-11-19T22:24:40.453 回答