File indexing completed on 2026-09-04 09:22:38
0001
0002
0003
0004
0005 #ifndef QABSTRACTEVENTDISPATCHER_H
0006 #define QABSTRACTEVENTDISPATCHER_H
0007
0008 #include <QtCore/qobject.h>
0009 #include <QtCore/qeventloop.h>
0010
0011 QT_BEGIN_NAMESPACE
0012
0013 class QAbstractNativeEventFilter;
0014 class QAbstractEventDispatcherPrivate;
0015 class QSocketNotifier;
0016
0017 class Q_CORE_EXPORT QAbstractEventDispatcher : public QObject
0018 {
0019 Q_OBJECT
0020 Q_DECLARE_PRIVATE(QAbstractEventDispatcher)
0021
0022 public:
0023 using Duration = std::chrono::nanoseconds;
0024 struct TimerInfo
0025 {
0026 int timerId;
0027 int interval;
0028 Qt::TimerType timerType;
0029 #ifndef Q_QDOC
0030 #ifndef __cpp_aggregate_paren_init
0031 TimerInfo() = default;
0032 inline TimerInfo(int id, int i, Qt::TimerType t)
0033 : timerId(id), interval(i), timerType(t) { }
0034 #endif
0035 #endif
0036 };
0037 struct TimerInfoV2
0038 {
0039 Duration interval;
0040 Qt::TimerId timerId;
0041 Qt::TimerType timerType;
0042 };
0043
0044 explicit QAbstractEventDispatcher(QObject *parent = nullptr);
0045 ~QAbstractEventDispatcher();
0046
0047 static QAbstractEventDispatcher *instance(QThread *thread = nullptr);
0048
0049 virtual bool processEvents(QEventLoop::ProcessEventsFlags flags) = 0;
0050
0051 virtual void registerSocketNotifier(QSocketNotifier *notifier) = 0;
0052 virtual void unregisterSocketNotifier(QSocketNotifier *notifier) = 0;
0053
0054 Qt::TimerId registerTimer(Duration interval, Qt::TimerType timerType, QObject *object);
0055
0056 #if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
0057 int registerTimer(qint64 interval, Qt::TimerType timerType, QObject *object);
0058
0059
0060 virtual void registerTimer(int timerId, qint64 interval, Qt::TimerType timerType, QObject *object) = 0;
0061 virtual bool unregisterTimer(int timerId) = 0;
0062 virtual bool unregisterTimers(QObject *object) = 0;
0063 virtual QList<TimerInfo> registeredTimers(QObject *object) const = 0;
0064 virtual int remainingTime(int timerId) = 0;
0065
0066 void registerTimer(Qt::TimerId timerId, Duration interval, Qt::TimerType timerType, QObject *object);
0067 bool unregisterTimer(Qt::TimerId timerId);
0068 QList<TimerInfoV2> timersForObject(QObject *object) const;
0069 Duration remainingTime(Qt::TimerId timerId) const;
0070 #else
0071 virtual void registerTimer(Qt::TimerId timerId, Duration interval, Qt::TimerType timerType, QObject *object) = 0;
0072 virtual bool unregisterTimer(Qt::TimerId timerId) = 0;
0073 virtual bool unregisterTimers(QObject *object) = 0;
0074 virtual QList<TimerInfoV2> timersForObject(QObject *object) const = 0;
0075 virtual Duration remainingTime(Qt::TimerId timerId) const = 0;
0076 #endif
0077
0078 virtual void wakeUp() = 0;
0079 virtual void interrupt() = 0;
0080
0081 virtual void startingUp();
0082 virtual void closingDown();
0083
0084 void installNativeEventFilter(QAbstractNativeEventFilter *filterObj);
0085 void removeNativeEventFilter(QAbstractNativeEventFilter *filterObj);
0086 bool filterNativeEvent(const QByteArray &eventType, void *message, qintptr *result);
0087
0088 Q_SIGNALS:
0089 void aboutToBlock();
0090 void awake();
0091
0092 protected:
0093 QAbstractEventDispatcher(QAbstractEventDispatcherPrivate &,
0094 QObject *parent);
0095 };
0096
0097 Q_DECLARE_TYPEINFO(QAbstractEventDispatcher::TimerInfo, Q_PRIMITIVE_TYPE);
0098 Q_DECLARE_TYPEINFO(QAbstractEventDispatcher::TimerInfoV2, Q_PRIMITIVE_TYPE);
0099
0100 #if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
0101 class Q_CORE_EXPORT QAbstractEventDispatcherV2 : public QAbstractEventDispatcher
0102 {
0103 Q_OBJECT
0104 Q_DECLARE_PRIVATE(QAbstractEventDispatcher)
0105
0106 public:
0107 explicit QAbstractEventDispatcherV2(QObject *parent = nullptr);
0108 ~QAbstractEventDispatcherV2() override;
0109
0110
0111 virtual void registerTimer(Qt::TimerId timerId, Duration interval, Qt::TimerType timerType,
0112 QObject *object) = 0;
0113 virtual bool unregisterTimer(Qt::TimerId timerId) = 0;
0114 virtual QList<TimerInfoV2> timersForObject(QObject *object) const = 0;
0115 virtual Duration remainingTime(Qt::TimerId timerId) const = 0;
0116 virtual bool processEventsWithDeadline(QEventLoop::ProcessEventsFlags flags, QDeadlineTimer deadline);
0117
0118 protected:
0119 QAbstractEventDispatcherV2(QAbstractEventDispatcherPrivate &, QObject *parent);
0120
0121 private:
0122 QT_WARNING_PUSH
0123 QT_WARNING_DISABLE_GCC("-Woverloaded-virtual")
0124 QT_WARNING_DISABLE_CLANG("-Woverloaded-virtual")
0125
0126 void registerTimer(int timerId, qint64 interval, Qt::TimerType timerType,
0127 QObject *object) final;
0128 bool unregisterTimer(int timerId) final;
0129 QList<TimerInfo> registeredTimers(QObject *object) const final;
0130 int remainingTime(int timerId) final;
0131 QT_WARNING_POP
0132 };
0133 #else
0134 using QAbstractEventDispatcherV2 = QAbstractEventDispatcher;
0135 #endif
0136
0137 QT_END_NAMESPACE
0138
0139 #endif