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)));

現在、QString の代わりに QMap < QString, QString > を addMenu に渡そうとしていますが、「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 の代わりに QMap < QString, QString > を addMenu に渡そうとしていますが、エラーが発生します: '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 に答える
3

typedef を使用します。私の感じでは、2 つの QString テンプレート パラメーターの間のコンマは、マクロ展開の問題です。

于 2010-11-19T20:36:45.833 に答える
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 に答える