summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/corelib/kernel/qassociativeiterable.h15
-rw-r--r--src/corelib/kernel/qsequentialiterable.h15
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.cpp7
-rw-r--r--src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp10
-rw-r--r--src/testlib/qtest.h8
-rw-r--r--src/widgets/itemviews/qtreeview.cpp11
-rw-r--r--src/widgets/kernel/qstandardgestures.cpp10
-rw-r--r--src/widgets/styles/qstylesheetstyle.cpp77
8 files changed, 85 insertions, 68 deletions
diff --git a/src/corelib/kernel/qassociativeiterable.h b/src/corelib/kernel/qassociativeiterable.h
index 4f9bbf67bfb..c042fe4a0ec 100644
--- a/src/corelib/kernel/qassociativeiterable.h
+++ b/src/corelib/kernel/qassociativeiterable.h
@@ -21,9 +21,8 @@ QT_WARNING_DISABLE_DEPRECATED
Q_CORE_EXPORT QT_DEPRECATED_VERSION_X_6_15(text)
#endif
-class
-QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaAssociation::Iterable::Iterator instead.")
-QAssociativeIterator : public QIterator<QMetaAssociation>
+// Keep this a single long line, otherwise syncqt doesn't create a class forwarding header
+class QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaAssociation's iterables and iterators instead.") QAssociativeIterator : public QIterator<QMetaAssociation>
{
public:
using key_type = QVariant;
@@ -42,9 +41,8 @@ public:
QVariantPointer<QAssociativeIterator> operator->() const;
};
-class
-QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaAssociation::Iterable::ConstIterator instead.")
-QAssociativeConstIterator : public QConstIterator<QMetaAssociation>
+// Keep this a single long line, otherwise syncqt doesn't create a class forwarding header
+class QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaAssociation's iterables and iterators instead.") QAssociativeConstIterator : public QConstIterator<QMetaAssociation>
{
public:
using key_type = QVariant;
@@ -63,9 +61,8 @@ public:
QVariantConstPointer operator->() const;
};
-class
-QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaAssociation::Iterable instead.")
-QAssociativeIterable : public QIterable<QMetaAssociation>
+// Keep this a single long line, otherwise syncqt doesn't create a class forwarding header
+class QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaAssociation's iterables and iterators instead.") QAssociativeIterable : public QIterable<QMetaAssociation>
{
public:
using iterator = QTaggedIterator<QAssociativeIterator, void>;
diff --git a/src/corelib/kernel/qsequentialiterable.h b/src/corelib/kernel/qsequentialiterable.h
index 76908bdae4b..b2e690ea9cf 100644
--- a/src/corelib/kernel/qsequentialiterable.h
+++ b/src/corelib/kernel/qsequentialiterable.h
@@ -21,9 +21,8 @@ QT_WARNING_DISABLE_DEPRECATED
Q_CORE_EXPORT QT_DEPRECATED_VERSION_X_6_15(text)
#endif
-class
-QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaSequence::Iterable::Iterator instead.")
-QSequentialIterator : public QIterator<QMetaSequence>
+// Keep this a single long line, otherwise syncqt doesn't create a class forwarding header
+class QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaSequence's iterables and iterators instead.") QSequentialIterator : public QIterator<QMetaSequence>
{
public:
using value_type = QVariant;
@@ -38,9 +37,8 @@ public:
QVariantPointer<QSequentialIterator> operator->() const;
};
-class
-QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaSequence::Iterable::ConstIterator instead.")
-QSequentialConstIterator : public QConstIterator<QMetaSequence>
+// Keep this a single long line, otherwise syncqt doesn't create a class forwarding header
+class QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaSequence's iterables and iterators instead.") QSequentialConstIterator : public QConstIterator<QMetaSequence>
{
public:
using value_type = QVariant;
@@ -55,9 +53,8 @@ public:
QVariantConstPointer operator->() const;
};
-class
-QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaSequence::Iterable instead.")
-QSequentialIterable : public QIterable<QMetaSequence>
+// Keep this a single long line, otherwise syncqt doesn't create a class forwarding header
+class QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaSequence's iterables and iterators instead.") QSequentialIterable : public QIterable<QMetaSequence>
{
public:
using iterator = QTaggedIterator<QSequentialIterator, void>;
diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp
index 9459e8bdfd3..f96f154f5b1 100644
--- a/src/plugins/platforms/windows/qwindowswindow.cpp
+++ b/src/plugins/platforms/windows/qwindowswindow.cpp
@@ -4035,10 +4035,13 @@ void QWindowsWindow::requestUpdate()
// the Posted event on the GUI thread.
if (m_vsyncUpdatePending.testAndSetAcquire(UpdateState::Requested, UpdateState::Posted)) {
QWindowsWindow *oldSelf = this;
- QMetaObject::invokeMethod(w, [w, oldSelf] {
+ qsizetype oldCallbackId = m_vsyncServiceCallbackId;
+ QMetaObject::invokeMethod(w, [w, oldSelf, oldCallbackId] {
// 'oldSelf' is only used for comparison, don't access it directly!
auto *self = static_cast<QWindowsWindow *>(w->handle());
- if (self && self == oldSelf) {
+ // NOTE: In the off chance that the window got destroyed and recreated with the
+ // same address, we also check that the callback id is the same.
+ if (self && self == oldSelf && self->m_vsyncServiceCallbackId == oldCallbackId) {
// The platform window is still alive
self->m_vsyncUpdatePending.storeRelease(UpdateState::Ready);
self->deliverUpdateRequest();
diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp b/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp
index e2f181aa628..2ea3fe38e1c 100644
--- a/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp
+++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp
@@ -596,6 +596,16 @@ HRESULT QWindowsUiaMainProvider::GetPropertyValue(PROPERTYID idProp, VARIANT *pR
*pRetVal = QComVariant{ accessible->text(QAccessible::Help) }.release();
break;
case UIA_HasKeyboardFocusPropertyId:
+ // If the top-level window has no focused child, report the top-level
+ // widget (window). If it already has a focused widget, it will be
+ // reported automatically.
+ if (topLevelWindow) {
+ QAccessibleInterface *focusacc = accessible->focusChild();
+ if (!focusacc) {
+ *pRetVal = QComVariant{ accessible->state().active ? true : false }.release();
+ break;
+ }
+ }
*pRetVal = QComVariant{ accessible->state().focused ? true : false }.release();
break;
case UIA_IsKeyboardFocusablePropertyId:
diff --git a/src/testlib/qtest.h b/src/testlib/qtest.h
index 431f91d5474..10bb63040c8 100644
--- a/src/testlib/qtest.h
+++ b/src/testlib/qtest.h
@@ -181,16 +181,16 @@ inline bool qCompare(quint32 const &t1, quint64 const &t2, const char *actual,
}
namespace Internal {
-template <typename T, typename = void>
-struct HasInitMain : std::false_type{};
+template <typename T>
+using InitMainTest = decltype(&T::initMain);
template <typename T>
-struct HasInitMain<T, std::void_t<decltype(&T::initMain)>> : std::true_type {};
+constexpr inline bool hasInitMain = qxp::is_detected_v<InitMainTest, T>;
template<typename T>
void callInitMain()
{
- if constexpr (HasInitMain<T>::value)
+ if constexpr (hasInitMain<T>)
T::initMain();
}
diff --git a/src/widgets/itemviews/qtreeview.cpp b/src/widgets/itemviews/qtreeview.cpp
index 570566793dc..0f0496ad04d 100644
--- a/src/widgets/itemviews/qtreeview.cpp
+++ b/src/widgets/itemviews/qtreeview.cpp
@@ -1622,12 +1622,6 @@ void QTreeViewPrivate::calcLogicalIndices(
const auto indicesCount = logicalIndices->size();
itemPositions->resize(indicesCount);
for (qsizetype currentLogicalSection = 0; currentLogicalSection < indicesCount; ++currentLogicalSection) {
- // shortcut, no need to calc anything more
- if (indicesCount == 1 || spanning) {
- (*itemPositions)[currentLogicalSection] = QStyleOptionViewItem::OnlyOne;
- continue;
- }
- const int headerSection = logicalIndices->at(currentLogicalSection);
// determine the viewItemPosition depending on the position of column 0
int nextLogicalSection = currentLogicalSection + 1 >= indicesCount
? logicalIndexAfterRight
@@ -1635,8 +1629,11 @@ void QTreeViewPrivate::calcLogicalIndices(
int prevLogicalSection = currentLogicalSection - 1 < 0
? logicalIndexBeforeLeft
: logicalIndices->at(currentLogicalSection - 1);
+ const int headerSection = logicalIndices->at(currentLogicalSection);
QStyleOptionViewItem::ViewItemPosition pos;
- if ((nextLogicalSection != 0 && prevLogicalSection == -1) || isTreePosition(headerSection))
+ if ((nextLogicalSection == -1 && prevLogicalSection == -1) || spanning) {
+ pos = QStyleOptionViewItem::OnlyOne;
+ } else if ((nextLogicalSection != 0 && prevLogicalSection == -1) || isTreePosition(headerSection))
pos = QStyleOptionViewItem::Beginning;
else if (nextLogicalSection == 0 || nextLogicalSection == -1)
pos = QStyleOptionViewItem::End;
diff --git a/src/widgets/kernel/qstandardgestures.cpp b/src/widgets/kernel/qstandardgestures.cpp
index e9de82d2357..314d82fd64f 100644
--- a/src/widgets/kernel/qstandardgestures.cpp
+++ b/src/widgets/kernel/qstandardgestures.cpp
@@ -348,8 +348,14 @@ QGestureRecognizer::Result QSwipeGestureRecognizer::recognize(QGesture *state,
result = QGestureRecognizer::Ignore;
break;
case QSwipeGesturePrivate::ThreePointsReached:
- result = (ev->touchPointStates() & QEventPoint::State::Pressed)
- ? QGestureRecognizer::CancelGesture : QGestureRecognizer::Ignore;
+ if (ev->touchPointStates() & QEventPoint::State::Pressed) {
+ result = QGestureRecognizer::CancelGesture;
+ } else if (d->verticalDirection != QSwipeGesture::NoDirection ||
+ d->horizontalDirection != QSwipeGesture::NoDirection) {
+ result = QGestureRecognizer::TriggerGesture;
+ } else {
+ result = QGestureRecognizer::Ignore;
+ }
break;
}
}
diff --git a/src/widgets/styles/qstylesheetstyle.cpp b/src/widgets/styles/qstylesheetstyle.cpp
index e0fdd56e6d8..f36bcf458d9 100644
--- a/src/widgets/styles/qstylesheetstyle.cpp
+++ b/src/widgets/styles/qstylesheetstyle.cpp
@@ -94,6 +94,7 @@
#endif
#include <QtGui/qpainterpath.h>
+#include <QtGui/qpainterstateguard.h>
#include <QtGui/qscreen.h>
#include <QtCore/private/qduplicatetracker_p.h>
@@ -4085,29 +4086,56 @@ void QStyleSheetStyle::drawControl(ControlElement ce, const QStyleOption *opt, Q
case CE_HeaderLabel:
if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(opt)) {
- QStyleOptionHeaderV2 hdr;
- QStyleOptionHeader &v1Copy = hdr;
- if (auto v2 = qstyleoption_cast<const QStyleOptionHeaderV2 *>(opt))
- hdr = *v2;
- else
- v1Copy = *header;
+ // Save painter state
+ QPainterStateGuard psGuard(p);
+
+ QStyleOptionHeaderV2 hdr;
+ QStyleOptionHeader &v1Copy = hdr;
+ if (auto v2 = qstyleoption_cast<const QStyleOptionHeaderV2 *>(header))
+ hdr = *v2;
+ else
+ v1Copy = *header;
+
QRenderRule subRule = renderRule(w, opt, PseudoElement_HeaderViewSection);
if (hasStyleRule(w, PseudoElement_HeaderViewUpArrow)
|| hasStyleRule(w, PseudoElement_HeaderViewDownArrow)) {
if (hdr.sortIndicator != QStyleOptionHeader::None) {
+ QRegion newClipRegion = QRegion(hdr.rect);
const QRect arrowRect = subElementRect(SE_HeaderArrow, opt, w);
- if (hdr.orientation == Qt::Horizontal)
- hdr.rect.setWidth(hdr.rect.width() - arrowRect.width());
- else
- hdr.rect.setHeight(hdr.rect.height() - arrowRect.height());
+ const QRenderRule hrRule = renderRule(w, opt, PseudoElement_HeaderViewUpArrow);
+ // Clip the text to avoid overlapping with the sort arrow if
+ // the sort arrow is aligned to the right or left if horizontal
+ // or top or bottom if vertical.
+ if (hrRule.hasPosition()) {
+ const auto position = hrRule.position()->position;
+ if (hdr.orientation == Qt::Horizontal) {
+ if (position & Qt::AlignLeft) {
+ newClipRegion -= QRegion(arrowRect.x(), hdr.rect.y(),
+ arrowRect.width(), hdr.rect.height());
+ } else if (position & Qt::AlignRight) {
+ newClipRegion -= QRegion(arrowRect.x(), hdr.rect.y(),
+ arrowRect.width(), hdr.rect.height());
+ }
+ } else if (hdr.orientation == Qt::Vertical) {
+ if (position & Qt::AlignTop) {
+ newClipRegion -= QRegion(arrowRect.x(), hdr.rect.y(),
+ hdr.rect.width(), arrowRect.height());
+ } else if (position & Qt::AlignBottom) {
+ newClipRegion -= QRegion(arrowRect.x(), arrowRect.y(),
+ hdr.rect.width(), arrowRect.height());
+ }
+ }
+ }
+ p->setClipping(true);
+ p->setClipRegion(newClipRegion);
}
}
+
subRule.configurePalette(&hdr.palette, QPalette::ButtonText, QPalette::Button);
+
if (subRule.hasFont) {
- QFont oldFont = p->font();
p->setFont(subRule.font.resolve(p->font()));
ParentStyle::drawControl(ce, &hdr, p, w);
- p->setFont(oldFont);
} else {
baseStyle()->drawControl(ce, &hdr, p, w);
}
@@ -5346,17 +5374,8 @@ QSize QStyleSheetStyle::sizeFromContents(ContentsType ct, const QStyleOption *op
}
return subRule.size(sz);
}
- sz = subRule.baseStyleCanDraw() ? baseStyle()->sizeFromContents(ct, opt, sz, w)
- : QWindowsStyle::sizeFromContents(ct, opt, sz, w);
- if (hasStyleRule(w, PseudoElement_HeaderViewDownArrow)
- || hasStyleRule(w, PseudoElement_HeaderViewUpArrow)) {
- const QRect arrowRect = subElementRect(SE_HeaderArrow, opt, w);
- if (hdr->orientation == Qt::Horizontal)
- sz.rwidth() += arrowRect.width();
- else
- sz.rheight() += arrowRect.height();
- }
- return sz;
+ return subRule.baseStyleCanDraw() ? baseStyle()->sizeFromContents(ct, opt, sz, w)
+ : QWindowsStyle::sizeFromContents(ct, opt, sz, w);
}
}
break;
@@ -6240,18 +6259,6 @@ QRect QStyleSheetStyle::subElementRect(SubElement se, const QStyleOption *opt, c
QRenderRule subRule = renderRule(w, opt, PseudoElement_HeaderViewSection);
if (subRule.hasBox() || !subRule.hasNativeBorder()) {
auto r = subRule.contentsRect(opt->rect);
- if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(opt)) {
- // Subtract width needed for arrow, if there is one
- if (header->sortIndicator != QStyleOptionHeader::None) {
- const auto arrowRect = subElementRect(SE_HeaderArrow, opt, w);
- if (arrowRect.isValid()) {
- if (opt->state & State_Horizontal)
- r.setWidth(r.width() - arrowRect.width());
- else
- r.setHeight(r.height() - arrowRect.height());
- }
- }
- }
return r;
}
}