diff options
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r-- | src/corelib/kernel/qcoreapplication.cpp | 15 | ||||
-rw-r--r-- | src/corelib/kernel/qeventdispatcher_glib.cpp | 5 | ||||
-rw-r--r-- | src/corelib/kernel/qmetatype.cpp | 617 | ||||
-rw-r--r-- | src/corelib/kernel/qmetatype.h | 10 | ||||
-rw-r--r-- | src/corelib/kernel/qobject.cpp | 3 | ||||
-rw-r--r-- | src/corelib/kernel/qobject_p.h | 4 | ||||
-rw-r--r-- | src/corelib/kernel/qsystemerror.cpp | 5 | ||||
-rw-r--r-- | src/corelib/kernel/qtimer.cpp | 23 | ||||
-rw-r--r-- | src/corelib/kernel/qtimer.h | 2 | ||||
-rw-r--r-- | src/corelib/kernel/qvariant.h | 4 |
10 files changed, 223 insertions, 465 deletions
diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp index 3c8b0f947c..e100ec8186 100644 --- a/src/corelib/kernel/qcoreapplication.cpp +++ b/src/corelib/kernel/qcoreapplication.cpp @@ -1265,7 +1265,11 @@ bool QCoreApplication::closingDown() \l{QCoreApplication::sendPostedEvents()}{sendPostedEvents()} from within that local loop. - Calling this function processes events only for the calling thread. + Calling this function processes events only for the calling thread, + and returns after all available events have been processed. Available + events are events queued before the function call. This means that + events that are posted while the function runs will be queued until + a later round of event processing. \threadsafe @@ -1282,7 +1286,7 @@ void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags) /*! \overload processEvents() - Processes pending events for the calling thread for \a maxtime + Processes pending events for the calling thread for \a ms milliseconds or until there are no more events to process, whichever is shorter. @@ -1291,11 +1295,14 @@ void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags) Calling this function processes events only for the calling thread. + \note Unlike the \l{QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags)}{processEvents()} + overload, this function also processes events that are posted while the function runs. + \threadsafe \sa exec(), QTimer, QEventLoop::processEvents() */ -void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags, int maxtime) +void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags, int ms) { // ### Qt 6: consider splitting this method into a public and a private // one, so that a user-invoked processEvents can be detected @@ -1306,7 +1313,7 @@ void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags, int m QElapsedTimer start; start.start(); while (data->eventDispatcher.load()->processEvents(flags & ~QEventLoop::WaitForMoreEvents)) { - if (start.elapsed() > maxtime) + if (start.elapsed() > ms) break; } } diff --git a/src/corelib/kernel/qeventdispatcher_glib.cpp b/src/corelib/kernel/qeventdispatcher_glib.cpp index 45c6e29e4b..34c2dde6a8 100644 --- a/src/corelib/kernel/qeventdispatcher_glib.cpp +++ b/src/corelib/kernel/qeventdispatcher_glib.cpp @@ -86,9 +86,10 @@ static gboolean socketNotifierSourceCheck(GSource *source) p->pollfd.fd, t[int(p->socketNotifier->type())]); // ### note, modifies src->pollfds! p->socketNotifier->setEnabled(false); + i--; + } else { + pending = pending || ((p->pollfd.revents & p->pollfd.events) != 0); } - - pending = ((p->pollfd.revents & p->pollfd.events) != 0); } return pending; diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp index eb67544f21..1ba5f3979c 100644 --- a/src/corelib/kernel/qmetatype.cpp +++ b/src/corelib/kernel/qmetatype.cpp @@ -290,6 +290,10 @@ struct DefinedTypesFilter { \value QJsonObject QJsonObject \value QJsonArray QJsonArray \value QJsonDocument QJsonDocument + \value QCborValue QCborValue + \value QCborArray QCborArray + \value QCborMap QCborMap + \value QCborSimpleType QCborSimpleType \value QModelIndex QModelIndex \value QPersistentModelIndex QPersistentModelIndex (since 5.5) \value QUuid QUuid @@ -373,6 +377,13 @@ struct DefinedTypesFilter { */ /*! + \fn int QMetaType::id() const + \since 5.13 + + Returns id type hold by this QMetatype instance. +*/ + +/*! \fn bool QMetaType::sizeOf() const \since 5.0 @@ -1374,236 +1385,197 @@ int QMetaType::type(const QT_PREPEND_NAMESPACE(QByteArray) &typeName) } #ifndef QT_NO_DATASTREAM -/*! - Writes the object pointed to by \a data with the ID \a type to - the given \a stream. Returns \c true if the object is saved - successfully; otherwise returns \c false. - The type must have been registered with qRegisterMetaType() and - qRegisterMetaTypeStreamOperators() beforehand. +namespace +{ - Normally, you should not need to call this function directly. - Instead, use QVariant's \c operator<<(), which relies on save() - to stream custom types. +template<typename T> +class HasStreamOperator +{ + struct Yes { char unused[1]; }; + struct No { char unused[2]; }; + Q_STATIC_ASSERT(sizeof(Yes) != sizeof(No)); + + template<class C> static decltype(std::declval<QDataStream&>().operator>>(std::declval<C&>()), Yes()) load(int); + template<class C> static decltype(operator>>(std::declval<QDataStream&>(), std::declval<C&>()), Yes()) load(int); + template<class C> static No load(...); + template<class C> static decltype(operator<<(std::declval<QDataStream&>(), std::declval<const C&>()), Yes()) saveFunction(int); + template<class C> static decltype(std::declval<QDataStream&>().operator<<(std::declval<const C&>()), Yes()) saveMethod(int); + template<class C> static No saveMethod(...); + template<class C> static No saveFunction(...); + static constexpr bool LoadValue = QtMetaTypePrivate::TypeDefinition<T>::IsAvailable && (sizeof(load<T>(0)) == sizeof(Yes)); + static constexpr bool SaveValue = QtMetaTypePrivate::TypeDefinition<T>::IsAvailable && + ((sizeof(saveMethod<T>(0)) == sizeof(Yes)) || (sizeof(saveFunction<T>(0)) == sizeof(Yes))); +public: + static constexpr bool Value = LoadValue && SaveValue; +}; - \sa load(), qRegisterMetaTypeStreamOperators() -*/ -bool QMetaType::save(QDataStream &stream, int type, const void *data) +// Quick sanity checks +Q_STATIC_ASSERT(HasStreamOperator<NS(QJsonDocument)>::Value); +Q_STATIC_ASSERT(!HasStreamOperator<void*>::Value); +Q_STATIC_ASSERT(HasStreamOperator<qint8>::Value); + +template<typename T, bool IsAcceptedType = DefinedTypesFilter::Acceptor<T>::IsAccepted && HasStreamOperator<T>::Value> +struct FilteredOperatorSwitch +{ + static bool load(QDataStream &stream, T *data, int) + { + stream >> *data; + return true; + } + static bool save(QDataStream &stream, const T *data, int) + { + stream << *data; + return true; + } +}; +template<typename T> +struct FilteredOperatorSwitch<T, /* IsAcceptedType = */ false> { - if (!data || !isRegistered(type)) + static const QMetaTypeInterface* getMetaTypeInterface(int type) + { + if (QModulesPrivate::QTypeModuleInfo<T>::IsGui && qMetaTypeGuiHelper) + return &qMetaTypeGuiHelper[type - QMetaType::FirstGuiType]; + else if (QModulesPrivate::QTypeModuleInfo<T>::IsWidget && qMetaTypeWidgetsHelper) + return &qMetaTypeWidgetsHelper[type - QMetaType::FirstWidgetsType]; + return nullptr; + } + static bool save(QDataStream &stream, const T *data, int type) + { + if (auto interface = getMetaTypeInterface(type)) { + interface->saveOp(stream, data); + return true; + } return false; - - switch(type) { - case QMetaType::UnknownType: - case QMetaType::Void: - case QMetaType::VoidStar: - case QMetaType::QObjectStar: -#if QT_CONFIG(itemmodel) - case QMetaType::QModelIndex: - case QMetaType::QPersistentModelIndex: -#endif - case QMetaType::QJsonValue: - case QMetaType::QJsonObject: - case QMetaType::QJsonArray: - case QMetaType::QJsonDocument: - case QMetaType::QCborValue: - case QMetaType::QCborArray: - case QMetaType::QCborMap: + } + static bool load(QDataStream &stream, T *data, int type) + { + if (auto interface = getMetaTypeInterface(type)) { + interface->loadOp(stream, data); + return true; + } return false; - case QMetaType::Nullptr: - stream << *static_cast<const std::nullptr_t *>(data); - return true; - case QMetaType::Long: - stream << qlonglong(*static_cast<const long *>(data)); - break; - case QMetaType::Int: - stream << *static_cast<const int *>(data); - break; - case QMetaType::Short: - stream << *static_cast<const short *>(data); - break; - case QMetaType::Char: + } +}; + +class SaveOperatorSwitch +{ +public: + QDataStream &stream; + int m_type; + + template<typename T> + bool delegate(const T *data) + { + return FilteredOperatorSwitch<T>::save(stream, data, m_type); + } + bool delegate(const char *data) + { // force a char to be signed - stream << *static_cast<const signed char *>(data); - break; - case QMetaType::ULong: - stream << qulonglong(*static_cast<const ulong *>(data)); - break; - case QMetaType::UInt: - stream << *static_cast<const uint *>(data); - break; - case QMetaType::LongLong: - stream << *static_cast<const qlonglong *>(data); - break; - case QMetaType::ULongLong: - stream << *static_cast<const qulonglong *>(data); - break; - case QMetaType::UShort: - stream << *static_cast<const ushort *>(data); - break; - case QMetaType::SChar: - stream << *static_cast<const signed char *>(data); - break; - case QMetaType::UChar: - stream << *static_cast<const uchar *>(data); - break; - case QMetaType::Bool: - stream << qint8(*static_cast<const bool *>(data)); - break; - case QMetaType::Float: - stream << *static_cast<const float *>(data); - break; - case QMetaType::Double: - stream << *static_cast<const double *>(data); - break; - case QMetaType::QChar: - stream << *static_cast<const NS(QChar) *>(data); - break; -#ifndef QT_BOOTSTRAPPED - case QMetaType::QVariantMap: - stream << *static_cast<const NS(QVariantMap)*>(data); - break; - case QMetaType::QVariantHash: - stream << *static_cast<const NS(QVariantHash)*>(data); - break; - case QMetaType::QVariantList: - stream << *static_cast<const NS(QVariantList)*>(data); - break; - case QMetaType::QVariant: - stream << *static_cast<const NS(QVariant)*>(data); - break; - case QMetaType::QByteArrayList: - stream << *static_cast<const NS(QByteArrayList)*>(data); - break; -#endif - case QMetaType::QByteArray: - stream << *static_cast<const NS(QByteArray)*>(data); - break; - case QMetaType::QString: - stream << *static_cast<const NS(QString)*>(data); - break; - case QMetaType::QStringList: - stream << *static_cast<const NS(QStringList)*>(data); - break; -#ifndef QT_BOOTSTRAPPED - case QMetaType::QBitArray: - stream << *static_cast<const NS(QBitArray)*>(data); - break; -#endif - case QMetaType::QDate: - stream << *static_cast<const NS(QDate)*>(data); - break; - case QMetaType::QTime: - stream << *static_cast<const NS(QTime)*>(data); - break; - case QMetaType::QDateTime: - stream << *static_cast<const NS(QDateTime)*>(data); - break; -#ifndef QT_BOOTSTRAPPED - case QMetaType::QUrl: - stream << *static_cast<const NS(QUrl)*>(data); - break; -#endif - case QMetaType::QLocale: - stream << *static_cast<const NS(QLocale)*>(data); - break; -#ifndef QT_NO_GEOM_VARIANT - case QMetaType::QRect: - stream << *static_cast<const NS(QRect)*>(data); - break; - case QMetaType::QRectF: - stream << *static_cast<const NS(QRectF)*>(data); - break; - case QMetaType::QSize: - stream << *static_cast<const NS(QSize)*>(data); - break; - case QMetaType::QSizeF: - stream << *static_cast<const NS(QSizeF)*>(data); - break; - case QMetaType::QLine: - stream << *static_cast<const NS(QLine)*>(data); - break; - case QMetaType::QLineF: - stream << *static_cast<const NS(QLineF)*>(data); - break; - case QMetaType::QPoint: - stream << *static_cast<const NS(QPoint)*>(data); - break; - case QMetaType::QPointF: - stream << *static_cast<const NS(QPointF)*>(data); - break; -#endif -#ifndef QT_NO_REGEXP - case QMetaType::QRegExp: - stream << *static_cast<const NS(QRegExp)*>(data); - break; -#endif -#if QT_CONFIG(regularexpression) - case QMetaType::QRegularExpression: - stream << *static_cast<const NS(QRegularExpression)*>(data); - break; -#endif // QT_CONFIG(regularexpression) -#ifndef QT_BOOTSTRAPPED - case QMetaType::QEasingCurve: - stream << *static_cast<const NS(QEasingCurve)*>(data); - break; - case QMetaType::QCborSimpleType: - stream << *static_cast<const quint8 *>(data); - break; -#endif // QT_BOOTSTRAPPED - case QMetaType::QFont: - case QMetaType::QPixmap: - case QMetaType::QBrush: - case QMetaType::QColor: - case QMetaType::QPalette: - case QMetaType::QImage: - case QMetaType::QPolygon: - case QMetaType::QPolygonF: - case QMetaType::QRegion: - case QMetaType::QBitmap: - case QMetaType::QCursor: - case QMetaType::QKeySequence: - case QMetaType::QPen: - case QMetaType::QTextLength: - case QMetaType::QTextFormat: - case QMetaType::QMatrix: - case QMetaType::QTransform: - case QMetaType::QMatrix4x4: - case QMetaType::QVector2D: - case QMetaType::QVector3D: - case QMetaType::QVector4D: - case QMetaType::QQuaternion: - case QMetaType::QIcon: - if (!qMetaTypeGuiHelper) - return false; - qMetaTypeGuiHelper[type - FirstGuiType].saveOp(stream, data); - break; - case QMetaType::QSizePolicy: - if (!qMetaTypeWidgetsHelper) - return false; - qMetaTypeWidgetsHelper[type - FirstWidgetsType].saveOp(stream, data); - break; - case QMetaType::QUuid: - stream << *static_cast<const NS(QUuid)*>(data); - break; - default: { + stream << qint8(*data); + return true; + } + bool delegate(const long *data) + { + stream << qlonglong(*data); + return true; + } + bool delegate(const unsigned long *data) + { + stream << qulonglong(*data); + return true; + } + bool delegate(const QMetaTypeSwitcher::NotBuiltinType *data) + { const QVector<QCustomTypeInfo> * const ct = customTypes(); if (!ct) return false; - - SaveOperator saveOp = 0; + QMetaType::SaveOperator saveOp = nullptr; { QReadLocker locker(customTypesLock()); - saveOp = ct->at(type - User).saveOp; + saveOp = ct->at(m_type - QMetaType::User).saveOp; } - if (!saveOp) return false; saveOp(stream, data); - break; } + return true; } + bool delegate(const void*) { return false; } + bool delegate(const QMetaTypeSwitcher::UnknownType*) { return false; } +}; +class LoadOperatorSwitch +{ +public: + QDataStream &stream; + int m_type; - return true; + template<typename T> + bool delegate(const T *data) + { + return FilteredOperatorSwitch<T>::load(stream, const_cast<T*>(data), m_type); + } + bool delegate(const char *data) + { + // force a char to be signed + qint8 c; + stream >> c; + *const_cast<char*>(data) = c; + return true; + } + bool delegate(const long *data) + { + qlonglong l; + stream >> l; + *const_cast<long*>(data) = l; + return true; + } + bool delegate(const unsigned long *data) + { + qlonglong l; + stream >> l; + *const_cast<unsigned long*>(data) = l; + return true; + } + bool delegate(const QMetaTypeSwitcher::NotBuiltinType *data) + { + const QVector<QCustomTypeInfo> * const ct = customTypes(); + if (!ct) + return false; + QMetaType::LoadOperator loadOp = nullptr; + { + QReadLocker locker(customTypesLock()); + loadOp = ct->at(m_type - QMetaType::User).loadOp; + } + if (!loadOp) + return false; + loadOp(stream, const_cast<QMetaTypeSwitcher::NotBuiltinType*>(data)); + return true; + } + bool delegate(const void*) { return false; } + bool delegate(const QMetaTypeSwitcher::UnknownType*) { return false; } +}; +} // namespace + +/*! + Writes the object pointed to by \a data with the ID \a type to + the given \a stream. Returns \c true if the object is saved + successfully; otherwise returns \c false. + + The type must have been registered with qRegisterMetaType() and + qRegisterMetaTypeStreamOperators() beforehand. + + Normally, you should not need to call this function directly. + Instead, use QVariant's \c operator<<(), which relies on save() + to stream custom types. + + \sa load(), qRegisterMetaTypeStreamOperators() +*/ +bool QMetaType::save(QDataStream &stream, int type, const void *data) +{ + if (!data) + return false; + SaveOperatorSwitch saveOp{stream, type}; + return QMetaTypeSwitcher::switcher<bool>(saveOp, type, data); } /*! @@ -1622,225 +1594,10 @@ bool QMetaType::save(QDataStream &stream, int type, const void *data) */ bool QMetaType::load(QDataStream &stream, int type, void *data) { - if (!data || !isRegistered(type)) - return false; - - switch(type) { - case QMetaType::UnknownType: - case QMetaType::Void: - case QMetaType::VoidStar: - case QMetaType::QObjectStar: -#if QT_CONFIG(itemmodel) - case QMetaType::QModelIndex: - case QMetaType::QPersistentModelIndex: -#endif - case QMetaType::QJsonValue: - case QMetaType::QJsonObject: - case QMetaType::QJsonArray: - case QMetaType::QJsonDocument: - case QMetaType::QCborValue: - case QMetaType::QCborArray: - case QMetaType::QCborMap: + if (!data) return false; - case QMetaType::Nullptr: - stream >> *static_cast<std::nullptr_t *>(data); - return true; - case QMetaType::Long: { - qlonglong l; - stream >> l; - *static_cast<long *>(data) = long(l); - break; } - case QMetaType::Int: - stream >> *static_cast<int *>(data); - break; - case QMetaType::Short: - stream >> *static_cast<short *>(data); - break; - case QMetaType::Char: - // force a char to be signed - stream >> *static_cast<signed char *>(data); - break; - case QMetaType::ULong: { - qulonglong ul; - stream >> ul; - *static_cast<ulong *>(data) = ulong(ul); - break; } - case QMetaType::UInt: - stream >> *static_cast<uint *>(data); - break; - case QMetaType::LongLong: - stream >> *static_cast<qlonglong *>(data); - break; - case QMetaType::ULongLong: - stream >> *static_cast<qulonglong *>(data); - break; - case QMetaType::UShort: - stream >> *static_cast<ushort *>(data); - break; - case QMetaType::SChar: - stream >> *static_cast<signed char *>(data); - break; - case QMetaType::UChar: - stream >> *static_cast<uchar *>(data); - break; - case QMetaType::Bool: { - qint8 b; - stream >> b; - *static_cast<bool *>(data) = b; - break; } - case QMetaType::Float: - stream >> *static_cast<float *>(data); - break; - case QMetaType::Double: - stream >> *static_cast<double *>(data); - break; - case QMetaType::QChar: - stream >> *static_cast< NS(QChar)*>(data); - break; -#ifndef QT_BOOTSTRAPPED - case QMetaType::QVariantMap: - stream >> *static_cast< NS(QVariantMap)*>(data); - break; - case QMetaType::QVariantHash: - stream >> *static_cast< NS(QVariantHash)*>(data); - break; - case QMetaType::QVariantList: - stream >> *static_cast< NS(QVariantList)*>(data); - break; - case QMetaType::QVariant: - stream >> *static_cast< NS(QVariant)*>(data); - break; - case QMetaType::QByteArrayList: - stream >> *static_cast< NS(QByteArrayList)*>(data); - break; -#endif - case QMetaType::QByteArray: - stream >> *static_cast< NS(QByteArray)*>(data); - break; - case QMetaType::QString: - stream >> *static_cast< NS(QString)*>(data); - break; - case QMetaType::QStringList: - stream >> *static_cast< NS(QStringList)*>(data); - break; -#ifndef QT_BOOTSTRAPPED - case QMetaType::QBitArray: - stream >> *static_cast< NS(QBitArray)*>(data); - break; -#endif - case QMetaType::QDate: - stream >> *static_cast< NS(QDate)*>(data); - break; - case QMetaType::QTime: - stream >> *static_cast< NS(QTime)*>(data); - break; - case QMetaType::QDateTime: - stream >> *static_cast< NS(QDateTime)*>(data); - break; -#ifndef QT_BOOTSTRAPPED - case QMetaType::QUrl: - stream >> *static_cast< NS(QUrl)*>(data); - break; -#endif - case QMetaType::QLocale: - stream >> *static_cast< NS(QLocale)*>(data); - break; -#ifndef QT_NO_GEOM_VARIANT - case QMetaType::QRect: - stream >> *static_cast< NS(QRect)*>(data); - break; - case QMetaType::QRectF: - stream >> *static_cast< NS(QRectF)*>(data); - break; - case QMetaType::QSize: - stream >> *static_cast< NS(QSize)*>(data); - break; - case QMetaType::QSizeF: - stream >> *static_cast< NS(QSizeF)*>(data); - break; - case QMetaType::QLine: - stream >> *static_cast< NS(QLine)*>(data); - break; - case QMetaType::QLineF: - stream >> *static_cast< NS(QLineF)*>(data); - break; - case QMetaType::QPoint: - stream >> *static_cast< NS(QPoint)*>(data); - break; - case QMetaType::QPointF: - stream >> *static_cast< NS(QPointF)*>(data); - break; -#endif -#ifndef QT_NO_REGEXP - case QMetaType::QRegExp: - stream >> *static_cast< NS(QRegExp)*>(data); - break; -#endif -#if QT_CONFIG(regularexpression) - case QMetaType::QRegularExpression: - stream >> *static_cast< NS(QRegularExpression)*>(data); - break; -#endif // QT_CONFIG(regularexpression) -#ifndef QT_BOOTSTRAPPED - case QMetaType::QEasingCurve: - stream >> *static_cast< NS(QEasingCurve)*>(data); - break; - case QMetaType::QCborSimpleType: - stream >> *static_cast<quint8 *>(data); - break; -#endif // QT_BOOTSTRAPPED - case QMetaType::QFont: - case QMetaType::QPixmap: - case QMetaType::QBrush: - case QMetaType::QColor: - case QMetaType::QPalette: - case QMetaType::QImage: - case QMetaType::QPolygon: - case QMetaType::QPolygonF: - case QMetaType::QRegion: - case QMetaType::QBitmap: - case QMetaType::QCursor: - case QMetaType::QKeySequence: - case QMetaType::QPen: - case QMetaType::QTextLength: - case QMetaType::QTextFormat: - case QMetaType::QMatrix: - case QMetaType::QTransform: - case QMetaType::QMatrix4x4: - case QMetaType::QVector2D: - case QMetaType::QVector3D: - case QMetaType::QVector4D: - case QMetaType::QQuaternion: - case QMetaType::QIcon: - if (!qMetaTypeGuiHelper) - return false; - qMetaTypeGuiHelper[type - FirstGuiType].loadOp(stream, data); - break; - case QMetaType::QSizePolicy: - if (!qMetaTypeWidgetsHelper) - return false; - qMetaTypeWidgetsHelper[type - FirstWidgetsType].loadOp(stream, data); - break; - case QMetaType::QUuid: - stream >> *static_cast< NS(QUuid)*>(data); - break; - default: { - const QVector<QCustomTypeInfo> * const ct = customTypes(); - if (!ct) - return false; - - LoadOperator loadOp = 0; - { - QReadLocker locker(customTypesLock()); - loadOp = ct->at(type - User).loadOp; - } - - if (!loadOp) - return false; - loadOp(stream, data); - break; } - } - return true; + LoadOperatorSwitch loadOp{stream, type}; + return QMetaTypeSwitcher::switcher<bool>(loadOp, type, data); } #endif // QT_NO_DATASTREAM diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index ed7feee775..a47fbfe28d 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -570,6 +570,7 @@ public: inline bool isValid() const; inline bool isRegistered() const; + inline int id() const; inline int sizeOf() const; inline TypeFlags flags() const; inline const QMetaObject *metaObject() const; @@ -1976,7 +1977,9 @@ QT_FOR_EACH_STATIC_WIDGETS_CLASS(QT_FORWARD_DECLARE_STATIC_TYPES_ITER) typedef QList<QVariant> QVariantList; typedef QMap<QString, QVariant> QVariantMap; typedef QHash<QString, QVariant> QVariantHash; -#ifndef Q_CLANG_QDOC +#ifdef Q_CLANG_QDOC +class QByteArrayList; +#else typedef QList<QByteArray> QByteArrayList; #endif @@ -2221,6 +2224,11 @@ inline bool QMetaType::isRegistered() const return isValid(); } +inline int QMetaType::id() const +{ + return m_typeId; +} + inline void *QMetaType::create(const void *copy) const { // ### TODO Qt6 remove the extension diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index 14af9ac8ef..d2a3d957e9 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -2144,7 +2144,8 @@ void QObject::removeEventFilter(QObject *obj) \fn void QObject::destroyed(QObject *obj) This signal is emitted immediately before the object \a obj is - destroyed, and can not be blocked. + destroyed, after any instances of QPointer have been notified, + and can not be blocked. All the objects's children are destroyed immediately after this signal is emitted. diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h index 6aea40cf4a..c4e1c69883 100644 --- a/src/corelib/kernel/qobject_p.h +++ b/src/corelib/kernel/qobject_p.h @@ -432,9 +432,9 @@ struct Q_CORE_EXPORT QAbstractDynamicMetaObject : public QDynamicMetaObjectData, { ~QAbstractDynamicMetaObject(); - virtual QAbstractDynamicMetaObject *toDynamicMetaObject(QObject *) override { return this; } + QAbstractDynamicMetaObject *toDynamicMetaObject(QObject *) override { return this; } virtual int createProperty(const char *, const char *) { return -1; } - virtual int metaCall(QObject *, QMetaObject::Call c, int _id, void **a) override + int metaCall(QObject *, QMetaObject::Call c, int _id, void **a) override { return metaCall(c, _id, a); } virtual int metaCall(QMetaObject::Call, int _id, void **) { return _id; } // Compat overload }; diff --git a/src/corelib/kernel/qsystemerror.cpp b/src/corelib/kernel/qsystemerror.cpp index 53c3136857..9d0394e4a5 100644 --- a/src/corelib/kernel/qsystemerror.cpp +++ b/src/corelib/kernel/qsystemerror.cpp @@ -152,10 +152,7 @@ QString QSystemError::string(ErrorScope errorScope, int errorCode) case NativeError: #if defined (Q_OS_WIN) return windowsErrorString(errorCode); -#else - //unix: fall through as native and standard library are the same - Q_FALLTHROUGH(); -#endif +#endif // else unix: native and standard library are the same case StandardLibraryError: return standardLibraryErrorString(errorCode); default: diff --git a/src/corelib/kernel/qtimer.cpp b/src/corelib/kernel/qtimer.cpp index 90f29aa630..2059aae3eb 100644 --- a/src/corelib/kernel/qtimer.cpp +++ b/src/corelib/kernel/qtimer.cpp @@ -585,29 +585,16 @@ void QTimer::singleShot(int msec, Qt::TimerType timerType, const QObject *receiv */ /*! - \fn template<typename Functor> QMetaObject::Connection callOnTimeout(QObject *context, Functor functor, Qt::ConnectionType connectionType = Qt::AutoConnection) + \fn template<typename Functor> QMetaObject::Connection callOnTimeout(QObject *context, Functor function, Qt::ConnectionType connectionType = Qt::AutoConnection) \since 5.12 \overload callOnTimeout() - Creates a connection from the timeout() signal to \a functor to be placed in a specific - event loop of \a context, and returns a handle to the connection. + Creates a connection from the timeout() signal to \a function, which could be a pointer + to a member function of \a context, or it could be a functor to be placed in a specific + event loop of \a context. It returns a handle to the connection. This method is provided for convenience. It's equivalent to calling - \c {QObject::connect(timer, &QTimer::timeout, context, functor, connectionType)}. - - \sa QObject::connect(), timeout() -*/ - -/*! - \fn template<typename PointerToMemberFunction> QMetaObject::Connection callOnTimeout(QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType connectionType = Qt::AutoConnection) - \since 5.12 - \overload callOnTimeout() - - Creates a connection from the timeout() signal to the \a method in the \a receiver object. Returns - a handle to the connection. - - This method is provided for convenience. It's equivalent to calling - \c {QObject::connect(timer, &QTimer::timeout, receiver, method, connectionType)}. + \c {QObject::connect(timer, &QTimer::timeout, context, function, connectionType)}. \sa QObject::connect(), timeout() */ diff --git a/src/corelib/kernel/qtimer.h b/src/corelib/kernel/qtimer.h index 66f317c567..9ff340854f 100644 --- a/src/corelib/kernel/qtimer.h +++ b/src/corelib/kernel/qtimer.h @@ -100,8 +100,6 @@ public: QMetaObject::Connection callOnTimeout(Functor slot, Qt::ConnectionType connectionType = Qt::AutoConnection); template <typename Functor> QMetaObject::Connection callOnTimeout(const QObject *context, Functor slot, Qt::ConnectionType connectionType = Qt::AutoConnection); - template <typename PointerToMemberFunction> - QMetaObject::Connection callOnTimeout(const QObject *receiver, PointerToMemberFunction slot, Qt::ConnectionType connectionType = Qt::AutoConnection); #else // singleShot to a QObject slot template <typename Duration, typename Func1> diff --git a/src/corelib/kernel/qvariant.h b/src/corelib/kernel/qvariant.h index ff73c27b6e..f95502e75f 100644 --- a/src/corelib/kernel/qvariant.h +++ b/src/corelib/kernel/qvariant.h @@ -55,6 +55,8 @@ #if QT_HAS_INCLUDE(<variant>) && __cplusplus >= 201703L #include <variant> +#elif defined(Q_CLANG_QDOC) +namespace std { template<typename...> struct variant; } #endif QT_BEGIN_NAMESPACE @@ -365,7 +367,7 @@ class Q_CORE_EXPORT QVariant static inline QVariant fromValue(const T &value) { return qVariantFromValue(value); } -#if defined(Q_CLANG_QDOC) || (QT_HAS_INCLUDE(<variant>) && __cplusplus >= 201703L) +#if QT_HAS_INCLUDE(<variant>) && __cplusplus >= 201703L template<typename... Types> static inline QVariant fromStdVariant(const std::variant<Types...> &value) { |