c++ - 无法将 QMap 传递给 SLOT

标签 c++ qt qt4 qmap

所以,这是可行的:

.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,在那里创建一个插槽 slotClicked(QObject*),连接到按钮的 clicked() 信号,然后查找来自 map 的 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...
}

关于c++ - 无法将 QMap 传递给 SLOT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4229080/

相关文章:

c++ - 如何在反向抛光计算器中添加多位整数

c++ - 有没有一种理想的方法可以避免这种使用 Naked New 的情况?

c++ - 传递给调整大小函数后使用 new 创建的动态数组出错

C++ 共享库宏

c++ - 我的 ListView 没有在 Qt 中获得键盘焦点

c++ - 带有 Qt 的动态 QGridLayout(适应小部件大小)

c++ - Qt 嵌套模型 View

qt - 如何解决 QPixmap::fromImage 内存泄漏?

c++ - Qt 和 C++ : app crashes only in debug mode

python - 在 pyqt 中应用样式表