143 #include <QStringList>
144 #include <QTextStream>
148 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
150 #include <QRegularExpression>
151 #include <QStringView>
157 #include <QStringRef>
168 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
175 QRegularExpression::CaseInsensitiveOption;
177 QRegularExpression::DotMatchesEverythingOption;
179 QRegularExpression::MultilineOption;
184 return QRegularExpression(pattern);
190 const QRegularExpression& regex,
192 return str.split(regex, behavior);
201 constexpr Qt::CaseSensitivity CaseSensitive = Qt::CaseSensitive;
206 return QRegExp(pattern);
212 const QRegExp& regex,
214 return str.split(regex, behavior);
225 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
232 return QStringView(str);
237 return view.toString();
243 int n = -1) noexcept {
245 return QStringView(str).mid(pos);
247 return QStringView(str).mid(pos, n);
253 QStringView view(str);
255 while (start < view.length()) {
256 qsizetype end = view.indexOf(sep, start);
258 result.append(view.mid(start));
261 result.append(view.mid(start, end - start));
273 return QStringRef(&str);
278 return ref.toString();
283 return QStringRef(&str, pos, n < 0 ? str.length() - pos : n);
288 return str.splitRef(sep);
299 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
310 const QString& pattern,
312 return str.split(QRegularExpression(pattern), behavior);
324 const QString& pattern,
326 return str.split(QRegExp(pattern), behavior);
337 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
339 #define QTCOMPAT_FONTMETRICS_WIDTH(fm, text) (fm).horizontalAdvance(text)
342 #if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)
343 #define QTCOMPAT_FONTMETRICS_WIDTH(fm, text) (fm).horizontalAdvance(text)
345 #define QTCOMPAT_FONTMETRICS_WIDTH(fm, text) (fm).width(text)
356 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
362 const QRegularExpression& regex,
363 const QString& after) {
364 return str.replace(regex, after);
368 const QRegularExpression& regex,
369 const QString& after) {
371 result.replace(regex, after);
377 const QString& pattern,
378 const QString& after) {
379 return str.replace(QRegularExpression(pattern), after);
383 const QString& pattern,
384 const QString& after) {
386 result.replace(QRegularExpression(pattern), after);
395 const QRegExp& regex,
396 const QString& after) {
397 return str.replace(regex, after);
401 const QRegExp& regex,
402 const QString& after) {
404 result.replace(regex, after);
410 const QString& pattern,
411 const QString& after) {
412 return str.replace(QRegExp(pattern), after);
416 const QString& pattern,
417 const QString& after) {
419 result.replace(QRegExp(pattern), after);
442 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
444 #include <QRegularExpressionMatch>
447 const QString& str) {
448 return regex.match(str).hasMatch();
455 QRegularExpressionMatch match = regex.match(str,
offset);
456 return match.hasMatch() ? match.capturedStart() : -1;
461 int nth = 0) noexcept {
462 return match.capturedStart(nth);
468 return match.captured(nth);
473 const QRegularExpressionMatch& match) noexcept {
474 return match.capturedLength();
481 QRegularExpression m_regex;
482 mutable QRegularExpressionMatch m_lastMatch;
493 m_lastMatch = m_regex.match(str,
offset);
494 return m_lastMatch.hasMatch() ? m_lastMatch.capturedStart() : -1;
498 int pos(
int nth = 0) const noexcept {
499 return m_lastMatch.capturedStart(nth);
503 QString
cap(
int nth = 0)
const {
return m_lastMatch.captured(nth); }
509 const QRegularExpression&
regex() const noexcept {
return m_regex; }
512 operator const QRegularExpression&()
const noexcept {
return m_regex; }
518 return regex.indexIn(str) >= 0;
525 return regex.indexIn(str,
offset);
529 return regex.pos(nth);
533 return regex.cap(nth);
537 return regex.matchedLength();
543 mutable QRegExp m_regex;
553 return m_regex.indexIn(str,
offset);
556 int pos(
int nth = 0) const noexcept {
return m_regex.pos(nth); }
558 QString
cap(
int nth = 0)
const {
return m_regex.cap(nth); }
560 int matchedLength() const noexcept {
return m_regex.matchedLength(); }
562 const QRegExp&
regex() const noexcept {
return m_regex; }
564 operator const QRegExp&()
const noexcept {
return m_regex; }
575 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
577 #include <QByteArray>
578 #include <QStringConverter>
586 QStringConverter::Encoding m_encoding;
590 QStringConverter::Encoding encoding = QStringConverter::System)
591 : m_encoding(encoding) {}
595 QStringEncoder encoder(m_encoding);
596 if (!encoder.isValid()) {
598 encoder = QStringEncoder(QStringConverter::Utf8);
600 auto result = encoder.encode(str);
601 if (encoder.hasError()) {
603 QStringEncoder utf8Encoder(QStringConverter::Utf8);
604 return utf8Encoder.encode(str);
611 QStringDecoder decoder(m_encoding);
612 if (!decoder.isValid()) {
614 decoder = QStringDecoder(QStringConverter::Utf8);
618 ba = QByteArray(chars);
620 ba = QByteArray(chars, len);
622 auto result = decoder.decode(ba);
623 if (decoder.hasError()) {
625 QStringDecoder utf8Decoder(QStringConverter::Utf8);
626 return utf8Decoder.decode(ba);
633 QStringDecoder decoder(m_encoding);
634 if (!decoder.isValid()) {
636 decoder = QStringDecoder(QStringConverter::Utf8);
638 auto result = decoder.decode(ba);
639 if (decoder.hasError()) {
641 QStringDecoder utf8Decoder(QStringConverter::Utf8);
642 return utf8Decoder.decode(ba);
662 QString nameStr = QString::fromLatin1(
name).toLower();
665 if (nameStr ==
"utf-8" || nameStr ==
"utf8") {
668 }
else if (nameStr ==
"utf-16" || nameStr ==
"utf16") {
671 }
else if (nameStr ==
"utf-16le" || nameStr ==
"utf16le") {
673 return &utf16leCodec;
674 }
else if (nameStr ==
"utf-16be" || nameStr ==
"utf16be") {
676 return &utf16beCodec;
677 }
else if (nameStr ==
"latin1" || nameStr ==
"iso-8859-1") {
693 #include <QTextCodec>
715 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
718 inline QTextStream&
endl(QTextStream& stream) {
return Qt::endl(stream); }
721 #define QTCOMPAT_ENDL Qt::endl
726 inline QTextStream&
endl(QTextStream& stream) {
727 stream << QLatin1Char(
'\n');
734 #define QTCOMPAT_ENDL QtCompat::endl
748 #include <QWheelEvent>
752 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
753 return static_cast<double>(
event->angleDelta().y());
755 return static_cast<double>(
event->delta());
761 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
762 return event->position();
764 return QPointF(
event->pos());
776 #include <QMouseEvent>
780 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
781 return event->position();
783 return QPointF(
event->pos());
789 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
790 return event->globalPosition();
792 return QPointF(
event->globalPos());
798 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
799 return event->position().toPoint();
808 const QMouseEvent*
event) noexcept {
809 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
810 return event->globalPosition().toPoint();
812 return event->globalPos();
823 #include <QDropEvent>
827 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
828 return event->position();
830 return QPointF(
event->pos());
836 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
837 return event->position().toPoint();
850 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
853 template <
typename Key,
typename T>
859 map->insert(key, value);
863 template <
typename Key,
typename T>
867 map->insert(key, value);
871 template <
typename Key,
typename T>
877 template <
typename Key,
typename T>
884 template <
typename Key,
typename T>
886 map->insertMulti(key, value);
889 template <
typename Key,
typename T>
893 map->insert(key, value);
896 template <
typename Key,
typename T>
901 template <
typename Key,
typename T>
902 void qtCompatMapUnite(QMultiMap<Key, T>* map,
const QMultiMap<Key, T>& other) {
916 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
921 return static_cast<QMetaType::Type
>(var.typeId());
925 return var.isValid();
934 return var.typeId() == QMetaType::QString;
938 return var.typeId() == QMetaType::Int;
942 return var.typeId() == QMetaType::Double;
950 return var.typeId() == QMetaType::QVariantList;
954 return var.typeId() == QMetaType::QVariantMap;
966 return var.isValid();
975 return var.type() == QVariant::String;
979 return var.type() == QVariant::Int;
983 return var.type() == QVariant::Double;
991 return var.type() == QVariant::List;
995 return var.type() == QVariant::Map;
1007 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
1009 #include <QPlainTextEdit>
1011 edit->setTabStopDistance(
static_cast<qreal
>(
width));
1015 #include <QPlainTextEdit>
1016 #if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
1019 edit->setTabStopDistance(
static_cast<qreal
>(
width));
1024 edit->setTabStopWidth(
width);
1038 template <
typename T>
1040 #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
1042 return QSet<T>(vec.begin(), vec.end());
1046 result.reserve(vec.size());
1047 for (
const T& item : vec) {
1055 template <
typename T>
1057 #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
1059 return QVector<T>(set.begin(), set.end());
1063 result.reserve(set.size());
1064 for (
const T& item : set) {
1072 template <
typename T>
1077 template <
typename T>
void qtCompatSetTabStopWidth(QPlainTextEdit *edit, int width)
QPointF qtCompatWheelEventPos(const QWheelEvent *event) noexcept
QStringList qtCompatSplitRegex(const QString &str, const QString &pattern, Qt::SplitBehavior behavior=Qt::KeepEmptyParts)
QtCompatTextCodec * qtCompatCodecForName(const char *name)
QPointF qtCompatDropEventPos(const QDropEvent *event) noexcept
QtCompatTextCodec * qtCompatCodecForLocale()
QList< QStringView > QtCompatStringRefList
bool qtCompatVariantIsNull(const QVariant &var) noexcept
QMetaType::Type QtCompatVariantType
QSet< T > qtCompatQSetFromVector(const QVector< T > &vec)
int qtCompatRegExpIndexIn(const QRegularExpression ®ex, const QString &str, int offset=0)
QtCompatStringRefList qtCompatSplitRef(const QString &str, QChar sep)
QString qtCompatRegExpCap(const QRegularExpressionMatch &match, int nth=0)
QString qtCompatStringRefToString(const QStringView &view)
QStringView QtCompatStringRef
void qtCompatMapInsertMulti(QMap< Key, T > *map, const Key &key, const T &value)
int qtCompatRegExpPos(const QRegularExpressionMatch &match, int nth=0) noexcept
QPoint qtCompatMouseEventPosInt(const QMouseEvent *event) noexcept
QString & qtCompatReplace(QString &str, const QRegularExpression ®ex, const QString &after)
bool qtCompatVariantIsString(const QVariant &var) noexcept
QtCompatStringRefList qtCompatSplitRefChar(const QString &str, QChar sep)
QSet< T > qSetFromVector(const QVector< T > &vec)
double qtCompatWheelEventDelta(const QWheelEvent *event) noexcept
QPointF qtCompatMouseEventPos(const QMouseEvent *event) noexcept
bool qtCompatVariantIsDouble(const QVariant &var) noexcept
int qtCompatRegExpMatchedLength(const QRegularExpressionMatch &match) noexcept
QMetaType::Type qtCompatVariantType(const QVariant &var) noexcept
QStringList qtCompatSplit(const QString &str, const QRegularExpression ®ex, Qt::SplitBehavior behavior=Qt::KeepEmptyParts)
void qtCompatMapUnite(QMap< Key, T > *map, const QMap< Key, T > &other)
QVector< T > qVectorFromSet(const QSet< T > &set)
QRegularExpression qtCompatRegExp(const QString &pattern)
QVector< T > qtCompatQVectorFromSet(const QSet< T > &set)
QPoint qtCompatMouseEventGlobalPosInt(const QMouseEvent *event) noexcept
bool qtCompatVariantIsList(const QVariant &var) noexcept
QRegularExpression QtCompatRegExp
bool qtCompatVariantIsMap(const QVariant &var) noexcept
QStringView qtCompatStringRef(const QString &str) noexcept
QPointF qtCompatMouseEventGlobalPos(const QMouseEvent *event) noexcept
bool qtCompatVariantIsInt(const QVariant &var) noexcept
QPoint qtCompatDropEventPosInt(const QDropEvent *event) noexcept
bool qtCompatVariantIsBool(const QVariant &var) noexcept
bool qtCompatVariantIsValid(const QVariant &var) noexcept
bool qtCompatRegExpMatch(const QRegularExpression ®ex, const QString &str)
static QTextCodec * codecForName(const char *name)
static QTextCodec * codecForLocale()
int indexIn(const QString &str, int offset=0) const
QtCompatRegExpWrapper()=default
QString cap(int nth=0) const
QtCompatRegExpWrapper(const QString &pattern)
int pos(int nth=0) const noexcept
int matchedLength() const noexcept
const QRegularExpression & regex() const noexcept
QtCompatRegExpWrapper(const QRegularExpression ®ex)
QString toUnicode(const char *chars, int len=-1)
QString toUnicode(const QByteArray &ba)
QtCompatTextCodec(QStringConverter::Encoding encoding=QStringConverter::System)
QByteArray fromUnicode(const QString &str)
constexpr QRegularExpression::PatternOption Multiline
constexpr QRegularExpression::PatternOption DotMatchesEverything
constexpr QRegularExpression::PatternOption CaseInsensitive
constexpr Qt::SplitBehavior SkipEmptyParts
QTextStream & endl(QTextStream &stream)
constexpr Qt::SplitBehavior KeepEmptyParts