| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying | |
| file LICENSE.rst or https://cmake.org/licensing for details. */ | |
| #pragma once | |
| #include <functional> | |
| #include <memory> | |
| #include <QObject> | |
| #include <QWidget> | |
| class CatchShow : public QObject | |
| { | |
| Q_OBJECT | |
| public: | |
| CatchShow(QObject* parent = nullptr); | |
| template <typename T, typename F> | |
| void setCallback(F&& func); | |
| bool eventFilter(QObject* obj, QEvent* event) override; | |
| int count() const; | |
| private: | |
| std::function<void(QObject* obj)> m_callback; | |
| int m_count = 0; | |
| }; | |
| template <typename T, typename F> | |
| void CatchShow::setCallback(F&& func) | |
| { | |
| this->m_callback = [this, func](QObject* obj) { | |
| auto* d = qobject_cast<T*>(obj); | |
| if (d) { | |
| QMetaObject::invokeMethod( | |
| obj, | |
| [this, func, d]() { | |
| ++this->m_count; | |
| func(d); | |
| }, | |
| Qt::QueuedConnection); | |
| } | |
| }; | |
| } |