diff --git a/src/corelib/doc/snippets/qsignalmapper/buttonwidget.cpp b/src/corelib/doc/snippets/qsignalmapper/buttonwidget.cpp index 84a156bb6d..879cdbe329 100644 --- a/src/corelib/doc/snippets/qsignalmapper/buttonwidget.cpp +++ b/src/corelib/doc/snippets/qsignalmapper/buttonwidget.cpp @@ -61,14 +61,13 @@ ButtonWidget::ButtonWidget(const QStringList &texts, QWidget *parent) QGridLayout *gridLayout = new QGridLayout; for (int i = 0; i < texts.size(); ++i) { QPushButton *button = new QPushButton(texts[i]); - connect(button, &QPushButton::clicked, - signalMapper, &QSignalMapper::map); + connect(button, &QPushButton::clicked, signalMapper, &QSignalMapper::map); //! [0] //! [1] signalMapper->setMapping(button, texts[i]); gridLayout->addWidget(button, i / 3, i % 3); } - connect(signalMapper, QOverload::of(&QSignalMapper::mapped), + connect(signalMapper, &QSignalMapper::mappedString, //! [1] //! [2] this, &ButtonWidget::clicked); diff --git a/src/corelib/kernel/qsignalmapper.cpp b/src/corelib/kernel/qsignalmapper.cpp index 24b174972f..dc0dfe8f40 100644 --- a/src/corelib/kernel/qsignalmapper.cpp +++ b/src/corelib/kernel/qsignalmapper.cpp @@ -53,11 +53,36 @@ public: Q_Q(QSignalMapper); q->removeMappings(q->sender()); } + + template + void emitMappedValue(QObject *sender, Signal signal, const Container &mappedValues) + { + Q_Q(QSignalMapper); + + auto it = mappedValues.find(sender); + if (it != mappedValues.end()) { +#if QT_DEPRECATED_SINCE(5, 15) +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED + Q_EMIT q->mapped(*it); +QT_WARNING_POP +#endif + Q_EMIT (q->*signal)(*it); + } + } + + void emitMappedValues(QObject *sender) + { + emitMappedValue(sender, &QSignalMapper::mappedInt, intHash); + emitMappedValue(sender, &QSignalMapper::mappedString, stringHash); + emitMappedValue(sender, &QSignalMapper::mappedWidget, widgetHash); + emitMappedValue(sender, &QSignalMapper::mappedObject, objectHash); + } + QHash intHash; QHash stringHash; QHash widgetHash; QHash objectHash; - }; /*! @@ -74,11 +99,12 @@ public: use lambdas for passing custom parameters to slots. This is less costly and will simplify the code. - The class supports the mapping of particular strings or integers - with particular objects using setMapping(). The objects' signals - can then be connected to the map() slot which will emit the - mapped() signal with the string or integer associated with the - original signalling object. Mappings can be removed later using + The class supports the mapping of particular strings, integers, + objects and widgets with particular objects using setMapping(). + The objects' signals can then be connected to the map() slot which + will emit a signal (it could be mappedInt(), mappedString(), + mappedWidget() and mappedObject()) with a value associated with + the original signalling object. Mappings can be removed later using removeMappings(). Example: Suppose we want to create a custom widget that contains @@ -106,8 +132,8 @@ public: created. We connect each button's \c clicked() signal to the signal mapper's map() slot, and create a mapping in the signal mapper from each button to the button's text. Finally we connect - the signal mapper's mapped() signal to the custom widget's \c - clicked() signal. When the user clicks a button, the custom + the signal mapper's mappedString() signal to the custom widget's + \c clicked() signal. When the user clicks a button, the custom widget will emit a single \c clicked() signal whose argument is the text of the button the user clicked. @@ -137,7 +163,7 @@ QSignalMapper::~QSignalMapper() /*! Adds a mapping so that when map() is signalled from the given \a - sender, the signal mapped(\a id) is emitted. + sender, the signal mappedInt(\a id) is emitted. There may be at most one integer ID for each sender. @@ -152,7 +178,7 @@ void QSignalMapper::setMapping(QObject *sender, int id) /*! Adds a mapping so that when map() is signalled from the \a sender, - the signal mapped(\a text ) is emitted. + the signal mappedString(\a text ) is emitted. There may be at most one text for each sender. */ @@ -165,7 +191,7 @@ void QSignalMapper::setMapping(QObject *sender, const QString &text) /*! Adds a mapping so that when map() is signalled from the \a sender, - the signal mapped(\a widget ) is emitted. + the signal mappedWidget(\a widget ) is emitted. There may be at most one widget for each sender. */ @@ -178,7 +204,7 @@ void QSignalMapper::setMapping(QObject *sender, QWidget *widget) /*! Adds a mapping so that when map() is signalled from the \a sender, - the signal mapped(\a object ) is emitted. + the signal mappedObject(\a object ) is emitted. There may be at most one object for each sender. */ @@ -259,20 +285,14 @@ void QSignalMapper::map() { map(sender()); } */ void QSignalMapper::map(QObject *sender) { - Q_D(QSignalMapper); - if (d->intHash.contains(sender)) - emit mapped(d->intHash.value(sender)); - if (d->stringHash.contains(sender)) - emit mapped(d->stringHash.value(sender)); - if (d->widgetHash.contains(sender)) - emit mapped(d->widgetHash.value(sender)); - if (d->objectHash.contains(sender)) - emit mapped(d->objectHash.value(sender)); + d_func()->emitMappedValues(sender); } - +#if QT_DEPRECATED_SINCE(5, 15) /*! \fn void QSignalMapper::mapped(int i) + \obsolete + \overload This signal is emitted when map() is signalled from an object that has an integer mapping set. The object's mapped integer is passed @@ -283,6 +303,8 @@ void QSignalMapper::map(QObject *sender) /*! \fn void QSignalMapper::mapped(const QString &text) + \obsolete + \overload This signal is emitted when map() is signalled from an object that has a string mapping set. The object's mapped string is passed in @@ -293,6 +315,8 @@ void QSignalMapper::map(QObject *sender) /*! \fn void QSignalMapper::mapped(QWidget *widget) + \obsolete + \overload This signal is emitted when map() is signalled from an object that has a widget mapping set. The object's mapped widget is passed in @@ -303,6 +327,53 @@ void QSignalMapper::map(QObject *sender) /*! \fn void QSignalMapper::mapped(QObject *object) + \obsolete + \overload + + This signal is emitted when map() is signalled from an object that + has an object mapping set. The object provided by the map is passed in + \a object. + + \sa setMapping() +*/ +#endif + +/*! + \fn void QSignalMapper::mappedInt(int i) + \since 5.15 + + This signal is emitted when map() is signalled from an object that + has an integer mapping set. The object's mapped integer is passed + in \a i. + + \sa setMapping() +*/ + +/*! + \fn void QSignalMapper::mappedString(const QString &text) + \since 5.15 + + This signal is emitted when map() is signalled from an object that + has a string mapping set. The object's mapped string is passed in + \a text. + + \sa setMapping() +*/ + +/*! + \fn void QSignalMapper::mappedWidget(QWidget *widget) + \since 5.15 + + This signal is emitted when map() is signalled from an object that + has a widget mapping set. The object's mapped widget is passed in + \a widget. + + \sa setMapping() +*/ + +/*! + \fn void QSignalMapper::mappedObject(QObject *object) + \since 5.15 This signal is emitted when map() is signalled from an object that has an object mapping set. The object provided by the map is passed in diff --git a/src/corelib/kernel/qsignalmapper.h b/src/corelib/kernel/qsignalmapper.h index 0da1e8f87d..592986e6a5 100644 --- a/src/corelib/kernel/qsignalmapper.h +++ b/src/corelib/kernel/qsignalmapper.h @@ -66,10 +66,20 @@ public: QObject *mapping(QObject *object) const; Q_SIGNALS: +#if QT_DEPRECATED_SINCE(5, 15) + QT_DEPRECATED_VERSION_X_5_15("Use QSignalMapper::mappedInt(int) instead") void mapped(int); + QT_DEPRECATED_VERSION_X_5_15("Use QSignalMapper::mappedString(const QString&) instead") void mapped(const QString &); + QT_DEPRECATED_VERSION_X_5_15("Use QSignalMapper::mappedWidget(QWidget *) instead") void mapped(QWidget *); + QT_DEPRECATED_VERSION_X_5_15("Use QSignalMapper::mappedObject(QObject *) instead") void mapped(QObject *); +#endif + void mappedInt(int); + void mappedString(const QString &); + void mappedWidget(QWidget *); + void mappedObject(QObject *); public Q_SLOTS: void map(); diff --git a/tests/auto/corelib/kernel/qsignalmapper/tst_qsignalmapper.cpp b/tests/auto/corelib/kernel/qsignalmapper/tst_qsignalmapper.cpp index c03e3e8e9f..78b0b5dc55 100644 --- a/tests/auto/corelib/kernel/qsignalmapper/tst_qsignalmapper.cpp +++ b/tests/auto/corelib/kernel/qsignalmapper/tst_qsignalmapper.cpp @@ -41,8 +41,8 @@ class QtTestObject : public QObject { Q_OBJECT public slots: - void myslot(int id); - void myslot(const QString &str); + void myIntSlot(int id); + void myStringSlot(const QString &str); signals: void mysignal(int); @@ -54,12 +54,12 @@ public: QString str; }; -void QtTestObject::myslot(int id) +void QtTestObject::myIntSlot(int id) { this->id = id; } -void QtTestObject::myslot(const QString &str) +void QtTestObject::myStringSlot(const QString &str) { this->str = str; } @@ -71,7 +71,7 @@ void QtTestObject::emit_mysignal(int value) void tst_QSignalMapper::mapped() { - QSignalMapper mapper(0); + QSignalMapper mapper; QtTestObject target; QtTestObject src1; @@ -88,8 +88,8 @@ void tst_QSignalMapper::mapped() mapper.setMapping(&src2, "two"); mapper.setMapping(&src3, "three"); - connect(&mapper, SIGNAL(mapped(int)), &target, SLOT(myslot(int))); - connect(&mapper, SIGNAL(mapped(QString)), &target, SLOT(myslot(QString))); + connect(&mapper, &QSignalMapper::mappedInt, &target, &QtTestObject::myIntSlot); + connect(&mapper, &QSignalMapper::mappedString, &target, &QtTestObject::myStringSlot); src1.emit_mysignal(20); QCOMPARE(target.id, 1);