19#include <QtCore/qglobal.h>
21#include <private/qintrusivelist_p.h>
28class QQmlThreadPrivate;
45 template<
typename Method,
typename ...Args>
51 template<
typename Method,
typename ...Args>
55 template<
typename Method,
typename ...Args>
59 template<
typename Method,
typename ...Args>
70 friend class QQmlThreadPrivate;
73 Message() : next(
nullptr) {}
78 template<
typename Method,
typename ...Args>
79 Message *createMessageFromMethod(Method &&method, Args &&...args);
80 void internalCallMethodInThread(Message *);
81 void internalCallMethodInMain(Message *);
82 void internalPostMethodToThread(Message *);
83 void internalPostMethodToMain(Message *);
88template <
typename>
struct member_function_traits;
90template <
typename Return,
typename Object,
typename... Args>
91struct member_function_traits<Return (Object::*)(Args...)>
93 using class_type = Object;
97template<
typename Method,
typename ...Args>
100 struct I :
public Message {
102 std::tuple<std::decay_t<Args>...> arguments;
103 I(Method &&method, Args&& ...args) : m(std::forward<Method>(method)), arguments(std::forward<Args>(args)...) {}
105 using class_type =
typename QtPrivate::member_function_traits<Method>::class_type;
106 class_type *me =
static_cast<class_type *>(thread);
107 std::apply(m, std::tuple_cat(std::make_tuple(me), arguments));
110 return new I(std::forward<Method>(method), std::forward<Args>(args)...);
113template<
typename Method,
typename ...Args>
116 Message *m = createMessageFromMethod(std::forward<Method>(method), std::forward<Args>(args)...);
117 internalCallMethodInMain(m);
120template<
typename Method,
typename ...Args>
123 Message *m = createMessageFromMethod(std::forward<Method>(method), std::forward<Args>(args)...);
124 internalCallMethodInThread(m);
127template<
typename Method,
typename ...Args>
130 Message *m = createMessageFromMethod(std::forward<Method>(method), std::forward<Args>(args)...);
131 internalPostMethodToThread(m);
134template<
typename Method,
typename ...Args>
137 Message *m = createMessageFromMethod(std::forward<Method>(method), std::forward<Args>(args)...);
138 internalPostMethodToMain(m);
QQmlThreadPrivate(QQmlThread *q)
bool event(QEvent *e) override
This virtual function receives events to an object and should return true if the event e was recogniz...
void postMethodToThread(Method &&method, Args &&...args)
bool isThisThread() const
void waitForNextMessage()
void postMethodToMain(Method &&method, Args &&...args)
void callMethodInMain(Method &&method, Args &&...args)
void callMethodInThread(Method &&method, Args &&...args)
QObject * threadObject() const
And object living in the QML thread, in case you want to parent other objects to it.
QT_REQUIRE_CONFIG(itemmodel)