summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.cpp7
-rw-r--r--src/widgets/styles/qcommonstyle.cpp46
2 files changed, 26 insertions, 27 deletions
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/widgets/styles/qcommonstyle.cpp b/src/widgets/styles/qcommonstyle.cpp
index 592b70ef8ba..1f026775435 100644
--- a/src/widgets/styles/qcommonstyle.cpp
+++ b/src/widgets/styles/qcommonstyle.cpp
@@ -1200,7 +1200,7 @@ void QCommonStylePrivate::tabLayout(const QStyleOptionTab *opt, const QWidget *w
int vpadding = proxyStyle->pixelMetric(QStyle::PM_TabBarTabVSpace, opt, widget) / 2;
if (opt->shape == QTabBar::RoundedSouth || opt->shape == QTabBar::TriangularSouth)
verticalShift = -verticalShift;
- tr.adjust(hpadding, verticalShift - vpadding, horizontalShift - hpadding, vpadding);
+ tr.adjust(hpadding, verticalShift + vpadding, horizontalShift - hpadding, -vpadding);
bool selected = opt->state & QStyle::State_Selected;
if (selected) {
tr.setTop(tr.top() - verticalShift);
@@ -1625,23 +1625,18 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt,
if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(opt)) {
QRect rect = header->rect;
if (!header->icon.isNull()) {
- int iconExtent = proxy()->pixelMetric(PM_SmallIconSize, opt, widget);
- QPixmap pixmap
- = header->icon.pixmap(QSize(iconExtent, iconExtent), QStyleHelper::getDpr(p), (header->state & State_Enabled) ? QIcon::Normal : QIcon::Disabled);
- int pixw = pixmap.width() / pixmap.devicePixelRatio();
-
- QRect aligned = alignedRect(header->direction, header->iconAlignment, pixmap.size() / pixmap.devicePixelRatio(), rect);
- QRect inter = aligned.intersected(rect);
- p->drawPixmap(inter.x(), inter.y(), pixmap,
- inter.x() - aligned.x(), inter.y() - aligned.y(),
- aligned.width() * pixmap.devicePixelRatio(),
- pixmap.height() * pixmap.devicePixelRatio());
+ const int iconExtent = proxy()->pixelMetric(PM_SmallIconSize, opt, widget);
+ const QRect aligned = alignedRect(header->direction, header->iconAlignment,
+ QSize(iconExtent, iconExtent), rect);
+ header->icon.paint(p, aligned, Qt::AlignCenter,
+ header->state.testFlag(State_Enabled) ? QIcon::Normal
+ : QIcon::Disabled);
const int margin = proxy()->pixelMetric(QStyle::PM_HeaderMargin, opt, widget);
if (header->direction == Qt::LeftToRight)
- rect.setLeft(rect.left() + pixw + margin);
+ rect.setLeft(rect.left() + iconExtent + margin);
else
- rect.setRight(rect.right() - pixw - margin);
+ rect.setRight(rect.right() - iconExtent - margin);
}
QFontMetrics fm(header->fontMetrics);
if (header->state & QStyle::State_On) {
@@ -2838,7 +2833,6 @@ QRect QCommonStyle::subElementRect(SubElement sr, const QStyleOption *opt,
int verticalShift = proxy()->pixelMetric(QStyle::PM_TabBarTabShiftVertical, tab, widget);
int horizontalShift = proxy()->pixelMetric(QStyle::PM_TabBarTabShiftHorizontal, tab, widget);
int hpadding = proxy()->pixelMetric(QStyle::PM_TabBarTabHSpace, opt, widget) / 2;
- hpadding = qMax(hpadding, 4); //workaround KStyle returning 0 because they workaround an old bug in Qt
bool verticalTabs = tab->shape == QTabBar::RoundedEast
|| tab->shape == QTabBar::RoundedWest
@@ -2866,8 +2860,6 @@ QRect QCommonStyle::subElementRect(SubElement sr, const QStyleOption *opt,
QSize size = (sr == SE_TabBarTabLeftButton) ? tab->leftButtonSize : tab->rightButtonSize;
int w = size.width();
int h = size.height();
- int midHeight = static_cast<int>(qCeil(float(tr.height() - h) / 2));
- int midWidth = ((tr.width() - w) / 2);
bool atTheTop = true;
switch (tab->shape) {
@@ -2879,14 +2871,19 @@ QRect QCommonStyle::subElementRect(SubElement sr, const QStyleOption *opt,
case QTabBar::TriangularEast:
atTheTop = (sr == SE_TabBarTabRightButton);
break;
- default:
+ default: {
+ const int midHeight =
+ tr.y() + static_cast<int>(qCeil(float(tr.height() - h) / 2));
if (sr == SE_TabBarTabLeftButton)
r = QRect(tab->rect.x() + hpadding, midHeight, w, h);
else
r = QRect(tab->rect.right() - w - hpadding, midHeight, w, h);
r = visualRect(tab->direction, tab->rect, r);
+ break;
+ }
}
if (verticalTabs) {
+ const int midWidth = tr.x() + ((tr.width() - w) / 2);
if (atTheTop)
r = QRect(midWidth, tr.y() + tab->rect.height() - hpadding - h, w, h);
else
@@ -4209,20 +4206,19 @@ QRect QCommonStyle::subControlRect(ComplexControl cc, const QStyleOptionComplex
#if QT_CONFIG(toolbutton)
case CC_ToolButton:
if (const QStyleOptionToolButton *tb = qstyleoption_cast<const QStyleOptionToolButton *>(opt)) {
- int mbi = proxy()->pixelMetric(PM_MenuButtonIndicator, tb, widget);
ret = tb->rect;
switch (sc) {
case SC_ToolButton:
- if ((tb->features
- & (QStyleOptionToolButton::MenuButtonPopup | QStyleOptionToolButton::PopupDelay))
- == QStyleOptionToolButton::MenuButtonPopup)
+ if (tb->features.testFlag(QStyleOptionToolButton::MenuButtonPopup)) {
+ const int mbi = proxy()->pixelMetric(PM_MenuButtonIndicator, tb, widget);
ret.adjust(0, 0, -mbi, 0);
+ }
break;
case SC_ToolButtonMenu:
- if ((tb->features
- & (QStyleOptionToolButton::MenuButtonPopup | QStyleOptionToolButton::PopupDelay))
- == QStyleOptionToolButton::MenuButtonPopup)
+ if (tb->features.testFlag(QStyleOptionToolButton::MenuButtonPopup)) {
+ const int mbi = proxy()->pixelMetric(PM_MenuButtonIndicator, tb, widget);
ret.adjust(ret.width() - mbi, 0, 0, 0);
+ }
break;
default:
break;