質問

だから、この作品ます:

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

さて、私はA 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) {

}
役に立ちましたか?

解決

「今、私が代わりにQStringのただのaddMenuに通過QMap を渡すためにしようとしていますが、私はエラーを取得: 『QSignalMapper :: setMapping』への呼び出しに該当する機能を」

これは、一般的な信号/スロットまたはマクロ展開の問題が、QSignalMapperの制限はありません。あなたは* setMapping、唯一のint、QStringの、QWidgetの*とQObjectのにQMapを渡すことはできません。 QSignalMapperドキュメントを参照してください。

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

これシグネチャは互換性がないため、いずれかの動作しません:QObjectを*対QMap。

私はどうなるのか:スロットslotClicked(QObjectを*)を作成し、ボタンの所有者にQMap ホールドが、ボタンのクリック()の信号に接続され、その後、見上げます渡されたQObjectの*を使用して、マップからオブジェクトをPassedMapType。 編集は、それを説明するためにいくつかの擬似コードを追加します:

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。私の気持ちは、2つの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