D25664: [WIP]: Port away from deprecated QSignalMapper

David Faure noreply at phabricator.kde.org
Sun Dec 1 22:55:29 GMT 2019


dfaure requested changes to this revision.
dfaure added inline comments.
This revision now requires changes to proceed.

INLINE COMMENTS

> KoDialog.cpp:161
>  
> -    QObject::connect(button, SIGNAL(clicked()),
> -                     &mButtonSignalMapper, SLOT(map()));
> +    QObject::connect(button, &QPushButton::clicked, [this, &key] { q_ptr->slotButtonClicked(key); });
>  

I bet this crashes at runtime.

You're capturing the local variable `key` by reference, so it will have gone out of scope by the time the lambda calls the slot. Remove the `&` to make it a capture by value.

> KoFormulaTool.cpp:115
>      connect(m_formulaShape->formulaData(), SIGNAL(dataChanged(FormulaCommand*,bool)), this, SLOT(updateCursor(FormulaCommand*,bool)));
> -    connect(m_signalMapper, SIGNAL(mapped(QString)), this, SLOT(insert(QString)));
> +    for (const TemplateAction &templateAction : m_templateActions) {
> +        connect(templateAction.action, &QAction::triggered, [this, &templateAction] { insert(templateAction.data); });

`qAsConst(m_templateActions)` to avoid a detach

> KoFormulaTool.cpp:124
>  {
> +    for (const TemplateAction &templateAction : m_templateActions) {
> +        disconnect(templateAction.action, &QAction::triggered, nullptr, nullptr);

same here

> KoFormulaTool.cpp:134
>          //TODO: is this save?
>          delete m_cursorList[0];
>          m_cursorList.removeAt(0);

completely unrelated : this those two lines could be combined into `delete m_cursorList.takeAt(0);`, and the comment removed.

> SpellCheckMenu.cpp:83
>              QAction *action = new QAction(suggestion, m_suggestionsMenu);
> -            connect(action, SIGNAL(triggered()), m_suggestionsSignalMapper, SLOT(map()));
> -            m_suggestionsSignalMapper->setMapping(action, suggestion);
> +            connect(action, &QAction::triggered, [this, &suggestion] { replaceWord(suggestion); });
>              m_suggestionsMenu->addAction(action);

You're capturing `suggestion` by reference, and it's a reference itself.
Are you 100% sure that this will point to the m_suggestions list and not to the local variable?

OK I did some googling and found that C++11 was unclear about that, C++14 clarified it to be OK.

Still, I would just make a copy, so the next reader doesn't have to spend time googling for edge cases ;)

> TextTool.cpp:192
>              QAction *a = new QAction(factory->title(), this);
> -            connect(a, SIGNAL(triggered()), signalMapper, SLOT(map()));
> -            signalMapper->setMapping(a, factory->id());
> +            connect(a, &QAction::triggered, [this, &factory] { startTextEditingPlugin(factory->id()); });
>              list.append(a);

Remove `&` here too -- reference to local variable, used later = crash.

> SimpleCitationBibliographyWidget.cpp:80
>          preview->updatePreview(info);
> -        connect(preview, SIGNAL(pixmapGenerated()), m_signalMapper, SLOT(map()));
> -        m_signalMapper->setMapping(preview, index);
> +        connect(preview, &BibliographyPreview::pixmapGenerated, [this, &index] { pixmapReady(index); });
>          m_previewGenerator.append(preview);

you know what I'm going to say ;)

+ add `this` as 3rd argument

> SimpleCitationBibliographyWidget.cpp:110
>      widget.addBibliography->addItem(m_chooser, m_previewGenerator.at(templateId)->previewPixmap(), templateId + 1);
> -    disconnect(m_previewGenerator.at(templateId), SIGNAL(pixmapGenerated()), m_signalMapper, SLOT(map()));
> +    disconnect(m_previewGenerator.at(templateId), &BibliographyPreview::pixmapGenerated, nullptr, nullptr);
>      m_previewGenerator.at(templateId)->deleteLater();

This is a bit dangerous, it also disconnects any other possible receiver. You should be able to pass `this` as 3rd arg instead of `nullptr`, if you pass `this` at connect time too.

(this applies to all the disconnects in this change request)

> SimpleTableOfContentsWidget.cpp:78
>          preview->updatePreview(info);
> -        connect(preview, SIGNAL(pixmapGenerated()), m_signalMapper, SLOT(map()));
> -        m_signalMapper->setMapping(preview, index);
> +        connect(preview, &TableOfContentsPreview::pixmapGenerated, [this, &index] { pixmapReady(index); });
>          m_previewGenerator.append(preview);

same

Also, add `this` as third argument.

> Tool.h:69
>          for (QHash<QString, QAction*>::const_iterator it = actionhash.constBegin(); it != actionhash.constEnd(); ++it) {
> -            connect(it.value(), SIGNAL(triggered()), m_signalMapper, SLOT(map()));
> -            m_signalMapper->setMapping(it.value() , it.key());
> +            connect(it.value(), &QAction::triggered, [this, &it] { actionTriggered(it.key()); });
>          }

Better capture a local variable called `key` by value.

Iterators get invalidated when containers change.

REPOSITORY
  R8 Calligra

REVISION DETAIL
  https://phabricator.kde.org/D25664

To: ognarb, #calligra:_3.0, #kf6, dfaure
Cc: dfaure, Calligra-Devel-list, davidllewellynjones, dcaliste, ognarb, cochise, vandenoever
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/calligra-devel/attachments/20191201/571b20b2/attachment.htm>


More information about the calligra-devel mailing list