所以,这个作品:

·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 通过对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 通过对addMenu,而不是仅仅为QString,但我得到的错误:呼叫为‘QSignalMapper :: setMapping’不匹配函数”

这不是一个普通的信号/槽或宏扩展问题,而是QSignalMapper的限制。你可以不QMAP传递给setMapping,仅INT,QString的,QWidget的*和* QObject的。请参阅 QSignalMapper文档

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

这将不能工作,因为签名是不兼容的:QObject的*与QMAP。

我会做什么:保持一个QMAP 中的按钮的所有者,创建插槽slotClicked(QObject的*)那里,连接到所述按钮的点击()的信号,然后查找该从地图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...
}

其他提示

使用typedef。我的感觉是两个的QString模板参数之间的逗号呈宏观膨胀的问题。

作为一个很好的解决办法,你可以使用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();
  }

这是一个纯粹的猜测,但你可能需要使用指针类型呢?我从未有过很幸运通过引用传递与&

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

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

在信号和槽必须具有相同的参数类型(它的一个函数调用,各种各样的),所以这条线是错误的:

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

您可能需要重新考虑你的逻辑有点使这项工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top