diff options
51 files changed, 330 insertions, 404 deletions
diff --git a/src/corelib/global/qtenvironmentvariables.cpp b/src/corelib/global/qtenvironmentvariables.cpp index 4c0b4765717..7dba83607d2 100644 --- a/src/corelib/global/qtenvironmentvariables.cpp +++ b/src/corelib/global/qtenvironmentvariables.cpp @@ -401,26 +401,24 @@ bool qLocalTime(time_t utc, struct tm *local) */ QString qTzName(int dstIndex) { + Q_DECL_UNINITIALIZED char name[512]; bool ok; size_t size = 0; -#if defined(_UCRT) // i.e., MSVC and MinGW-UCRT { const auto locker = qt_scoped_lock(environmentMutex); +#if defined(_UCRT) // i.e., MSVC and MinGW-UCRT ok = _get_tzname(&size, name, sizeof(name), dstIndex) == 0; size -= 1; // It includes space for '\0' (or !ok => we're going to ignore it). Q_ASSERT(!ok || size < sizeof(name)); - } #else - { - const auto locker = qt_scoped_lock(environmentMutex); const char *const src = tzname[dstIndex]; - size = strlen(src); + size = src ? strlen(src) : 0; ok = src != nullptr && size < sizeof(name); if (ok) memcpy(name, src, size + 1); - } #endif // _UCRT + } return ok ? QString::fromLocal8Bit(name, qsizetype(size)) : QString(); } diff --git a/src/corelib/itemmodels/qrangemodel.h b/src/corelib/itemmodels/qrangemodel.h index 52038ed2541..a73f0e2c53c 100644 --- a/src/corelib/itemmodels/qrangemodel.h +++ b/src/corelib/itemmodels/qrangemodel.h @@ -115,10 +115,6 @@ void QRangeModelImplBase::changePersistentIndexList(const QModelIndexList &from, { m_rangeModel->changePersistentIndexList(from, to); } -QHash<int, QByteArray> QRangeModelImplBase::roleNames() const -{ - return m_rangeModel->roleNames(); -} void QRangeModelImplBase::dataChanged(const QModelIndex &from, const QModelIndex &to, const QList<int> &roles) { diff --git a/src/corelib/itemmodels/qrangemodel_impl.h b/src/corelib/itemmodels/qrangemodel_impl.h index 0328a27c7ca..4dfc07be37d 100644 --- a/src/corelib/itemmodels/qrangemodel_impl.h +++ b/src/corelib/itemmodels/qrangemodel_impl.h @@ -716,7 +716,6 @@ protected: inline QModelIndex createIndex(int row, int column, const void *ptr = nullptr) const; inline void changePersistentIndexList(const QModelIndexList &from, const QModelIndexList &to); - inline QHash<int, QByteArray> roleNames() const; inline void dataChanged(const QModelIndex &from, const QModelIndex &to, const QList<int> &roles); inline void beginInsertColumns(const QModelIndex &parent, int start, int count); diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp index 965e1b57ce6..f19970b52d1 100644 --- a/src/corelib/kernel/qmetaobject.cpp +++ b/src/corelib/kernel/qmetaobject.cpp @@ -1391,7 +1391,7 @@ static const char *qNormalizeType(QByteArrayView in, int &templdepth, QByteArray return next; } - result += normalizeTypeInternal(t, d); + normalizeTypeInternal(QByteArrayView{t, d}, result); return d; } diff --git a/src/corelib/kernel/qmetaobject_moc_p.h b/src/corelib/kernel/qmetaobject_moc_p.h index ad8c6f92d60..b0867af0cea 100644 --- a/src/corelib/kernel/qmetaobject_moc_p.h +++ b/src/corelib/kernel/qmetaobject_moc_p.h @@ -17,20 +17,32 @@ // #include <QtCore/qbytearray.h> +#include <QtCore/qmetatype.h> #include <QtCore/private/qglobal_p.h> QT_BEGIN_NAMESPACE +static void normalizeTypeInternal(QByteArrayView in, QByteArray &appendTo); + // This function is shared with moc.cpp. This file should be included where needed. static QByteArray normalizeTypeInternal(const char *t, const char *e) { + QByteArrayView in{t, e}; + QByteArray appendTo; + normalizeTypeInternal(in, appendTo); + return appendTo; +} + +static void normalizeTypeInternal(QByteArrayView in, QByteArray &appendTo) +{ + const char *t = in.begin(); + const char *e = in.end(); int len = QtPrivate::qNormalizeType(t, e, nullptr); if (len == 0) - return QByteArray(); - QByteArray result(len, Qt::Uninitialized); - len = QtPrivate::qNormalizeType(t, e, result.data()); - Q_ASSERT(len == result.size()); - return result; + return; + qsizetype oldLen = appendTo.size(); + appendTo.resize(appendTo.size() + len); + QtPrivate::qNormalizeType(t, e, appendTo.begin() + oldLen); } QT_END_NAMESPACE diff --git a/src/corelib/text/qchar.cpp b/src/corelib/text/qchar.cpp index 052dba39e9c..d7006281614 100644 --- a/src/corelib/text/qchar.cpp +++ b/src/corelib/text/qchar.cpp @@ -830,8 +830,9 @@ bool QChar::isPrint(char32_t ucs4) noexcept */ bool QT_FASTCALL QChar::isSpace_helper(char32_t ucs4) noexcept { - if (ucs4 > LastValidCodePoint) + if (ucs4 > MaxSeparatorCodepoint) return false; + const int test = FLAG(Separator_Space) | FLAG(Separator_Line) | FLAG(Separator_Paragraph); diff --git a/src/corelib/text/qlocale.cpp b/src/corelib/text/qlocale.cpp index f5ff0686454..dec5b6fd33e 100644 --- a/src/corelib/text/qlocale.cpp +++ b/src/corelib/text/qlocale.cpp @@ -3313,20 +3313,7 @@ static QString rawMonthName(const QCalendarLocale &localeData, const char16_t *monthsData, int month, QLocale::FormatType type) { - QLocaleData::DataRange range; - switch (type) { - case QLocale::LongFormat: - range = localeData.longMonth(); - break; - case QLocale::ShortFormat: - range = localeData.shortMonth(); - break; - case QLocale::NarrowFormat: - range = localeData.narrowMonth(); - break; - default: - return QString(); - } + const QLocaleData::DataRange range = localeData.monthName(type); return range.getListEntry(monthsData, month - 1); } @@ -3338,22 +3325,10 @@ static QString rawStandaloneMonthName(const QCalendarLocale &localeData, const char16_t *monthsData, int month, QLocale::FormatType type) { - QLocaleData::DataRange range; - switch (type) { - case QLocale::LongFormat: - range = localeData.longMonthStandalone(); - break; - case QLocale::ShortFormat: - range = localeData.shortMonthStandalone(); - break; - case QLocale::NarrowFormat: - range = localeData.narrowMonthStandalone(); - break; - default: - return QString(); - } - QString name = range.getListEntry(monthsData, month - 1); - return name.isEmpty() ? rawMonthName(localeData, monthsData, month, type) : name; + const QLocaleData::DataRange range = localeData.standaloneMonthName(type); + if (QString name = range.getListEntry(monthsData, month - 1); !name.isEmpty()) + return name; + return rawMonthName(localeData, monthsData, month, type); } /*! @@ -4021,7 +3996,9 @@ QString QCalendarBackend::dateTimeToString(QStringView format, const QDateTime & text = when.toOffsetFromUtc(when.offsetFromUtc()).timeZoneAbbreviation(); if (text.isEmpty()) // Notably including type != Offset text = when.timeZoneAbbreviation(); - return type == Offset ? offsetFromAbbreviation(std::move(text)) : text; + if (type == Offset) + text = offsetFromAbbreviation(std::move(text)); + return text; }; used = true; diff --git a/src/corelib/text/qunicodetables.cpp b/src/corelib/text/qunicodetables.cpp index cf4fdb199ea..fd491532f1a 100644 --- a/src/corelib/text/qunicodetables.cpp +++ b/src/corelib/text/qunicodetables.cpp @@ -8,6 +8,7 @@ QT_BEGIN_NAMESPACE namespace QUnicodeTables { +static constexpr char32_t MaxSeparatorCodepoint = 0x3000; static constexpr unsigned short uc_property_trie[] = { // [0x0..0x11000) diff --git a/src/corelib/time/qcalendarbackend_p.h b/src/corelib/time/qcalendarbackend_p.h index 15e07957552..ba586114b89 100644 --- a/src/corelib/time/qcalendarbackend_p.h +++ b/src/corelib/time/qcalendarbackend_p.h @@ -34,13 +34,27 @@ class QCalendarRegistry; struct QCalendarLocale { quint16 m_language_id, m_script_id, m_territory_id; -#define rangeGetter(name) \ - QLocaleData::DataRange name() const { return { m_ ## name ## _idx, m_ ## name ## _size }; } - - rangeGetter(longMonthStandalone) rangeGetter(longMonth) - rangeGetter(shortMonthStandalone) rangeGetter(shortMonth) - rangeGetter(narrowMonthStandalone) rangeGetter(narrowMonth) -#undef rangeGetter +#define CASE(E, member) case QLocale::FormatType::E: \ + return { m_ ## member ## _idx, m_ ## member ## _size } + QLocaleData::DataRange monthName(QLocale::FormatType type) const + { + switch (type) { + CASE(LongFormat, longMonth); + CASE(ShortFormat, shortMonth); + CASE(NarrowFormat, narrowMonth); + } + Q_UNREACHABLE_RETURN({}); + } + QLocaleData::DataRange standaloneMonthName(QLocale::FormatType type) const + { + switch (type) { + CASE(LongFormat, longMonthStandalone); + CASE(ShortFormat, shortMonthStandalone); + CASE(NarrowFormat, narrowMonthStandalone); + } + Q_UNREACHABLE_RETURN({}); + } +#undef CASE // Month name indexes: quint16 m_longMonthStandalone_idx, m_longMonth_idx; diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp index 9450668d820..6d4c93b2553 100644 --- a/src/gui/image/qimage.cpp +++ b/src/gui/image/qimage.cpp @@ -6168,7 +6168,7 @@ static constexpr QPixelFormat pixelformats[] = { /*FIFTH*/ 0, /*ALPHA*/ 4, /*ALPHA USAGE*/ QPixelFormat::UsesAlpha, - /*ALPHA POSITION*/ QPixelFormat::AtEnd, + /*ALPHA POSITION*/ QPixelFormat::AtBeginning, /*PREMULTIPLIED*/ QPixelFormat::Premultiplied, /*INTERPRETATION*/ QPixelFormat::UnsignedShort, /*BYTE ORDER*/ QPixelFormat::CurrentSystemEndian), diff --git a/src/gui/image/qimage_darwin.mm b/src/gui/image/qimage_darwin.mm index 049fbb3a60a..69488366b8a 100644 --- a/src/gui/image/qimage_darwin.mm +++ b/src/gui/image/qimage_darwin.mm @@ -6,6 +6,8 @@ #include <private/qcore_mac_p.h> #include <private/qcoregraphics_p.h> +#include <QtGui/qcolorspace.h> + #import <Foundation/Foundation.h> #import <CoreGraphics/CoreGraphics.h> @@ -56,7 +58,8 @@ QT_BEGIN_NAMESPACE convert the QImage to a supported format first, for example Format_ARGB32_Premultiplied. - The CGImageRef color space is set to the sRGB color space. + If the image does not have a color space set the resulting + CGImageRef color space is set to the sRGB color space. \ingroup platform-type-conversions */ @@ -77,7 +80,14 @@ CGImageRef QImage::toCGImage() const QCFType<CGDataProviderRef> dataProvider = CGDataProviderCreateWithData(new QImage(*this), bits(), sizeInBytes(), deleter); - QCFType<CGColorSpaceRef> colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB); + QCFType<CGColorSpaceRef> cgColorSpace = [&]{ + if (colorSpace().isValid()) { + QCFType<CFDataRef> iccData = colorSpace().iccProfile().toCFData(); + return CGColorSpaceCreateWithICCData(iccData); + } else { + return CGColorSpaceCreateWithName(kCGColorSpaceSRGB); + } + }(); const size_t bitsPerComponent = 8; const size_t bitsPerPixel = 32; @@ -85,7 +95,7 @@ CGImageRef QImage::toCGImage() const const bool shouldInterpolate = false; return CGImageCreate(width(), height(), bitsPerComponent, bitsPerPixel, - this->bytesPerLine(), colorSpace, bitmapInfo, dataProvider, + this->bytesPerLine(), cgColorSpace, bitmapInfo, dataProvider, decode, shouldInterpolate, kCGRenderingIntentDefault); } diff --git a/src/gui/kernel/qtestsupport_gui.cpp b/src/gui/kernel/qtestsupport_gui.cpp index ba247800e7b..dd50d0489b7 100644 --- a/src/gui/kernel/qtestsupport_gui.cpp +++ b/src/gui/kernel/qtestsupport_gui.cpp @@ -59,7 +59,12 @@ bool QTest::qWaitForWindowActive(QWindow *window, QDeadlineTimer timeout) << "Falling back to qWaitForWindowExposed."; return qWaitForWindowExposed(window, timeout); } - return QTest::qWaitFor([&]() { return window->isActive(); }, timeout); + return QTest::qWaitFor([wp = QPointer(window)]() { + if (QWindow *w = wp.data(); !w) + return false; + else + return w->isActive(); + }, timeout); } /*! @@ -91,7 +96,12 @@ bool QTest::qWaitForWindowActive(QWindow *window) */ Q_GUI_EXPORT bool QTest::qWaitForWindowFocused(QWindow *window, QDeadlineTimer timeout) { - return QTest::qWaitFor([&]() { return qGuiApp->focusWindow() == window; }, timeout); + return QTest::qWaitFor([wp = QPointer(window)]() { + if (QWindow *w = wp.data(); !w) + return false; + else + return qGuiApp->focusWindow() == w; + }, timeout); } /*! @@ -132,7 +142,12 @@ bool QTest::qWaitForWindowExposed(QWindow *window, int timeout) */ bool QTest::qWaitForWindowExposed(QWindow *window, QDeadlineTimer timeout) { - return QTest::qWaitFor([&]() { return window->isExposed(); }, timeout); + return QTest::qWaitFor([wp = QPointer(window)]() { + if (QWindow *w = wp.data(); !w) + return false; + else + return w->isExposed(); + }, timeout); } /*! diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp index cd9b85df20b..419e6642d17 100644 --- a/src/gui/text/qtextengine.cpp +++ b/src/gui/text/qtextengine.cpp @@ -1368,6 +1368,9 @@ void QTextEngine::shapeText(int item) const si.glyph_data_offset = layoutData->used; const ushort *string = reinterpret_cast<const ushort *>(layoutData->string.constData()) + si.position; + const ushort *baseString = reinterpret_cast<const ushort *>(layoutData->string.constData()); + int baseStringStart = si.position; + int baseStringLength = layoutData->string.length(); const int itemLength = length(item); QString casedString; @@ -1393,6 +1396,9 @@ void QTextEngine::shapeText(int item) const } } string = reinterpret_cast<const ushort *>(casedString.constData()); + baseString = string; + baseStringStart = 0; + baseStringLength = casedString.length(); } if (Q_UNLIKELY(!ensureSpace(itemLength))) { @@ -1486,14 +1492,9 @@ void QTextEngine::shapeText(int item) const #if QT_CONFIG(harfbuzz) if (Q_LIKELY(shapingEnabled)) { - si.num_glyphs = shapeTextWithHarfbuzzNG(si, - string, - itemLength, - fontEngine, - itemBoundaries, - kerningEnabled, - letterSpacing != 0, - features); + si.num_glyphs = shapeTextWithHarfbuzzNG(si, baseString, baseStringStart, baseStringLength, + itemLength, fontEngine, itemBoundaries, + kerningEnabled, letterSpacing != 0, features); } else #endif { @@ -1603,13 +1604,10 @@ QT_BEGIN_INCLUDE_NAMESPACE QT_END_INCLUDE_NAMESPACE -int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si, - const ushort *string, - int itemLength, - QFontEngine *fontEngine, - QSpan<uint> itemBoundaries, - bool kerningEnabled, - bool hasLetterSpacing, +int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si, const ushort *string, + int stringBaseIndex, int stringLength, int itemLength, + QFontEngine *fontEngine, QSpan<uint> itemBoundaries, + bool kerningEnabled, bool hasLetterSpacing, const QHash<QFont::Tag, quint32> &fontFeatures) const { uint glyphs_shaped = 0; @@ -1642,7 +1640,12 @@ int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si, // prepare buffer hb_buffer_clear_contents(buffer); - hb_buffer_add_utf16(buffer, reinterpret_cast<const uint16_t *>(string) + item_pos, item_length, 0, item_length); + + // Populate the buffer using the base string pointer and length, so HarfBuzz can grab an + // enclosing context for proper shaping at item boundaries in certain languages (e.g. + // Arabic). + hb_buffer_add_utf16(buffer, reinterpret_cast<const uint16_t *>(string), stringLength, + stringBaseIndex + item_pos, item_length); hb_buffer_set_segment_properties(buffer, &props); @@ -1746,7 +1749,7 @@ int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si, last_glyph_pos = i + glyphs_shaped; last_cluster = cluster; - applyVisibilityRules(string[item_pos + str_pos], &g, i, actualFontEngine); + applyVisibilityRules(string[stringBaseIndex + item_pos + str_pos], &g, i, actualFontEngine); } } while (str_pos < item_length) diff --git a/src/gui/text/qtextengine_p.h b/src/gui/text/qtextengine_p.h index 872426dfc08..dffbc129b3a 100644 --- a/src/gui/text/qtextengine_p.h +++ b/src/gui/text/qtextengine_p.h @@ -620,12 +620,9 @@ private: void addRequiredBoundaries() const; void shapeText(int item) const; #if QT_CONFIG(harfbuzz) - int shapeTextWithHarfbuzzNG(const QScriptItem &si, - const ushort *string, - int itemLength, - QFontEngine *fontEngine, - QSpan<uint> itemBoundaries, - bool kerningEnabled, + int shapeTextWithHarfbuzzNG(const QScriptItem &si, const ushort *string, int stringBaseIndex, + int stringLength, int itemLength, QFontEngine *fontEngine, + QSpan<uint> itemBoundaries, bool kerningEnabled, bool hasLetterSpacing, const QHash<QFont::Tag, quint32> &features) const; #endif diff --git a/src/plugins/platforms/wasm/qwasminputcontext.h b/src/plugins/platforms/wasm/qwasminputcontext.h index 6d24c7fea0d..43d688e8037 100644 --- a/src/plugins/platforms/wasm/qwasminputcontext.h +++ b/src/plugins/platforms/wasm/qwasminputcontext.h @@ -48,10 +48,6 @@ public: void updateGeometry(); - bool isActive() const { - return m_focusObject && m_inputMethodAccepted; - } - private: void updateInputElement(); diff --git a/src/plugins/platforms/wasm/qwasmwindow.cpp b/src/plugins/platforms/wasm/qwasmwindow.cpp index d27385be723..853e7771de9 100644 --- a/src/plugins/platforms/wasm/qwasmwindow.cpp +++ b/src/plugins/platforms/wasm/qwasmwindow.cpp @@ -645,7 +645,7 @@ void QWasmWindow::handleKeyEvent(const KeyEvent &event) { qCDebug(qLcQpaWasmInputContext) << "handleKeyEvent"; - if (QWasmInputContext *inputContext = QWasmIntegration::get()->wasmInputContext(); inputContext->isActive()) { + if ((event.webEvent["target"] == m_inputElement) && QWasmIntegration::get()->wasmInputContext()) { handleKeyForInputContextEvent(event); } else { if (processKey(event)) { @@ -758,26 +758,38 @@ bool QWasmWindow::processKeyForInputContext(const KeyEvent &event) void QWasmWindow::handleInputEvent(emscripten::val event) { - if (QWasmInputContext *inputContext = QWasmIntegration::get()->wasmInputContext(); inputContext->isActive()) + if (QWasmInputContext *inputContext = QWasmIntegration::get()->wasmInputContext(); event["target"] == m_inputElement) inputContext->inputCallback(event); + + if (event["target"] == m_focusHelper) + m_focusHelper.set("innerHTML", std::string()); } void QWasmWindow::handleCompositionStartEvent(emscripten::val event) { - if (QWasmInputContext *inputContext = QWasmIntegration::get()->wasmInputContext(); inputContext->isActive()) + if (QWasmInputContext *inputContext = QWasmIntegration::get()->wasmInputContext(); event["target"] == m_inputElement) inputContext->compositionStartCallback(event); + + if (event["target"] == m_focusHelper) + m_focusHelper.set("innerHTML", std::string()); } void QWasmWindow::handleCompositionUpdateEvent(emscripten::val event) { - if (QWasmInputContext *inputContext = QWasmIntegration::get()->wasmInputContext(); inputContext->isActive()) + if (QWasmInputContext *inputContext = QWasmIntegration::get()->wasmInputContext(); event["target"] == m_inputElement) inputContext->compositionUpdateCallback(event); + + if (event["target"] == m_focusHelper) + m_focusHelper.set("innerHTML", std::string()); } void QWasmWindow::handleCompositionEndEvent(emscripten::val event) { - if (QWasmInputContext *inputContext = QWasmIntegration::get()->wasmInputContext(); inputContext->isActive()) + if (QWasmInputContext *inputContext = QWasmIntegration::get()->wasmInputContext(); event["target"] == m_inputElement) inputContext->compositionEndCallback(event); + + if (event["target"] == m_focusHelper) + m_focusHelper.set("innerHTML", std::string()); } void QWasmWindow::handlePointerEnterLeaveEvent(const PointerEvent &event) diff --git a/src/plugins/styles/modernwindows/qwindows11style.cpp b/src/plugins/styles/modernwindows/qwindows11style.cpp index de94f11937b..3c28113b2cc 100644 --- a/src/plugins/styles/modernwindows/qwindows11style.cpp +++ b/src/plugins/styles/modernwindows/qwindows11style.cpp @@ -848,17 +848,6 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption painter->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius); - if (!option->palette.isBrushSet(QPalette::Current, QPalette::Button)) { - painter->setPen(Qt::NoPen); - if (!isRaised) - painter->setBrush(WINUI3Colors[colorSchemeIndex][controlFillTertiary]); - else if (isMouseOver) - painter->setBrush(WINUI3Colors[colorSchemeIndex][controlFillSecondary]); - else - painter->setBrush(option->palette.button()); - painter->drawRoundedRect(rect, secondLevelRoundingRadius, - secondLevelRoundingRadius); - } if (isRaised) { const qreal sublineOffset = secondLevelRoundingRadius - 0.5; painter->setPen(WINUI3Colors[colorSchemeIndex][controlStrokeSecondary]); @@ -1122,7 +1111,7 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op rect.translate(shiftX, shiftY); painter->setFont(toolbutton->font); const QString text = d->toolButtonElideText(toolbutton, rect, alignment); - painter->setPen(buttonLabelColor(option, colorSchemeIndex)); + painter->setPen(buttonLabelColor(option)); proxy()->drawItemText(painter, rect, alignment, toolbutton->palette, toolbutton->state & State_Enabled, text); } else { @@ -1173,7 +1162,7 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op } tr.translate(shiftX, shiftY); const QString text = d->toolButtonElideText(toolbutton, tr, alignment); - painter->setPen(buttonLabelColor(option, colorSchemeIndex)); + painter->setPen(buttonLabelColor(option)); proxy()->drawItemText(painter, QStyle::visualRect(toolbutton->direction, rect, tr), alignment, toolbutton->palette, toolbutton->state & State_Enabled, text); } else { @@ -1381,7 +1370,7 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op tf |= Qt::AlignHCenter; } - painter->setPen(buttonLabelColor(option, colorSchemeIndex)); + painter->setPen(buttonLabelColor(option)); proxy()->drawItemText(painter, textRect, tf, option->palette,btn->state & State_Enabled, btn->text); } break; @@ -2332,19 +2321,19 @@ QBrush QWindows11Style::buttonFillBrush(const QStyleOption *option) return brush; } -QColor QWindows11Style::buttonLabelColor(const QStyleOption *option, int colorSchemeIndex) +QColor QWindows11Style::buttonLabelColor(const QStyleOption *option) const { if (option->palette.isBrushSet(QPalette::Current, QPalette::ButtonText)) return option->palette.buttonText().color(); const bool isOn = option->state & QStyle::State_On; if (option->state & QStyle::State_Sunken) - return isOn ? WINUI3Colors[colorSchemeIndex][textOnAccentSecondary] - : WINUI3Colors[colorSchemeIndex][controlTextSecondary]; + return isOn ? winUI3Color(textOnAccentSecondary) + : winUI3Color(controlTextSecondary); if (!(option->state & QStyle::State_Enabled)) - return isOn ? WINUI3Colors[colorSchemeIndex][textAccentDisabled] + return isOn ? winUI3Color(textAccentDisabled) : option->palette.buttonText().color(); - return isOn ? WINUI3Colors[colorSchemeIndex][textOnAccentPrimary] + return isOn ? winUI3Color(textOnAccentPrimary) : option->palette.buttonText().color(); } diff --git a/src/plugins/styles/modernwindows/qwindows11style_p.h b/src/plugins/styles/modernwindows/qwindows11style_p.h index eccedc5bf67..45822a2591c 100644 --- a/src/plugins/styles/modernwindows/qwindows11style_p.h +++ b/src/plugins/styles/modernwindows/qwindows11style_p.h @@ -74,7 +74,7 @@ protected: private: static inline QBrush buttonFillBrush(const QStyleOption *option); - static inline QColor buttonLabelColor(const QStyleOption *option, int colorSchemeIndex); + QColor buttonLabelColor(const QStyleOption *option) const; void drawLineEditFrame(QPainter *p, const QRectF &rect, const QStyleOption *o, bool isEditable = true) const; inline QColor winUI3Color(enum WINUI3Color col) const; diff --git a/src/tools/windeployqt/main.cpp b/src/tools/windeployqt/main.cpp index 4c132e2794f..941a3d9b441 100644 --- a/src/tools/windeployqt/main.cpp +++ b/src/tools/windeployqt/main.cpp @@ -196,6 +196,7 @@ struct Options { unsigned updateFileFlags = 0; QStringList qmlDirectories; // Project's QML files. QStringList qmlImportPaths; // Custom QML module locations. + int qmlImportTimeout = 30000; QString directory; QString qtpathsBinary; QString translationsDirectory; // Translations target directory @@ -444,6 +445,12 @@ static inline int parseArguments(const QStringList &arguments, QCommandLineParse QStringLiteral("directory")); parser->addOption(qmlImportOption); + QCommandLineOption qmlImportTimeoutOption(QStringLiteral("qmlimporttimeout"), + QStringLiteral("Set timeout (in ms for) execution of " + "qmlimportscanner."), + QStringLiteral("timeout")); + parser->addOption(qmlImportTimeoutOption); + QCommandLineOption noQuickImportOption(QStringLiteral("no-quick-import"), QStringLiteral("Skip deployment of Qt Quick imports.")); parser->addOption(noQuickImportOption); @@ -708,6 +715,18 @@ static inline int parseArguments(const QStringList &arguments, QCommandLineParse if (parser->isSet(qmlImportOption)) options->qmlImportPaths = parser->values(qmlImportOption); + if (parser->isSet(qmlImportTimeoutOption)) { + const QString timeoutString = parser->value(qmlImportTimeoutOption); + bool ok; + int timeout = timeoutString.toInt(&ok); + if (!ok) { + *errorMessage = u'"' + timeoutString + QStringLiteral("\" is not an acceptable timeout " + "value."); + return CommandLineParseError; + } + options->qmlImportTimeout = timeout; + } + const QString &file = posArgs.front(); const QFileInfo fi(QDir::cleanPath(file)); if (!fi.exists()) { @@ -1589,7 +1608,8 @@ static DeployResult deploy(const Options &options, const QMap<QString, QString> const QmlImportScanResult scanResult = runQmlImportScanner(qmlDirectory, qmlImportPaths, result.directlyUsedQtLibraries.test(QtWidgetsModuleId), - options.platform, debugMatchMode, errorMessage); + options.platform, debugMatchMode, errorMessage, + options.qmlImportTimeout); if (!scanResult.ok) return result; qmlScanResult.append(scanResult); diff --git a/src/tools/windeployqt/qmlutils.cpp b/src/tools/windeployqt/qmlutils.cpp index a7e63e74705..0f7c13653a7 100644 --- a/src/tools/windeployqt/qmlutils.cpp +++ b/src/tools/windeployqt/qmlutils.cpp @@ -75,7 +75,7 @@ static void findFileRecursion(const QDir &directory, Platform platform, QmlImportScanResult runQmlImportScanner(const QString &directory, const QStringList &qmlImportPaths, bool usesWidgets, int platform, DebugMatchMode debugMatchMode, - QString *errorMessage) + QString *errorMessage, int timeout) { Q_UNUSED(usesWidgets); QmlImportScanResult result; @@ -87,7 +87,8 @@ QmlImportScanResult runQmlImportScanner(const QString &directory, const QStringL QByteArray stdOut; QByteArray stdErr; const QString binary = QStringLiteral("qmlimportscanner"); - if (!runProcess(binary, arguments, QDir::currentPath(), &exitCode, &stdOut, &stdErr, errorMessage)) + if (!runProcess(binary, arguments, QDir::currentPath(), &exitCode, &stdOut, &stdErr, + errorMessage, timeout)) return result; if (exitCode) { *errorMessage = binary + QStringLiteral(" returned ") + QString::number(exitCode) diff --git a/src/tools/windeployqt/qmlutils.h b/src/tools/windeployqt/qmlutils.h index bff1fb3a9bf..81a31fbe9c3 100644 --- a/src/tools/windeployqt/qmlutils.h +++ b/src/tools/windeployqt/qmlutils.h @@ -33,7 +33,7 @@ bool operator==(const QmlImportScanResult::Module &m1, const QmlImportScanResult QmlImportScanResult runQmlImportScanner(const QString &directory, const QStringList &qmlImportPaths, bool usesWidgets, int platform, DebugMatchMode debugMatchMode, - QString *errorMessage); + QString *errorMessage, int timeout = 30000); QT_END_NAMESPACE diff --git a/src/tools/windeployqt/utils.cpp b/src/tools/windeployqt/utils.cpp index d7daa855cc2..227acca53b0 100644 --- a/src/tools/windeployqt/utils.cpp +++ b/src/tools/windeployqt/utils.cpp @@ -137,7 +137,7 @@ static inline void appendToCommandLine(const QString &argument, QString *command bool runProcess(const QString &binary, const QStringList &args, const QString &workingDirectory, unsigned long *exitCode, QByteArray *stdOut, QByteArray *stdErr, - QString *errorMessage) + QString *errorMessage, int timeout) { if (exitCode) *exitCode = 0; @@ -157,7 +157,7 @@ bool runProcess(const QString &binary, const QStringList &args, } process.start(); - if (!process.waitForStarted() || !process.waitForFinished()) { + if (!process.waitForStarted() || !process.waitForFinished(timeout)) { if (errorMessage) *errorMessage = process.errorString(); return false; diff --git a/src/tools/windeployqt/utils.h b/src/tools/windeployqt/utils.h index b3957e5aa77..e32b402e880 100644 --- a/src/tools/windeployqt/utils.h +++ b/src/tools/windeployqt/utils.h @@ -170,7 +170,7 @@ bool updateFile(const QString &sourceFileName, const QStringList &nameFilters, bool runProcess(const QString &binary, const QStringList &args, const QString &workingDirectory = QString(), unsigned long *exitCode = 0, QByteArray *stdOut = 0, QByteArray *stdErr = 0, - QString *errorMessage = 0); + QString *errorMessage = 0, int timeout = 30000); bool readPeExecutableInfo(const QString &peExecutableFileName, QString *errorMessage, PeHeaderInfoStruct *headerInfo); diff --git a/src/widgets/doc/snippets/dockwidgets/mainwindow.cpp b/src/widgets/doc/snippets/dockwidgets/mainwindow.cpp index 5126d3266a1..e9c94232b62 100644 --- a/src/widgets/doc/snippets/dockwidgets/mainwindow.cpp +++ b/src/widgets/doc/snippets/dockwidgets/mainwindow.cpp @@ -3,21 +3,7 @@ #include <QtWidgets> -class MainWindow : public QMainWindow -{ - Q_OBJECT -public: - MainWindow(QWidget *parent = nullptr); - void setupContents(); - void setupDockWindow(); - void setupMenus(); - void updateText(QListWidgetItem *item); - -private: - QTextBrowser *textBrowser; - QListWidget *headingList; - QDockWidget *contentsWindow; -}; +#include "../include/mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) diff --git a/src/widgets/doc/snippets/include/mainwindow.h b/src/widgets/doc/snippets/include/mainwindow.h new file mode 100644 index 00000000000..1e9c54a3cf7 --- /dev/null +++ b/src/widgets/doc/snippets/include/mainwindow.h @@ -0,0 +1,104 @@ +// Copyright (C) 2025 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include <QMainWindow> + +QT_BEGIN_NAMESPACE + +class QWidget; +class QAction; + +class QTableWidget; +class QListWidget; +class QTreeWidget; +class QDockWidget; + +class QTableView; +class QListView; + +class QTextBrowser; + +class QListWidgetItem; +class QTreeWidgetItem; + +class QAbstractItemModel; +class QItemSelectionModel; + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + MainWindow(); + MainWindow(QWidget *parent = nullptr); + + void setupContents(); + void setupDockWindow(); + void setupMenus(); + void setupTableItems(); + void setupTreeItems(); + + void updateText(QListWidgetItem *item); + void updateMenus(QTreeWidgetItem *current); + void updateSortItems(); + void updateSelection(const QItemSelection &selected, + const QItemSelection &deselected); + + void createMenus(); + void createToolBars(); + void createDockWidgets(); + + void sortAscending(); + void sortDescending(); + + void insertItem(); + void removeItem(); + + void changeWidth(); + void changeHeight(); + void changeCurrent(const QModelIndex ¤t, + const QModelIndex &previous); + + void findItems(); + void averageItems(); + void sumItems(); + +private: + void setupListItems(); + + void fillSelection(); + void clearSelection(); + void selectAll(); + + QTextBrowser *textBrowser; + QListWidget *headingList; + QDockWidget *contentsWindow; + + QAction *insertAction; + QAction *removeAction; + QAction *ascendingAction; + QAction *descendingAction; + QAction *autoSortAction; + QAction *findItemsAction; + + //! [0] + QTableWidget *tableWidget; + //! [0] + + QTreeWidget *treeWidget; + QListWidget *listWidget; + + QAbstractItemModel *model; + QItemSelectionModel *selectionModel; + + QTableView *table; + QListView *listView; + +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/widgets/doc/snippets/mainwindowsnippet.cpp b/src/widgets/doc/snippets/mainwindowsnippet.cpp index 86364d2f500..b96f818b594 100644 --- a/src/widgets/doc/snippets/mainwindowsnippet.cpp +++ b/src/widgets/doc/snippets/mainwindowsnippet.cpp @@ -4,15 +4,7 @@ #include <QtGui> #include <QtWidgets> -class MainWindow : public QMainWindow -{ - Q_OBJECT -public: - MainWindow(); - void createMenus(); - void createToolBars(); - void createDockWidgets(); -}; +#include "include/mainwindow.h" MainWindow::MainWindow() { diff --git a/src/widgets/doc/snippets/qlistview-dnd/main.cpp b/src/widgets/doc/snippets/qlistview-dnd/main.cpp index 07d6ff9b101..435707b095b 100644 --- a/src/widgets/doc/snippets/qlistview-dnd/main.cpp +++ b/src/widgets/doc/snippets/qlistview-dnd/main.cpp @@ -3,7 +3,7 @@ #include <QtWidgets> -#include "mainwindow.h" +#include "../include/mainwindow.h" int main(int argc, char *argv[]) { diff --git a/src/widgets/doc/snippets/qlistview-dnd/mainwindow.cpp b/src/widgets/doc/snippets/qlistview-dnd/mainwindow.cpp index c62c704d516..33d3970b69f 100644 --- a/src/widgets/doc/snippets/qlistview-dnd/mainwindow.cpp +++ b/src/widgets/doc/snippets/qlistview-dnd/mainwindow.cpp @@ -3,7 +3,7 @@ #include <QtWidgets> -#include "mainwindow.h" +#include "../include/mainwindow.h" #include "model.h" MainWindow::MainWindow() diff --git a/src/widgets/doc/snippets/qlistview-dnd/mainwindow.h b/src/widgets/doc/snippets/qlistview-dnd/mainwindow.h deleted file mode 100644 index 8d145108448..00000000000 --- a/src/widgets/doc/snippets/qlistview-dnd/mainwindow.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#ifndef WINDOW_H -#define WINDOW_H - -#include <QMainWindow> - -QT_BEGIN_NAMESPACE - - -class QListView; - -class MainWindow : public QMainWindow -{ - Q_OBJECT - -public: - MainWindow(); - -private: - void setupListItems(); - - QListView *listView; -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/widgets/doc/snippets/qlistwidget-dnd/main.cpp b/src/widgets/doc/snippets/qlistwidget-dnd/main.cpp index a266be0fb9c..ca5cb942bc9 100644 --- a/src/widgets/doc/snippets/qlistwidget-dnd/main.cpp +++ b/src/widgets/doc/snippets/qlistwidget-dnd/main.cpp @@ -3,7 +3,7 @@ #include <QtGui> -#include "mainwindow.h" +#include "../include/mainwindow.h" int main(int argc, char *argv[]) { diff --git a/src/widgets/doc/snippets/qlistwidget-dnd/mainwindow.cpp b/src/widgets/doc/snippets/qlistwidget-dnd/mainwindow.cpp index 3ddbeeec4c2..e875f688aae 100644 --- a/src/widgets/doc/snippets/qlistwidget-dnd/mainwindow.cpp +++ b/src/widgets/doc/snippets/qlistwidget-dnd/mainwindow.cpp @@ -3,7 +3,7 @@ #include <QtWidgets> -#include "mainwindow.h" +#include "../include/mainwindow.h" MainWindow::MainWindow() { diff --git a/src/widgets/doc/snippets/qlistwidget-dnd/mainwindow.h b/src/widgets/doc/snippets/qlistwidget-dnd/mainwindow.h deleted file mode 100644 index 8ceac2d7350..00000000000 --- a/src/widgets/doc/snippets/qlistwidget-dnd/mainwindow.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#ifndef WINDOW_H -#define WINDOW_H - -#include <QMainWindow> - -QT_BEGIN_NAMESPACE - -class QListWidget; -class QListWidgetItem; - -class MainWindow : public QMainWindow -{ - Q_OBJECT - -public: - MainWindow(); - -private: - void setupListItems(); - - QListWidget *listWidget; -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/widgets/doc/snippets/qlistwidget-using/mainwindow.cpp b/src/widgets/doc/snippets/qlistwidget-using/mainwindow.cpp index 34e10eb0e1d..2f743b687a6 100644 --- a/src/widgets/doc/snippets/qlistwidget-using/mainwindow.cpp +++ b/src/widgets/doc/snippets/qlistwidget-using/mainwindow.cpp @@ -3,18 +3,7 @@ #include <QtWidgets> -class MainWindow : public QMainWindow -{ - Q_OBJECT -public: - MainWindow(QWidget *parent = nullptr); - void setupListItems(); - void sortAscending(); - void sortDescending(); - void insertItem(); - void removeItem(); - void updateMenus(QListWidgetItem *current); -}; +#include "../include/mainwindow.h" MainWindow::MainWindow() { diff --git a/src/widgets/doc/snippets/qtablewidget-resizing/mainwindow.cpp b/src/widgets/doc/snippets/qtablewidget-resizing/mainwindow.cpp index 87e9945e135..90b0ceb43c5 100644 --- a/src/widgets/doc/snippets/qtablewidget-resizing/mainwindow.cpp +++ b/src/widgets/doc/snippets/qtablewidget-resizing/mainwindow.cpp @@ -3,18 +3,7 @@ #include <QtWidgets> -class MainWindow : public QMainWindow -{ - Q_OBJECT -public: - MainWindow(); - void setupTableItems(); - void changeWidth(); - void changeHeight(); - -private: - QTableWidget *tableWidget; -}; +#include "../include/mainwindow.h" MainWindow::MainWindow() { diff --git a/src/widgets/doc/snippets/qtablewidget-using/main.cpp b/src/widgets/doc/snippets/qtablewidget-using/main.cpp index a266be0fb9c..ca5cb942bc9 100644 --- a/src/widgets/doc/snippets/qtablewidget-using/main.cpp +++ b/src/widgets/doc/snippets/qtablewidget-using/main.cpp @@ -3,7 +3,7 @@ #include <QtGui> -#include "mainwindow.h" +#include "../include/mainwindow.h" int main(int argc, char *argv[]) { diff --git a/src/widgets/doc/snippets/qtablewidget-using/mainwindow.cpp b/src/widgets/doc/snippets/qtablewidget-using/mainwindow.cpp index bb4833d4b1d..9c38dd8d10d 100644 --- a/src/widgets/doc/snippets/qtablewidget-using/mainwindow.cpp +++ b/src/widgets/doc/snippets/qtablewidget-using/mainwindow.cpp @@ -4,7 +4,7 @@ #include <QtWidgets> #include <math.h> -#include "mainwindow.h" +#include "../include/mainwindow.h" MainWindow::MainWindow() { diff --git a/src/widgets/doc/snippets/qtablewidget-using/mainwindow.h b/src/widgets/doc/snippets/qtablewidget-using/mainwindow.h deleted file mode 100644 index d9c4ce5ea66..00000000000 --- a/src/widgets/doc/snippets/qtablewidget-using/mainwindow.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#ifndef WINDOW_H -#define WINDOW_H - -#include <QMainWindow> - -QT_BEGIN_NAMESPACE - -class QAction; -class QTableWidget; -class QTableWidgetItem; - -class MainWindow : public QMainWindow -{ - Q_OBJECT - -public: - MainWindow(); - -public slots: - void averageItems(); - void sumItems(); - -private: - void setupTableItems(); - - QAction *removeAction; -//! [0] - QTableWidget *tableWidget; -//! [0] -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/widgets/doc/snippets/qtreewidget-using/mainwindow.cpp b/src/widgets/doc/snippets/qtreewidget-using/mainwindow.cpp index cb33cfa7079..0310f7bbfa2 100644 --- a/src/widgets/doc/snippets/qtreewidget-using/mainwindow.cpp +++ b/src/widgets/doc/snippets/qtreewidget-using/mainwindow.cpp @@ -3,29 +3,7 @@ #include <QtWidgets> -class MainWindow : public QMainWindow -{ - Q_OBJECT -public: - MainWindow(); - void setupTreeItems(); - void findItems(); - void insertItem(); - void removeItem(); - void sortAscending(); - void sortDescending(); - void updateMenus(QTreeWidgetItem *current); - void updateSortItems(); - -private: - QAction *insertAction; - QAction *removeAction; - QAction *ascendingAction; - QAction *descendingAction; - QAction *autoSortAction; - QAction *findItemsAction; - QTreeWidget *treeWidget; -}; +#include "../include/mainwindow.h" MainWindow::MainWindow() { @@ -57,13 +35,15 @@ MainWindow::MainWindow() //! [0] */ treeWidget = new QTreeWidget(this); -//! [1] + //! [1] treeWidget->setColumnCount(2); -//! [1] //! [2] + //! [1] + + //! [2] QStringList headers; headers << tr("Subject") << tr("Default"); treeWidget->setHeaderLabels(headers); -//! [2] + //! [2] connect(quitAction, &QAction::triggered, this, &QWidget::close); connect(ascendingAction, &QAction::triggered, this, &MainWindow::sortAscending); @@ -84,23 +64,23 @@ MainWindow::MainWindow() void MainWindow::setupTreeItems() { -//! [3] + //! [3] QTreeWidgetItem *cities = new QTreeWidgetItem(treeWidget); cities->setText(0, tr("Cities")); QTreeWidgetItem *osloItem = new QTreeWidgetItem(cities); osloItem->setText(0, tr("Oslo")); osloItem->setText(1, tr("Yes")); -//! [3] + //! [3] (new QTreeWidgetItem(cities))->setText(0, tr("Stockholm")); (new QTreeWidgetItem(cities))->setText(0, tr("Helsinki")); (new QTreeWidgetItem(cities))->setText(0, tr("Copenhagen")); -//! [4] //! [5] + //! [4] //! [5] QTreeWidgetItem *planets = new QTreeWidgetItem(treeWidget, cities); -//! [4] + //! [4] planets->setText(0, tr("Planets")); -//! [5] + //! [5] (new QTreeWidgetItem(planets))->setText(0, tr("Mercury")); (new QTreeWidgetItem(planets))->setText(0, tr("Venus")); @@ -128,7 +108,7 @@ void MainWindow::findItems() for (QTreeWidgetItem *item : items) item->setSelected(false); -//! [7] + //! [7] const QList<QTreeWidgetItem *> found = treeWidget->findItems( itemText, Qt::MatchWildcard); @@ -136,7 +116,7 @@ void MainWindow::findItems() item->setSelected(true); // Show the item->text(0) for each item. } -//! [7] + //! [7] } void MainWindow::insertItem() @@ -152,15 +132,15 @@ void MainWindow::insertItem() if (itemText.isEmpty()) return; -//! [8] + //! [8] QTreeWidgetItem *parent = currentItem->parent(); QTreeWidgetItem *newItem; if (parent) newItem = new QTreeWidgetItem(parent, treeWidget->currentItem()); else -//! [8] //! [9] + //! [8] //! [9] newItem = new QTreeWidgetItem(treeWidget, treeWidget->currentItem()); -//! [9] + //! [9] newItem->setText(0, itemText); } @@ -172,7 +152,7 @@ void MainWindow::removeItem() if (!currentItem) return; -//! [10] + //! [10] QTreeWidgetItem *parent = currentItem->parent(); int index; @@ -182,9 +162,8 @@ void MainWindow::removeItem() } else { index = treeWidget->indexOfTopLevelItem(treeWidget->currentItem()); delete treeWidget->takeTopLevelItem(index); -//! [10] //! [11] } -//! [11] + //! [10] } void MainWindow::sortAscending() diff --git a/src/widgets/doc/snippets/qtreewidgetitemiterator-using/mainwindow.cpp b/src/widgets/doc/snippets/qtreewidgetitemiterator-using/mainwindow.cpp index aa9be523834..0c003684bca 100644 --- a/src/widgets/doc/snippets/qtreewidgetitemiterator-using/mainwindow.cpp +++ b/src/widgets/doc/snippets/qtreewidgetitemiterator-using/mainwindow.cpp @@ -3,29 +3,7 @@ #include <QtWidgets> -class MainWindow : public QMainWindow -{ - Q_OBJECT -public: - MainWindow(); - void setupTreeItems(); - void findItems(); - void insertItem(); - void removeItem(); - void sortAscending(); - void sortDescending(); - void updateMenus(QTreeWidgetItem *current); - void updateSortItems(); - -private: - QAction *insertAction; - QAction *removeAction; - QAction *ascendingAction; - QAction *descendingAction; - QAction *autoSortAction; - QAction *findItemsAction; - QTreeWidget *treeWidget; -}; +#include "../include/mainwindow.h" MainWindow::MainWindow() { diff --git a/src/widgets/doc/snippets/reading-selections/main.cpp b/src/widgets/doc/snippets/reading-selections/main.cpp index a87b55f1f70..f3b6de5ef7f 100644 --- a/src/widgets/doc/snippets/reading-selections/main.cpp +++ b/src/widgets/doc/snippets/reading-selections/main.cpp @@ -10,7 +10,7 @@ #include <QApplication> -#include "window.h" +#include "../include/mainwindow.h" int main(int argc, char *argv[]) { diff --git a/src/widgets/doc/snippets/reading-selections/window.cpp b/src/widgets/doc/snippets/reading-selections/window.cpp index 1400f500d03..c0c3bcbe6f4 100644 --- a/src/widgets/doc/snippets/reading-selections/window.cpp +++ b/src/widgets/doc/snippets/reading-selections/window.cpp @@ -14,8 +14,9 @@ #include <QMenu> #include <QMenuBar> #include <QStatusBar> +#include <QTableView> -#include "window.h" +#include "../include/mainwindow.h" class TableModel : public QAbstractTableModel { diff --git a/src/widgets/doc/snippets/reading-selections/window.h b/src/widgets/doc/snippets/reading-selections/window.h deleted file mode 100644 index a4cdb0cc08f..00000000000 --- a/src/widgets/doc/snippets/reading-selections/window.h +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#ifndef WINDOW_H -#define WINDOW_H - -#include <QItemSelection> -#include <QMainWindow> -#include <QAbstractItemModel> -#include <QWidget> -#include <QTableView> - -class MainWindow : public QMainWindow -{ - Q_OBJECT -public: - MainWindow(QWidget *parent = nullptr); - -private slots: - void fillSelection(); - void clearSelection(); - void selectAll(); - -private: - QAbstractItemModel *model; - QItemSelectionModel *selectionModel; - QTableView *table; -}; - -#endif diff --git a/src/widgets/doc/snippets/updating-selections/main.cpp b/src/widgets/doc/snippets/updating-selections/main.cpp index a87b55f1f70..f3b6de5ef7f 100644 --- a/src/widgets/doc/snippets/updating-selections/main.cpp +++ b/src/widgets/doc/snippets/updating-selections/main.cpp @@ -10,7 +10,7 @@ #include <QApplication> -#include "window.h" +#include "../include/mainwindow.h" int main(int argc, char *argv[]) { diff --git a/src/widgets/doc/snippets/updating-selections/window.cpp b/src/widgets/doc/snippets/updating-selections/window.cpp index 4685b33130d..d03a36d5fc3 100644 --- a/src/widgets/doc/snippets/updating-selections/window.cpp +++ b/src/widgets/doc/snippets/updating-selections/window.cpp @@ -12,8 +12,9 @@ #include <QItemSelection> #include <QItemSelectionModel> #include <QStatusBar> +#include <QTableView> -#include "window.h" +#include "../include/mainwindow.h" class TableModel : public QAbstractTableModel { diff --git a/src/widgets/doc/snippets/updating-selections/window.h b/src/widgets/doc/snippets/updating-selections/window.h deleted file mode 100644 index 37764537214..00000000000 --- a/src/widgets/doc/snippets/updating-selections/window.h +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#ifndef WINDOW_H -#define WINDOW_H - -#include <QItemSelection> -#include <QMainWindow> -#include <QModelIndex> -#include <QWidget> -#include <QTableView> - -class MainWindow : public QMainWindow -{ - Q_OBJECT -public: - MainWindow(QWidget *parent = nullptr); - -public slots: - void updateSelection(const QItemSelection &selected, - const QItemSelection &deselected); - void changeCurrent(const QModelIndex ¤t, const QModelIndex &previous); - -private: - QAbstractItemModel *model; - QItemSelectionModel *selectionModel; - QTableView *table; -}; - -#endif diff --git a/src/widgets/doc/src/model-view-programming.qdoc b/src/widgets/doc/src/model-view-programming.qdoc index 5461619a4de..cecbe34b215 100644 --- a/src/widgets/doc/src/model-view-programming.qdoc +++ b/src/widgets/doc/src/model-view-programming.qdoc @@ -1480,7 +1480,6 @@ regardless of its location: \snippet qtreewidget-using/mainwindow.cpp 10 - \snippet qtreewidget-using/mainwindow.cpp 11 Inserting the item somewhere else in the tree widget follows the same pattern: @@ -1497,7 +1496,7 @@ Tables can be created with a set number of rows and columns, or these can be added to an unsized table as they are needed. - \snippet qtablewidget-using/mainwindow.h 0 + \snippet include/mainwindow.h 0 \snippet qtablewidget-using/mainwindow.cpp 0 Items are constructed outside the table before being added to the table diff --git a/src/widgets/kernel/qtestsupport_widgets.cpp b/src/widgets/kernel/qtestsupport_widgets.cpp index e0118605308..0816b640cc8 100644 --- a/src/widgets/kernel/qtestsupport_widgets.cpp +++ b/src/widgets/kernel/qtestsupport_widgets.cpp @@ -22,8 +22,10 @@ static bool qWaitForWidgetWindow(QWidget *w, Predicate predicate, QDeadlineTimer if (!w->window()->windowHandle()) return false; - return QTest::qWaitFor([&]() { - if (QWindow *window = w->window()->windowHandle()) + return QTest::qWaitFor([&, wp = QPointer(w)]() { + if (QWidget *widget = wp.data(); !widget) + return false; + else if (QWindow *window = widget->window()->windowHandle()) return predicate(window); return false; }, timeout); diff --git a/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp b/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp index d4dc6544a0e..ba92fb3fb30 100644 --- a/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp +++ b/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp @@ -1060,12 +1060,21 @@ void tst_QQuaternion::fromEulerAngles_data() QTest::newRow("xonly") << 90.0f << 0.0f << 0.0f << QQuaternion(0.707107f, 0.707107f, 0.0f, 0.0f); + QTest::newRow("xonly-opposite") + << -90.0f << 0.0f << 0.0f << QQuaternion{M_SQRT1_2, -M_SQRT1_2, 0, 0}; + QTest::newRow("yonly") << 0.0f << 180.0f << 0.0f << QQuaternion(0.0f, 0.0f, 1.0f, 0.0f); + QTest::newRow("yonly-opposite") + << 0.0f << -180.0f << 0.0f << QQuaternion(0.0f, 0.0f, -1.0f, 0.0f); + QTest::newRow("zonly") << 0.0f << 0.0f << 270.0f << QQuaternion(-0.707107f, 0.0f, 0.0f, 0.707107f); + QTest::newRow("zonly-opposite") + << 0.0f << 0.0f << -270.0f << QQuaternion(-M_SQRT1_2, 0.0f, 0.0f, M_SQRT1_2); + QTest::newRow("x+z") << 30.0f << 0.0f << 45.0f << QQuaternion(0.892399f, 0.239118f, -0.099046f, 0.369644f); diff --git a/tests/auto/wayland/reconnect/wl-socket.c b/tests/auto/wayland/reconnect/wl-socket.c index 3d449162251..f1258c10980 100644 --- a/tests/auto/wayland/reconnect/wl-socket.c +++ b/tests/auto/wayland/reconnect/wl-socket.c @@ -30,7 +30,7 @@ struct wl_socket { int fd_lock; struct sockaddr_un addr; char lock_addr[UNIX_PATH_MAX + LOCK_SUFFIXLEN]; - char display_name[16]; + char display_name[32]; }; static struct wl_socket *wl_socket_alloc(void) diff --git a/tests/auto/widgets/styles/qstylesheetstyle/BLACKLIST b/tests/auto/widgets/styles/qstylesheetstyle/BLACKLIST index 00ff17aaa83..d5f45f47e7a 100644 --- a/tests/auto/widgets/styles/qstylesheetstyle/BLACKLIST +++ b/tests/auto/widgets/styles/qstylesheetstyle/BLACKLIST @@ -8,3 +8,5 @@ ci b2qt 32bit ci b2qt 32bit [task232085_spinBoxLineEditBg] ci b2qt 32bit +[emptyStyleSheet] +macos # QTBUG-21468 diff --git a/util/unicode/main.cpp b/util/unicode/main.cpp index e5d1ad47e08..46a39d2ed96 100644 --- a/util/unicode/main.cpp +++ b/util/unicode/main.cpp @@ -1306,6 +1306,7 @@ static QHash<int, int> combiningClassUsage; static int maxLowerCaseDiff = 0; static int maxUpperCaseDiff = 0; static int maxTitleCaseDiff = 0; +static int maxSeparatorCodepoint = 0; static void readUnicodeData() { @@ -1366,6 +1367,9 @@ static void readUnicodeData() UnicodeData &data = UnicodeData::valueRef(codepoint); data.p.category = categoryMap.value(properties[UD_Category], QChar::Other_NotAssigned); + if (data.p.category == QChar::Separator_Space || data.p.category == QChar::Separator_Line + || data.p.category == QChar::Separator_Paragraph) + maxSeparatorCodepoint = codepoint; data.p.combiningClass = properties[UD_CombiningClass].toInt(); if (!combiningClassUsage.contains(data.p.combiningClass)) combiningClassUsage[data.p.combiningClass] = 1; @@ -2986,7 +2990,12 @@ static QByteArray createPropertyInfo() Q_ASSERT(blockMap.size() == BMP_END/BMP_BLOCKSIZE +(SMP_END-BMP_END)/SMP_BLOCKSIZE); // 0x1870 Q_ASSERT(blockMap.last() + blockMap.size() < (1<<(sizeof(unsigned short)*8))); - QByteArray out = "static constexpr unsigned short uc_property_trie[] = {\n"; + QByteArray out; + out += "static constexpr char32_t MaxSeparatorCodepoint = 0x"; + out += QByteArray::number(maxSeparatorCodepoint, 16); + out += ";\n"; + + out += "\nstatic constexpr unsigned short uc_property_trie[] = {\n"; // First write the map from blockId to indices of unique blocks: out += " // [0x0..0x" + QByteArray::number(BMP_END, 16) + ")"; for (int i = 0; i < BMP_END/BMP_BLOCKSIZE; ++i) { @@ -3702,7 +3711,7 @@ int main(int, char **) f.write(note); f.write("#include \"qunicodetables_p.h\"\n\n"); f.write("QT_BEGIN_NAMESPACE\n\n"); - f.write("namespace QUnicodeTables {\n\n"); + f.write("namespace QUnicodeTables {\n"); f.write(properties); f.write(specialCases); f.write(compositions); |