سؤال

لذلك ، هذا يعمل:

.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 الوثائق.

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

لن ينجح ذلك أيضًا ، لأن التوقيعات غير متوافقة: Qobject* مقابل QMAP.

ما الذي سأفعله: عقد QMAPu003CQObject*,PassedMapType> في مالك الأزرار ، قم بإنشاء فتحة فتحة (qobject*) هناك ، متصلة بإشارات النقر () من الأزرار ، ثم ابحث عن كائن MasedMaptype من الخريطة ، باستخدام 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...
}

نصائح أخرى

استخدام typedefs. شعوري هو أن الفاصلة بين معلمات قالب 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