簡體   English   中英

無法將QMap傳遞到SLOT

[英]Can't pass QMap through to SLOT

所以,這有效:

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

}

使用typedef。 我的感覺是兩個QString模板參數之間的逗號是宏擴展中的問題。

“現在,我試圖將QMap <QString,QString>傳遞給addMenu而不是QString,但是我得到了錯誤:沒有匹配的函數來調用'QSignalMapper :: setMapping'。”

這不是一般的信號/插槽或宏擴展問題,而是QSignalMapper的局限性。 您不能將QMap傳遞給setMapping,只能傳遞int,QString,QWidget *和QObject *。 請參閱QSignalMapper文檔

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

那也不行,因為簽名是不兼容的:QObject * vs. 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...
}

作為一項不錯的工作,您可以使用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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM