Pergunta

Então, isso funciona:

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

Agora, estou tentando passar um QMAP <QSTRING, QSTRING> para addmenu em vez de apenas um QSTRING, mas recebo o erro: nenhuma função correspondente para Call to 'Qsignalmapper :: setMapping'. Preciso criar um typedef ou algo assim?

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

EDIT: Eu também tentei adicionar um typedef, mas ainda recebendo o mesmo erro.

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

}
Foi útil?

Solução

"Agora, estou tentando passar um QMAP <QString, QString> para addmenu em vez de apenas um QString, mas recebo o erro: nenhuma função de correspondência para Call to 'Qsignalmapper :: setMapping'". "

Isso não é um problema geral de sinal/slot ou expansão de macro, mas uma limitação de Qsignalmapper. Você não pode passar um qmap para setMapping, apenas int, qString, qwidget* e qobject*. Veja o Documentação do QSignalmapper.

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

Isso também não funcionaria, porque as assinaturas são incompatíveis: QObject* vs. QMAP.

O que eu faria: segure um qmapu003CQObject*,PassedMapType> No proprietário dos botões, crie um slot slot clicked (qObject*) lá, conectado aos sinais clicar () dos botões e, em seguida, procure o objeto PassedMapType do mapa, usando o QOBject passado*.Editar: Adicionado algum código pseudo para ilustrá -lo:

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...
}

Outras dicas

Use typedefs. Meu sentimento é que a vírgula entre os dois parâmetros do modelo QString é um problema na expansão da macro.

Como um bom trabalho ao seu redor, você pode usar o QObject. O QObject possui um QMAP incorporado dentro. Aqui está como vai:

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

Isso é um palpite puro, mas você pode precisar usar os tipos de ponteiro? Eu nunca tive muita sorte passando por referência com &.

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

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

O sinal e o slot devem ter os mesmos tipos de argumento (é uma chamada de função), então essa linha está errada:

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

Pode ser necessário repensar sua lógica um pouco para fazer isso funcionar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top