summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mkspecs/common/macx.conf2
-rw-r--r--mkspecs/features/mac/default_post.prf10
-rw-r--r--src/android/templates/build.gradle2
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qregularexpression.cpp5
-rw-r--r--src/corelib/itemmodels/qsortfilterproxymodel.cpp1
-rw-r--r--src/corelib/itemmodels/qsortfilterproxymodel.h4
-rw-r--r--src/corelib/kernel/qcoreapplication.cpp4
-rw-r--r--src/corelib/thread/qthread_p.h3
-rw-r--r--src/corelib/thread/qthread_win.cpp35
-rw-r--r--src/gui/painting/qcolorprofile_p.h156
-rw-r--r--src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm10
-rw-r--r--src/plugins/platforms/cocoa/qcocoaglcontext.h3
-rw-r--r--src/plugins/platforms/cocoa/qcocoaglcontext.mm37
-rw-r--r--src/plugins/platforms/cocoa/qcocoakeymapper.h13
-rw-r--r--src/plugins/platforms/cocoa/qcocoakeymapper.mm19
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_brcm/eglfs_brcm.pro1
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/eglfs_kms.pro1
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/eglfs_kms_egldevice.pro1
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/eglfs_kms_support.pro1
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_vsp2/eglfs_kms_vsp2.pro1
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_mali/eglfs_mali.pro1
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_rcar/eglfs_rcar.pro1
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_viv/eglfs_viv.pro1
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_viv_wl/eglfs_viv_wl.pro1
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/eglfs_x11.pro1
-rw-r--r--src/plugins/platforms/eglfs/eglfsdeviceintegration.pro2
-rw-r--r--src/plugins/platforms/wasm/qwasmeventtranslator.cpp29
-rw-r--r--src/plugins/platforms/windows/qwindowspointerhandler.cpp58
-rw-r--r--src/sql/doc/snippets/code/doc_src_sql-driver.cpp2
-rw-r--r--src/sql/doc/snippets/code/src_sql_kernel_qsqldriver.cpp12
-rw-r--r--src/sql/doc/snippets/code/src_sql_kernel_qsqlresult.cpp12
-rw-r--r--src/tools/uic/cpp/cppwriteinitialization.cpp4
-rw-r--r--src/widgets/accessible/itemviews.cpp8
-rw-r--r--src/widgets/dialogs/qcolordialog.cpp1
-rw-r--r--src/widgets/dialogs/qfiledialog.cpp2
-rw-r--r--src/widgets/dialogs/qfontdialog.cpp1
-rw-r--r--src/widgets/dialogs/qinputdialog.cpp1
-rw-r--r--src/widgets/dialogs/qmessagebox.cpp2
-rw-r--r--src/widgets/dialogs/qprogressdialog.cpp1
-rw-r--r--src/widgets/graphicsview/qgraphicsitem.cpp2
-rw-r--r--src/widgets/graphicsview/qgraphicsscene.cpp91
-rw-r--r--src/widgets/graphicsview/qgraphicsscene.h4
-rw-r--r--src/widgets/graphicsview/qgraphicsscene_p.h3
-rw-r--r--src/widgets/itemviews/qtreeview.cpp7
-rw-r--r--src/widgets/kernel/qapplication.cpp5
-rw-r--r--src/widgets/kernel/qgesturemanager.cpp2
-rw-r--r--src/widgets/kernel/qgesturemanager_p.h4
-rw-r--r--src/widgets/kernel/qwidget.cpp9
-rw-r--r--src/widgets/styles/qstylesheetstyle.cpp43
-rw-r--r--src/widgets/styles/qstylesheetstyle_p.h1
-rw-r--r--src/widgets/widgets/qdockwidget.cpp8
-rw-r--r--src/widgets/widgets/qlineedit.cpp5
-rw-r--r--src/widgets/widgets/qlineedit_p.cpp2
-rw-r--r--src/widgets/widgets/qmenu.cpp2
-rw-r--r--src/widgets/widgets/qmenubar.cpp2
-rw-r--r--src/widgets/widgets/qplaintextedit.cpp6
-rw-r--r--src/widgets/widgets/qtabwidget.cpp2
-rw-r--r--src/widgets/widgets/qtextedit.cpp6
-rw-r--r--src/widgets/widgets/qtoolbar.cpp2
-rw-r--r--tests/auto/corelib/itemmodels/qsortfilterproxymodel_regexp/tst_qsortfilterproxymodel_regexp.cpp10
-rw-r--r--tests/auto/opengl/qgl/BLACKLIST2
-rw-r--r--tests/auto/tools/uic/baseline/buttongroup.ui.h20
-rw-r--r--tests/auto/tools/uic/baseline/qpagesetupwidget.ui.h14
-rw-r--r--tests/auto/tools/uic/baseline/qtgradienteditor.ui.h30
-rw-r--r--tests/auto/tools/uic/baseline/validators.ui.h14
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp36
-rw-r--r--tests/auto/widgets/styles/qstylesheetstyle/images/testimage.pngbin299 -> 300 bytes
-rw-r--r--tests/auto/widgets/styles/qstylesheetstyle/images/testimage@2x.pngbin0 -> 318 bytes
-rw-r--r--tests/auto/widgets/styles/qstylesheetstyle/resources.qrc1
-rw-r--r--tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp33
70 files changed, 579 insertions, 236 deletions
diff --git a/mkspecs/common/macx.conf b/mkspecs/common/macx.conf
index 6e95112f9b..d61ad33351 100644
--- a/mkspecs/common/macx.conf
+++ b/mkspecs/common/macx.conf
@@ -7,7 +7,7 @@ QMAKE_MAC_SDK = macosx
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.12
QMAKE_APPLE_DEVICE_ARCHS = x86_64
-QT_MAC_SDK_VERSION_TESTED_WITH = 10.13
+QT_MAC_SDK_VERSION_TESTED_WITH = 10.14
device.sdk = macosx
device.target = device
diff --git a/mkspecs/features/mac/default_post.prf b/mkspecs/features/mac/default_post.prf
index 353fda41e6..ae17f076a3 100644
--- a/mkspecs/features/mac/default_post.prf
+++ b/mkspecs/features/mac/default_post.prf
@@ -18,18 +18,16 @@ contains(TEMPLATE, .*app) {
!isEmpty($$list($$(QT_MAC_SDK_NO_VERSION_CHECK))): \
CONFIG += sdk_no_version_check
- !sdk_no_version_check:!versionAtMost(QMAKE_MAC_SDK_VERSION, $$QT_MAC_SDK_VERSION_TESTED_WITH) {
+ QMAKE_MAC_SDK_MAJOR_MINOR_VERSION = $$replace(QMAKE_MAC_SDK_VERSION, "(\d+)(\.\d+)(\.\d+)?", \1\2)
+
+ !sdk_no_version_check:!versionAtMost(QMAKE_MAC_SDK_MAJOR_MINOR_VERSION, $$QT_MAC_SDK_VERSION_TESTED_WITH) {
warning("Qt has only been tested with version $$QT_MAC_SDK_VERSION_TESTED_WITH"\
- "of the platform SDK, you're using $${QMAKE_MAC_SDK_VERSION}.")
+ "of the platform SDK, you're using $${QMAKE_MAC_SDK_MAJOR_MINOR_VERSION}.")
warning("This is an unsupported configuration. You may experience build issues," \
"and by using")
warning("the $$QMAKE_MAC_SDK_VERSION SDK you are opting in to new features" \
"that Qt has not been prepared for.")
- isEqual(QMAKE_MAC_SDK_VERSION, 10.14): \
- warning("E.g., 10.14 enables dark mode and layer-backed views," \
- "which Qt $${QT_MAJOR_VERSION}.$${QT_MINOR_VERSION} does not support.")
-
warning("Please downgrade the SDK you use to build your app to version" \
"$$QT_MAC_SDK_VERSION_TESTED_WITH, or configure")
warning("with CONFIG+=sdk_no_version_check when running qmake" \
diff --git a/src/android/templates/build.gradle b/src/android/templates/build.gradle
index 8affd3c0b4..bf5ce1388a 100644
--- a/src/android/templates/build.gradle
+++ b/src/android/templates/build.gradle
@@ -5,7 +5,7 @@ buildscript {
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.0.1'
+ classpath 'com.android.tools.build:gradle:3.2.0'
}
}
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qregularexpression.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qregularexpression.cpp
index 28c66628b7..b5d8320bce 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qregularexpression.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qregularexpression.cpp
@@ -353,7 +353,10 @@ while (i.hasNext()) {
{
//! [31]
QString wildcard = QRegularExpression::wildcardToRegularExpression("*.jpeg");
-// wilcard == ".*\.jpeg"
+// Will match files with names like:
+// foo.jpeg
+// f_o_o.jpeg
+// föö.jpeg
//! [31]
}
diff --git a/src/corelib/itemmodels/qsortfilterproxymodel.cpp b/src/corelib/itemmodels/qsortfilterproxymodel.cpp
index 5d1a916df0..2ae4e4d5ee 100644
--- a/src/corelib/itemmodels/qsortfilterproxymodel.cpp
+++ b/src/corelib/itemmodels/qsortfilterproxymodel.cpp
@@ -2731,6 +2731,7 @@ void QSortFilterProxyModel::setFilterRegExp(const QString &pattern)
Q_D(QSortFilterProxyModel);
d->filter_about_to_be_changed();
QRegExp rx(pattern);
+ rx.setCaseSensitivity(d->filter_data.caseSensitivity());
d->filter_data.setRegExp(rx);
d->filter_changed();
}
diff --git a/src/corelib/itemmodels/qsortfilterproxymodel.h b/src/corelib/itemmodels/qsortfilterproxymodel.h
index 1304a95d13..0be8b88672 100644
--- a/src/corelib/itemmodels/qsortfilterproxymodel.h
+++ b/src/corelib/itemmodels/qsortfilterproxymodel.h
@@ -88,11 +88,9 @@ public:
QItemSelection mapSelectionFromSource(const QItemSelection &sourceSelection) const override;
QRegExp filterRegExp() const;
- void setFilterRegExp(const QRegExp &regExp);
#if QT_CONFIG(regularexpression)
QRegularExpression filterRegularExpression() const;
- void setFilterRegularExpression(const QRegularExpression &regularExpression);
#endif
int filterKeyColumn() const;
@@ -124,8 +122,10 @@ public:
public Q_SLOTS:
void setFilterRegExp(const QString &pattern);
+ void setFilterRegExp(const QRegExp &regExp);
#if QT_CONFIG(regularexpression)
void setFilterRegularExpression(const QString &pattern);
+ void setFilterRegularExpression(const QRegularExpression &regularExpression);
#endif
void setFilterWildcard(const QString &pattern);
void setFilterFixedString(const QString &pattern);
diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp
index 1350a7aa94..463e30e1c3 100644
--- a/src/corelib/kernel/qcoreapplication.cpp
+++ b/src/corelib/kernel/qcoreapplication.cpp
@@ -482,6 +482,10 @@ QCoreApplicationPrivate::QCoreApplicationPrivate(int &aargc, char **aargv, uint
qFatal("FATAL: The application binary appears to be running setuid, this is a security hole.");
# endif // Q_OS_UNIX
+#ifdef Q_OS_WINRT
+ QThreadData::setMainThread();
+#endif
+
QThread *cur = QThread::currentThread(); // note: this may end up setting theMainThread!
if (cur != theMainThread)
qWarning("WARNING: QApplication was not created in the main() thread.");
diff --git a/src/corelib/thread/qthread_p.h b/src/corelib/thread/qthread_p.h
index 64e3f33191..7d9442ab79 100644
--- a/src/corelib/thread/qthread_p.h
+++ b/src/corelib/thread/qthread_p.h
@@ -243,6 +243,9 @@ public:
~QThreadData();
static Q_AUTOTEST_EXPORT QThreadData *current(bool createIfNecessary = true);
+#ifdef Q_OS_WINRT
+ static void setMainThread();
+#endif
static void clearCurrentThreadData();
static QThreadData *get2(QThread *thread)
{ Q_ASSERT_X(thread != 0, "QThread", "internal error"); return thread->d_func()->data; }
diff --git a/src/corelib/thread/qthread_win.cpp b/src/corelib/thread/qthread_win.cpp
index eebaf90d9b..e04d27d7b6 100644
--- a/src/corelib/thread/qthread_win.cpp
+++ b/src/corelib/thread/qthread_win.cpp
@@ -140,11 +140,15 @@ QThreadData *QThreadData::current(bool createIfNecessary)
threadData->isAdopted = true;
threadData->threadId.store(reinterpret_cast<Qt::HANDLE>(quintptr(GetCurrentThreadId())));
+#ifndef Q_OS_WINRT
if (!QCoreApplicationPrivate::theMainThread) {
QCoreApplicationPrivate::theMainThread = threadData->thread.load();
- // TODO: is there a way to reflect the branch's behavior using
- // WinRT API?
} else {
+#else
+ // for winrt the main thread is set explicitly in QCoreApplication's constructor as the
+ // native main thread (Xaml thread) is not Qt's main thread.
+ {
+#endif
HANDLE realHandle = INVALID_HANDLE_VALUE;
DuplicateHandle(GetCurrentProcess(),
GetCurrentThread(),
@@ -159,6 +163,33 @@ QThreadData *QThreadData::current(bool createIfNecessary)
return threadData;
}
+#ifdef Q_OS_WINRT
+void QThreadData::setMainThread()
+{
+ Q_ASSERT(!QCoreApplicationPrivate::theMainThread);
+ qt_create_tls();
+ QThreadData *threadData = reinterpret_cast<QThreadData *>(TlsGetValue(qt_current_thread_data_tls_index));
+ if (!threadData) {
+ threadData = new QThreadData;
+ // This needs to be called prior to new AdoptedThread() to
+ // avoid recursion.
+ TlsSetValue(qt_current_thread_data_tls_index, threadData);
+ QT_TRY {
+ threadData->thread = new QAdoptedThread(threadData);
+ } QT_CATCH(...) {
+ TlsSetValue(qt_current_thread_data_tls_index, 0);
+ threadData->deref();
+ threadData = 0;
+ QT_RETHROW;
+ }
+ threadData->deref();
+ threadData->isAdopted = true;
+ threadData->threadId.store(reinterpret_cast<Qt::HANDLE>(quintptr(GetCurrentThreadId())));
+ }
+ QCoreApplicationPrivate::theMainThread = threadData->thread.load();
+}
+#endif
+
void QAdoptedThread::init()
{
d_func()->handle = GetCurrentThread();
diff --git a/src/gui/painting/qcolorprofile_p.h b/src/gui/painting/qcolorprofile_p.h
index ca1786ee6d..425e9abace 100644
--- a/src/gui/painting/qcolorprofile_p.h
+++ b/src/gui/painting/qcolorprofile_p.h
@@ -55,6 +55,11 @@
#include <QtGui/qrgb.h>
#include <QtGui/qrgba64.h>
+#if defined(__SSE2__)
+#include <emmintrin.h>
+#elif defined(__ARM_NEON__) || defined(__ARM_NEON)
+#include <arm_neon.h>
+#endif
QT_BEGIN_NAMESPACE
class Q_GUI_EXPORT QColorProfile
@@ -67,82 +72,165 @@ public:
QRgba64 toLinear64(QRgb rgb32) const
{
- ushort r = m_toLinear[qRed(rgb32) << 4];
- ushort g = m_toLinear[qGreen(rgb32) << 4];
- ushort b = m_toLinear[qBlue(rgb32) << 4];
+#if defined(__SSE2__)
+ __m128i v = _mm_cvtsi32_si128(rgb32);
+ v = _mm_unpacklo_epi8(v, _mm_setzero_si128());
+ const __m128i vidx = _mm_slli_epi16(v, 4);
+ const int ridx = _mm_extract_epi16(vidx, 2);
+ const int gidx = _mm_extract_epi16(vidx, 1);
+ const int bidx = _mm_extract_epi16(vidx, 0);
+ v = _mm_slli_epi16(v, 8); // a * 256
+ v = _mm_insert_epi16(v, m_toLinear[ridx], 0);
+ v = _mm_insert_epi16(v, m_toLinear[gidx], 1);
+ v = _mm_insert_epi16(v, m_toLinear[bidx], 2);
+ v = _mm_add_epi16(v, _mm_srli_epi16(v, 8));
+ QRgba64 rgba64;
+ _mm_storel_epi64(reinterpret_cast<__m128i *>(&rgba64), v);
+ return rgba64;
+#elif (defined(__ARM_NEON__) || defined(__ARM_NEON)) && Q_BYTE_ORDER == Q_LITTLE_ENDIAN
+ uint8x8_t v8 = vreinterpret_u8_u32(vmov_n_u32(rgb32));
+ uint16x4_t v16 = vget_low_u16(vmovl_u8(v8));
+ const uint16x4_t vidx = vshl_n_u16(v16, 4);
+ const int ridx = vget_lane_u16(vidx, 2);
+ const int gidx = vget_lane_u16(vidx, 1);
+ const int bidx = vget_lane_u16(vidx, 0);
+ v16 = vshl_n_u16(v16, 8); // a * 256
+ v16 = vset_lane_u16(m_toLinear[ridx], v16, 0);
+ v16 = vset_lane_u16(m_toLinear[gidx], v16, 1);
+ v16 = vset_lane_u16(m_toLinear[bidx], v16, 2);
+ v16 = vadd_u16(v16, vshr_n_u16(v16, 8));
+ return QRgba64::fromRgba64(vget_lane_u64(vreinterpret_u64_u16(v16), 0));
+#else
+ uint r = m_toLinear[qRed(rgb32) << 4];
+ uint g = m_toLinear[qGreen(rgb32) << 4];
+ uint b = m_toLinear[qBlue(rgb32) << 4];
r = r + (r >> 8);
g = g + (g >> 8);
b = b + (b >> 8);
return QRgba64::fromRgba64(r, g, b, qAlpha(rgb32) * 257);
+#endif
}
QRgb toLinear(QRgb rgb32) const
{
- uchar r = (m_toLinear[qRed(rgb32) << 4] + 0x80) >> 8;
- uchar g = (m_toLinear[qGreen(rgb32) << 4] + 0x80) >> 8;
- uchar b = (m_toLinear[qBlue(rgb32) << 4] + 0x80) >> 8;
- return qRgba(r, g, b, qAlpha(rgb32));
+ return convertWithTable(rgb32, m_toLinear);
}
QRgba64 toLinear(QRgba64 rgb64) const
{
- ushort r = rgb64.red();
- ushort g = rgb64.green();
- ushort b = rgb64.blue();
- r = r - (r >> 8);
- g = g - (g >> 8);
- b = b - (b >> 8);
- r = m_toLinear[r >> 4];
- g = m_toLinear[g >> 4];
- b = m_toLinear[b >> 4];
- r = r + (r >> 8);
- g = g + (g >> 8);
- b = b + (b >> 8);
- return QRgba64::fromRgba64(r, g, b, rgb64.alpha());
+ return convertWithTable(rgb64, m_toLinear);
}
QRgb fromLinear64(QRgba64 rgb64) const
{
- ushort r = rgb64.red();
- ushort g = rgb64.green();
- ushort b = rgb64.blue();
+#if defined(__SSE2__)
+ __m128i v = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(&rgb64));
+ v = _mm_sub_epi16(v, _mm_srli_epi16(v, 8));
+ const __m128i vidx = _mm_srli_epi16(v, 4);
+ const int ridx = _mm_extract_epi16(vidx, 0);
+ const int gidx = _mm_extract_epi16(vidx, 1);
+ const int bidx = _mm_extract_epi16(vidx, 2);
+ v = _mm_insert_epi16(v, m_fromLinear[ridx], 2);
+ v = _mm_insert_epi16(v, m_fromLinear[gidx], 1);
+ v = _mm_insert_epi16(v, m_fromLinear[bidx], 0);
+ v = _mm_add_epi16(v, _mm_set1_epi16(0x80));
+ v = _mm_srli_epi16(v, 8);
+ v = _mm_packus_epi16(v, v);
+ return _mm_cvtsi128_si32(v);
+#elif (defined(__ARM_NEON__) || defined(__ARM_NEON)) && Q_BYTE_ORDER == Q_LITTLE_ENDIAN
+ uint16x4_t v = vreinterpret_u16_u64(vmov_n_u64(rgb64));
+ v = vsub_u16(v, vshr_n_u16(v, 8));
+ const uint16x4_t vidx = vshr_n_u16(v, 4);
+ const int ridx = vget_lane_u16(vidx, 0);
+ const int gidx = vget_lane_u16(vidx, 1);
+ const int bidx = vget_lane_u16(vidx, 2);
+ v = vset_lane_u16(m_fromLinear[ridx], v, 2);
+ v = vset_lane_u16(m_fromLinear[gidx], v, 1);
+ v = vset_lane_u16(m_fromLinear[bidx], v, 0);
+ uint8x8_t v8 = vrshrn_n_u16(vcombine_u16(v, v), 8);
+ return vget_lane_u32(vreinterpret_u32_u8(v8), 0);
+#else
+ uint a = rgb64.alpha();
+ uint r = rgb64.red();
+ uint g = rgb64.green();
+ uint b = rgb64.blue();
+ a = a - (a >> 8);
r = r - (r >> 8);
g = g - (g >> 8);
b = b - (b >> 8);
+ a = (a + 0x80) >> 8;
r = (m_fromLinear[r >> 4] + 0x80) >> 8;
g = (m_fromLinear[g >> 4] + 0x80) >> 8;
b = (m_fromLinear[b >> 4] + 0x80) >> 8;
- return qRgba(r, g, b, rgb64.alpha8());
+ return (a << 24) | (r << 16) | (g << 8) | b;
+#endif
}
QRgb fromLinear(QRgb rgb32) const
{
- uchar r = (m_fromLinear[qRed(rgb32) << 4] + 0x80) >> 8;
- uchar g = (m_fromLinear[qGreen(rgb32) << 4] + 0x80) >> 8;
- uchar b = (m_fromLinear[qBlue(rgb32) << 4] + 0x80) >> 8;
- return qRgba(r, g, b, qAlpha(rgb32));
+ return convertWithTable(rgb32, m_fromLinear);
}
QRgba64 fromLinear(QRgba64 rgb64) const
{
+ return convertWithTable(rgb64, m_fromLinear);
+ }
+
+private:
+ QColorProfile() { }
+
+ Q_ALWAYS_INLINE static QRgb convertWithTable(QRgb rgb32, const ushort *table)
+ {
+ const int r = (table[qRed(rgb32) << 4] + 0x80) >> 8;
+ const int g = (table[qGreen(rgb32) << 4] + 0x80) >> 8;
+ const int b = (table[qBlue(rgb32) << 4] + 0x80) >> 8;
+ return (rgb32 & 0xff000000) | (r << 16) | (g << 8) | b;
+ }
+ Q_ALWAYS_INLINE static QRgba64 convertWithTable(QRgba64 rgb64, const ushort *table)
+ {
+#if defined(__SSE2__)
+ __m128i v = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(&rgb64));
+ v = _mm_sub_epi16(v, _mm_srli_epi16(v, 8));
+ const __m128i vidx = _mm_srli_epi16(v, 4);
+ const int ridx = _mm_extract_epi16(vidx, 2);
+ const int gidx = _mm_extract_epi16(vidx, 1);
+ const int bidx = _mm_extract_epi16(vidx, 0);
+ v = _mm_insert_epi16(v, table[ridx], 2);
+ v = _mm_insert_epi16(v, table[gidx], 1);
+ v = _mm_insert_epi16(v, table[bidx], 0);
+ v = _mm_add_epi16(v, _mm_srli_epi16(v, 8));
+ QRgba64 rgba64;
+ _mm_storel_epi64(reinterpret_cast<__m128i *>(&rgba64), v);
+ return rgba64;
+#elif (defined(__ARM_NEON__) || defined(__ARM_NEON)) && Q_BYTE_ORDER == Q_LITTLE_ENDIAN
+ uint16x4_t v = vreinterpret_u16_u64(vmov_n_u64(rgb64));
+ v = vsub_u16(v, vshr_n_u16(v, 8));
+ const uint16x4_t vidx = vshr_n_u16(v, 4);
+ const int ridx = vget_lane_u16(vidx, 2);
+ const int gidx = vget_lane_u16(vidx, 1);
+ const int bidx = vget_lane_u16(vidx, 0);
+ v = vset_lane_u16(table[ridx], v, 2);
+ v = vset_lane_u16(table[gidx], v, 1);
+ v = vset_lane_u16(table[bidx], v, 0);
+ v = vadd_u16(v, vshr_n_u16(v, 8));
+ return QRgba64::fromRgba64(vget_lane_u64(vreinterpret_u64_u16(v), 0));
+#else
ushort r = rgb64.red();
ushort g = rgb64.green();
ushort b = rgb64.blue();
r = r - (r >> 8);
g = g - (g >> 8);
b = b - (b >> 8);
- r = m_fromLinear[r >> 4];
- g = m_fromLinear[g >> 4];
- b = m_fromLinear[b >> 4];
+ r = table[r >> 4];
+ g = table[g >> 4];
+ b = table[b >> 4];
r = r + (r >> 8);
g = g + (g >> 8);
b = b + (b >> 8);
return QRgba64::fromRgba64(r, g, b, rgb64.alpha());
+#endif
}
-private:
- QColorProfile() { }
-
// We translate to 0-65280 (255*256) instead to 0-65535 to make simple
// shifting an accurate conversion.
// We translate from 0-4080 (255*16) for the same speed up, and to keep
diff --git a/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm b/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm
index 33b102f3eb..8c0af97a68 100644
--- a/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm
+++ b/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm
@@ -108,8 +108,6 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSFontPanelDelegate);
[mFontPanel setRestorable:NO];
[mFontPanel setDelegate:self];
- [NSFontManager sharedFontManager].target = self; // Action is changeFont:
-
[mFontPanel retain];
}
return self;
@@ -119,7 +117,6 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSFontPanelDelegate);
{
[mStolenContentView release];
[mFontPanel setDelegate:nil];
- [NSFontManager sharedFontManager].target = nil;
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
@@ -224,6 +221,13 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSFontPanelDelegate);
return (mResultCode == NSModalResponseOK);
}
+// Future proofing in case _NSTargetForSendAction checks this
+// property before sending us the changeFont: message.
+- (BOOL)worksWhenModal
+{
+ return YES;
+}
+
- (QPlatformDialogHelper::DialogCode)dialogResultCode
{
return (mResultCode == NSModalResponseOK) ? QPlatformDialogHelper::Accepted : QPlatformDialogHelper::Rejected;
diff --git a/src/plugins/platforms/cocoa/qcocoaglcontext.h b/src/plugins/platforms/cocoa/qcocoaglcontext.h
index cef5892989..eefb1cd0fb 100644
--- a/src/plugins/platforms/cocoa/qcocoaglcontext.h
+++ b/src/plugins/platforms/cocoa/qcocoaglcontext.h
@@ -41,6 +41,7 @@
#define QCOCOAGLCONTEXT_H
#include <QtCore/QPointer>
+#include <QtCore/private/qcore_mac_p.h>
#include <qpa/qplatformopenglcontext.h>
#include <QtGui/QOpenGLContext>
#include <QtGui/QWindow>
@@ -79,6 +80,8 @@ private:
NSOpenGLContext *m_shareContext = nil;
QSurfaceFormat m_format;
bool m_didCheckForSoftwareContext = false;
+ QVarLengthArray<QMacScopedObserver, 3> m_updateObservers;
+ QAtomicInt m_needsUpdate = false;
};
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qcocoaglcontext.mm b/src/plugins/platforms/cocoa/qcocoaglcontext.mm
index 069429796e..1e1b3907ed 100644
--- a/src/plugins/platforms/cocoa/qcocoaglcontext.mm
+++ b/src/plugins/platforms/cocoa/qcocoaglcontext.mm
@@ -41,7 +41,6 @@
#include "qcocoawindow.h"
#include "qcocoahelpers.h"
#include <qdebug.h>
-#include <QtCore/private/qcore_mac_p.h>
#include <QtPlatformHeaders/qcocoanativecontext.h>
#include <dlfcn.h>
@@ -351,7 +350,8 @@ bool QCocoaGLContext::makeCurrent(QPlatformSurface *surface)
}
}
- update();
+ if (m_needsUpdate.fetchAndStoreRelaxed(false))
+ update();
}
return true;
@@ -383,13 +383,44 @@ bool QCocoaGLContext::setDrawable(QPlatformSurface *surface)
if (view == m_context.view)
return true;
+ // Setting the drawable may happen on a separate thread as a result of
+ // a call to makeCurrent, so we need to set up the observers before we
+ // associate the view with the context. That way we will guarantee that
+ // as long as the view is the drawable of the context we will know about
+ // any updates to the view that require surface invalidation.
+
+ auto updateCallback = [this, view]() {
+ Q_ASSERT(QThread::currentThread() == qApp->thread());
+ if (m_context.view != view)
+ return;
+ m_needsUpdate = true;
+ };
+
+ m_updateObservers.clear();
+
+ if (view.layer) {
+ m_updateObservers.append(QMacScopedObserver(view, NSViewFrameDidChangeNotification, updateCallback));
+ m_updateObservers.append(QMacScopedObserver(view.window, NSWindowDidChangeScreenNotification, updateCallback));
+ } else {
+ m_updateObservers.append(QMacScopedObserver(view, NSViewGlobalFrameDidChangeNotification, updateCallback));
+ }
+
+ m_updateObservers.append(QMacScopedObserver([NSApplication sharedApplication],
+ NSApplicationDidChangeScreenParametersNotification, updateCallback));
+
+ // If any of the observers fire at this point it's fine. We check the
+ // view association (atomically) in the update callback, and skip the
+ // update if we haven't associated yet. Setting the drawable below will
+ // have the same effect as an update.
+
+ // Now we are ready to associate the view with the context
if ((m_context.view = view) != view) {
qCInfo(lcQpaOpenGLContext) << "Failed to set" << view << "as drawable for" << m_context;
+ m_updateObservers.clear();
return false;
}
qCInfo(lcQpaOpenGLContext) << "Set drawable for" << m_context << "to" << m_context.view;
-
return true;
}
diff --git a/src/plugins/platforms/cocoa/qcocoakeymapper.h b/src/plugins/platforms/cocoa/qcocoakeymapper.h
index a75e275077..2624f19978 100644
--- a/src/plugins/platforms/cocoa/qcocoakeymapper.h
+++ b/src/plugins/platforms/cocoa/qcocoakeymapper.h
@@ -89,15 +89,12 @@ public:
void clearMappings();
private:
- QCFType<TISInputSourceRef> currentInputSource;
+ QCFType<TISInputSourceRef> currentInputSource = nullptr;
- enum { NullMode, UnicodeMode, OtherMode } keyboard_mode;
- union {
- const UCKeyboardLayout *unicode;
- void *other;
- } keyboard_layout_format;
- KeyboardLayoutKind keyboard_kind;
- UInt32 keyboard_dead;
+ enum { NullMode, UnicodeMode, OtherMode } keyboard_mode = NullMode;
+ const UCKeyboardLayout *keyboard_layout_format = nullptr;
+ KeyboardLayoutKind keyboard_kind = kKLKCHRuchrKind;
+ UInt32 keyboard_dead = 0;
KeyboardLayoutItem *keyLayout[256];
};
diff --git a/src/plugins/platforms/cocoa/qcocoakeymapper.mm b/src/plugins/platforms/cocoa/qcocoakeymapper.mm
index 5e279a400b..350ae4b9be 100644
--- a/src/plugins/platforms/cocoa/qcocoakeymapper.mm
+++ b/src/plugins/platforms/cocoa/qcocoakeymapper.mm
@@ -341,8 +341,6 @@ static int qt_mac_get_key(int modif, const QChar &key, int virtualKey)
QCocoaKeyMapper::QCocoaKeyMapper()
{
memset(keyLayout, 0, sizeof(keyLayout));
- keyboard_layout_format.unicode = 0;
- currentInputSource = 0;
}
QCocoaKeyMapper::~QCocoaKeyMapper()
@@ -371,12 +369,19 @@ bool QCocoaKeyMapper::updateKeyboard()
keyboard_kind = LMGetKbdType();
if (uchrData) {
- keyboard_layout_format.unicode = uchrData;
+ keyboard_layout_format = uchrData;
keyboard_mode = UnicodeMode;
+ } else {
+ keyboard_layout_format = nullptr;
+ keyboard_mode = NullMode;
}
currentInputSource = source;
keyboard_dead = 0;
+ const auto newMode = keyboard_mode;
+ deleteLayouts();
+ keyboard_mode = newMode;
+
return true;
}
@@ -399,10 +404,8 @@ void QCocoaKeyMapper::clearMappings()
void QCocoaKeyMapper::updateKeyMap(unsigned short macVirtualKey, QChar unicodeKey)
{
- if (updateKeyboard()) {
- // ### Qt 4 did this:
- // QKeyMapper::changeKeyboard();
- }
+ updateKeyboard();
+
if (keyLayout[macVirtualKey])
return;
@@ -414,7 +417,7 @@ void QCocoaKeyMapper::updateKeyMap(unsigned short macVirtualKey, QChar unicodeKe
keyLayout[macVirtualKey]->qtKey[i] = 0;
const UInt32 keyModifier = ((qt_mac_get_mac_modifiers(ModsTbl[i]) >> 8) & 0xFF);
- OSStatus err = UCKeyTranslate(keyboard_layout_format.unicode, macVirtualKey, kUCKeyActionDown, keyModifier,
+ OSStatus err = UCKeyTranslate(keyboard_layout_format, macVirtualKey, kUCKeyActionDown, keyModifier,
keyboard_kind, 0, &keyboard_dead, buffer_size, &out_buffer_size, buffer);
if (err == noErr && out_buffer_size) {
const QChar unicode(buffer[0]);
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_brcm/eglfs_brcm.pro b/src/plugins/platforms/eglfs/deviceintegration/eglfs_brcm/eglfs_brcm.pro
index fee67da2de..aa487be8c0 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_brcm/eglfs_brcm.pro
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_brcm/eglfs_brcm.pro
@@ -6,7 +6,6 @@ INCLUDEPATH += $$PWD/../../api
CONFIG += egl
LIBS += -lbcm_host
-QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF
# Avoid X11 header collision, use generic EGL native types
DEFINES += QT_EGL_NO_X11
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/eglfs_kms.pro b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/eglfs_kms.pro
index 43170a3875..f5c2c0ed89 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/eglfs_kms.pro
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/eglfs_kms.pro
@@ -13,7 +13,6 @@ DEFINES += QT_EGL_NO_X11
QMAKE_USE += gbm drm
CONFIG += egl
-QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF
SOURCES += $$PWD/qeglfskmsgbmmain.cpp \
$$PWD/qeglfskmsgbmintegration.cpp \
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/eglfs_kms_egldevice.pro b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/eglfs_kms_egldevice.pro
index 36f037ac6c..a6145c07e6 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/eglfs_kms_egldevice.pro
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/eglfs_kms_egldevice.pro
@@ -9,7 +9,6 @@ DEFINES += QT_EGL_NO_X11
QMAKE_USE += drm
CONFIG += egl
-QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF
SOURCES += $$PWD/qeglfskmsegldevicemain.cpp \
$$PWD/qeglfskmsegldeviceintegration.cpp \
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/eglfs_kms_support.pro b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/eglfs_kms_support.pro
index 4d1321079c..40806b6a9b 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/eglfs_kms_support.pro
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/eglfs_kms_support.pro
@@ -11,7 +11,6 @@ DEFINES += QT_EGL_NO_X11
QMAKE_USE += drm
CONFIG += egl
-QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF
SOURCES += $$PWD/qeglfskmsintegration.cpp \
$$PWD/qeglfskmsdevice.cpp \
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_vsp2/eglfs_kms_vsp2.pro b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_vsp2/eglfs_kms_vsp2.pro
index 826c2f989f..f63b768a38 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_vsp2/eglfs_kms_vsp2.pro
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_vsp2/eglfs_kms_vsp2.pro
@@ -13,7 +13,6 @@ DEFINES += QT_EGL_NO_X11
QMAKE_USE += gbm drm v4l2
CONFIG += egl
-QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF
SOURCES += $$PWD/qeglfskmsvsp2main.cpp \
$$PWD/qeglfskmsvsp2integration.cpp \
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_mali/eglfs_mali.pro b/src/plugins/platforms/eglfs/deviceintegration/eglfs_mali/eglfs_mali.pro
index 5e6f636e2b..3261a6dbba 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_mali/eglfs_mali.pro
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_mali/eglfs_mali.pro
@@ -7,7 +7,6 @@ DEFINES += QT_EGL_NO_X11
INCLUDEPATH += $$PWD/../../api
CONFIG += egl
-QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF
SOURCES += $$PWD/qeglfsmalimain.cpp \
$$PWD/qeglfsmaliintegration.cpp
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_rcar/eglfs_rcar.pro b/src/plugins/platforms/eglfs/deviceintegration/eglfs_rcar/eglfs_rcar.pro
index 04236449a0..62acd51cea 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_rcar/eglfs_rcar.pro
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_rcar/eglfs_rcar.pro
@@ -5,7 +5,6 @@ QT += core-private gui-private eglfsdeviceintegration-private
INCLUDEPATH += $$PWD/../../api
CONFIG += egl
DEFINES += LINUX=1 EGL_API_FB=1
-QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF
SOURCES += $$PWD/qeglfsrcarmain.cpp \
$$PWD/qeglfsrcarintegration.cpp
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_viv/eglfs_viv.pro b/src/plugins/platforms/eglfs/deviceintegration/eglfs_viv/eglfs_viv.pro
index f9cce8d48b..8d3be9c2ac 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_viv/eglfs_viv.pro
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_viv/eglfs_viv.pro
@@ -5,7 +5,6 @@ QT += core-private gui-private eglfsdeviceintegration-private
INCLUDEPATH += $$PWD/../../api
CONFIG += egl
DEFINES += LINUX=1 EGL_API_FB=1
-QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF
SOURCES += $$PWD/qeglfsvivmain.cpp \
$$PWD/qeglfsvivintegration.cpp
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_viv_wl/eglfs_viv_wl.pro b/src/plugins/platforms/eglfs/deviceintegration/eglfs_viv_wl/eglfs_viv_wl.pro
index 065a103376..45d73e1eb8 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_viv_wl/eglfs_viv_wl.pro
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_viv_wl/eglfs_viv_wl.pro
@@ -5,7 +5,6 @@ QT += core-private gui-private eglfsdeviceintegration-private
INCLUDEPATH += $$PWD/../../api
CONFIG += egl
DEFINES += LINUX=1 EGL_API_FB=1
-QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF
SOURCES += $$PWD/qeglfsvivwlmain.cpp \
$$PWD/qeglfsvivwlintegration.cpp
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/eglfs_x11.pro b/src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/eglfs_x11.pro
index 391f63615b..acbd1cc785 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/eglfs_x11.pro
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/eglfs_x11.pro
@@ -9,7 +9,6 @@ INCLUDEPATH += $$PWD/../../api
CONFIG += egl
QMAKE_USE += xcb_xlib
-QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF
SOURCES += $$PWD/qeglfsx11main.cpp \
$$PWD/qeglfsx11integration.cpp
diff --git a/src/plugins/platforms/eglfs/eglfsdeviceintegration.pro b/src/plugins/platforms/eglfs/eglfsdeviceintegration.pro
index 187cbc025f..8bb7b614f1 100644
--- a/src/plugins/platforms/eglfs/eglfsdeviceintegration.pro
+++ b/src/plugins/platforms/eglfs/eglfsdeviceintegration.pro
@@ -27,8 +27,6 @@ DEFINES += QT_BUILD_EGL_DEVICE_LIB
include($$PWD/api/api.pri)
-QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF
-
!isEmpty(EGLFS_PLATFORM_HOOKS_SOURCES) {
HEADERS += $$EGLFS_PLATFORM_HOOKS_HEADERS
SOURCES += $$EGLFS_PLATFORM_HOOKS_SOURCES
diff --git a/src/plugins/platforms/wasm/qwasmeventtranslator.cpp b/src/plugins/platforms/wasm/qwasmeventtranslator.cpp
index 95bedf701c..cc48c15b64 100644
--- a/src/plugins/platforms/wasm/qwasmeventtranslator.cpp
+++ b/src/plugins/platforms/wasm/qwasmeventtranslator.cpp
@@ -39,15 +39,27 @@
#include <QtCore/qobject.h>
#include <QtCore/qdeadlinetimer.h>
+#include <emscripten/bind.h>
#include <iostream>
QT_BEGIN_NAMESPACE
+using namespace emscripten;
// macOS CTRL <-> META switching. We most likely want to enable
// the existing switching code in QtGui, but for now do it here.
static bool g_usePlatformMacCtrlMetaSwitching = false;
+bool g_useNaturalScrolling = false;
+
+void setNaturalScrolling(bool use) {
+ g_useNaturalScrolling = use;
+}
+
+EMSCRIPTEN_BINDINGS(mouse_module) {
+ function("setNaturalScrolling", &setNaturalScrolling);
+}
+
QWasmEventTranslator::QWasmEventTranslator(QObject *parent)
: QObject(parent)
, draggedWindow(nullptr)
@@ -84,6 +96,20 @@ QWasmEventTranslator::QWasmEventTranslator(QObject *parent)
Platform(EM_ASM_INT("if (navigator.platform.includes(\"Mac\")) return 1; return 0;"));
g_usePlatformMacCtrlMetaSwitching = (platform == MacOSPlatform);
+
+ if (platform == MacOSPlatform) {
+ g_useNaturalScrolling = true; //make this default on macOS
+ EM_ASM(
+ if (window.safari !== undefined) {//this only works on safari
+ Module["canvas"].addEventListener('wheel', mouseWheelEvent);
+ function mouseWheelEvent(e) {
+ if (event.webkitDirectionInvertedFromDevice) {
+ Module.setNaturalScrolling(event.webkitDirectionInvertedFromDevice);
+ }
+ }
+ }
+ );
+ }
}
template <typename Event>
@@ -449,6 +475,9 @@ int QWasmEventTranslator::wheel_cb(int eventType, const EmscriptenWheelEvent *wh
break;
};
+ if (g_useNaturalScrolling) //macOS platform has document oriented scrolling
+ scrollFactor = -scrollFactor;
+
Qt::KeyboardModifiers modifiers = translateMouseEventModifier(&mouseEvent);
auto timestamp = mouseEvent.timestamp;
QPoint globalPoint(mouseEvent.canvasX, mouseEvent.canvasY);
diff --git a/src/plugins/platforms/windows/qwindowspointerhandler.cpp b/src/plugins/platforms/windows/qwindowspointerhandler.cpp
index 7ead14822a..c5acc38e7c 100644
--- a/src/plugins/platforms/windows/qwindowspointerhandler.cpp
+++ b/src/plugins/platforms/windows/qwindowspointerhandler.cpp
@@ -61,6 +61,8 @@
#include <QtCore/qloggingcategory.h>
#include <QtCore/qoperatingsystemversion.h>
+#include <algorithm>
+
#include <windowsx.h>
QT_BEGIN_NAMESPACE
@@ -184,41 +186,65 @@ static void getMouseEventInfo(UINT message, POINTER_BUTTON_CHANGE_TYPE changeTyp
{POINTER_CHANGE_FIFTHBUTTON_UP, Qt::XButton2},
};
- static const QHash<UINT, QEvent::Type> eventMapping {
- {WM_POINTERUPDATE, QEvent::MouseMove},
- {WM_POINTERDOWN, QEvent::MouseButtonPress},
- {WM_POINTERUP, QEvent::MouseButtonRelease},
- {WM_NCPOINTERUPDATE, QEvent::NonClientAreaMouseMove},
- {WM_NCPOINTERDOWN, QEvent::NonClientAreaMouseButtonPress},
- {WM_NCPOINTERUP, QEvent::NonClientAreaMouseButtonRelease},
- {WM_POINTERWHEEL, QEvent::Wheel},
- {WM_POINTERHWHEEL, QEvent::Wheel},
+ static const POINTER_BUTTON_CHANGE_TYPE downChanges[] = {
+ POINTER_CHANGE_FIRSTBUTTON_DOWN,
+ POINTER_CHANGE_SECONDBUTTON_DOWN,
+ POINTER_CHANGE_THIRDBUTTON_DOWN,
+ POINTER_CHANGE_FOURTHBUTTON_DOWN,
+ POINTER_CHANGE_FIFTHBUTTON_DOWN,
+ };
+
+ static const POINTER_BUTTON_CHANGE_TYPE upChanges[] = {
+ POINTER_CHANGE_FIRSTBUTTON_UP,
+ POINTER_CHANGE_SECONDBUTTON_UP,
+ POINTER_CHANGE_THIRDBUTTON_UP,
+ POINTER_CHANGE_FOURTHBUTTON_UP,
+ POINTER_CHANGE_FIFTHBUTTON_UP,
};
if (!eventType || !mouseButton)
return;
- if (message == WM_POINTERDOWN || message == WM_POINTERUP || message == WM_NCPOINTERDOWN || message == WM_NCPOINTERUP)
- *mouseButton = buttonMapping.value(changeType, Qt::NoButton);
- else
- *mouseButton = Qt::NoButton;
+ const bool nonClient = message == WM_NCPOINTERUPDATE ||
+ message == WM_NCPOINTERDOWN ||
+ message == WM_NCPOINTERUP;
+
+ if (std::find(std::begin(downChanges),
+ std::end(downChanges), changeType) < std::end(downChanges)) {
+ *eventType = nonClient ? QEvent::NonClientAreaMouseButtonPress :
+ QEvent::MouseButtonPress;
+ } else if (std::find(std::begin(upChanges),
+ std::end(upChanges), changeType) < std::end(upChanges)) {
+ *eventType = nonClient ? QEvent::NonClientAreaMouseButtonRelease :
+ QEvent::MouseButtonRelease;
+ } else if (message == WM_POINTERWHEEL || message == WM_POINTERHWHEEL) {
+ *eventType = QEvent::Wheel;
+ } else {
+ *eventType = nonClient ? QEvent::NonClientAreaMouseMove :
+ QEvent::MouseMove;
+ }
- *eventType = eventMapping.value(message, QEvent::None);
+ *mouseButton = buttonMapping.value(changeType, Qt::NoButton);
// Pointer messages lack a double click indicator. Check if this is the case here.
- if (message == WM_POINTERDOWN) {
+ if (*eventType == QEvent::MouseButtonPress ||
+ *eventType == QEvent::NonClientAreaMouseButtonPress) {
static LONG lastTime = 0;
static Qt::MouseButton lastButton = Qt::NoButton;
+ static QEvent::Type lastEvent = QEvent::None;
static QPoint lastPos;
LONG messageTime = GetMessageTime();
if (*mouseButton == lastButton
+ && *eventType == lastEvent
&& messageTime - lastTime < (LONG)GetDoubleClickTime()
&& qAbs(globalPos.x() - lastPos.x()) < GetSystemMetrics(SM_CXDOUBLECLK)
&& qAbs(globalPos.y() - lastPos.y()) < GetSystemMetrics(SM_CYDOUBLECLK)) {
- *eventType = QEvent::MouseButtonDblClick;
+ *eventType = nonClient ? QEvent::NonClientAreaMouseButtonDblClick :
+ QEvent::MouseButtonDblClick;
}
lastTime = messageTime;
lastButton = *mouseButton;
+ lastEvent = *eventType;
lastPos = globalPos;
}
}
diff --git a/src/sql/doc/snippets/code/doc_src_sql-driver.cpp b/src/sql/doc/snippets/code/doc_src_sql-driver.cpp
index 2c0e824db3..54576733bf 100644
--- a/src/sql/doc/snippets/code/doc_src_sql-driver.cpp
+++ b/src/sql/doc/snippets/code/doc_src_sql-driver.cpp
@@ -106,7 +106,7 @@ while (query.next()) {
QVariant v = query.result()->handle();
if (qstrcmp(v.typeName(), "PGresult*") == 0) {
PGresult *handle = *static_cast<PGresult **>(v.data());
- if (handle != 0) {
+ if (handle) {
// Do something...
}
}
diff --git a/src/sql/doc/snippets/code/src_sql_kernel_qsqldriver.cpp b/src/sql/doc/snippets/code/src_sql_kernel_qsqldriver.cpp
index ffae690769..a13cf86d3f 100644
--- a/src/sql/doc/snippets/code/src_sql_kernel_qsqldriver.cpp
+++ b/src/sql/doc/snippets/code/src_sql_kernel_qsqldriver.cpp
@@ -51,10 +51,10 @@
//! [0]
QSqlDatabase db = ...;
QVariant v = db.driver()->handle();
-if (v.isValid() && qstrcmp(v.typeName(), "sqlite3*")==0) {
+if (v.isValid() && qstrcmp(v.typeName(), "sqlite3*") == 0) {
// v.data() returns a pointer to the handle
sqlite3 *handle = *static_cast<sqlite3 **>(v.data());
- if (handle != 0) { // check that it is not NULL
+ if (handle) {
...
}
}
@@ -62,13 +62,13 @@ if (v.isValid() && qstrcmp(v.typeName(), "sqlite3*")==0) {
//! [1]
-if (qstrcmp(v.typeName(), "PGconn*")) {
+if (qstrcmp(v.typeName(), "PGconn*") == 0) {
PGconn *handle = *static_cast<PGconn **>(v.data());
- if (handle != 0) ...
+ if (handle) ...
}
-if (qstrcmp(v.typeName(), "MYSQL*")) {
+if (qstrcmp(v.typeName(), "MYSQL*") == 0) {
MYSQL *handle = *static_cast<MYSQL **>(v.data());
- if (handle != 0) ...
+ if (handle) ...
}
//! [1]
diff --git a/src/sql/doc/snippets/code/src_sql_kernel_qsqlresult.cpp b/src/sql/doc/snippets/code/src_sql_kernel_qsqlresult.cpp
index 3424a9140e..8ab2baf2a1 100644
--- a/src/sql/doc/snippets/code/src_sql_kernel_qsqlresult.cpp
+++ b/src/sql/doc/snippets/code/src_sql_kernel_qsqlresult.cpp
@@ -72,10 +72,10 @@ if (!q.execBatch())
//! [1]
QSqlQuery query = ...
QVariant v = query.result()->handle();
-if (v.isValid() && qstrcmp(v.typeName(), "sqlite3_stmt*")) {
+if (v.isValid() && qstrcmp(v.typeName(), "sqlite3_stmt*") == 0) {
// v.data() returns a pointer to the handle
sqlite3_stmt *handle = *static_cast<sqlite3_stmt **>(v.data());
- if (handle != 0) { // check that it is not NULL
+ if (handle) {
...
}
}
@@ -83,13 +83,13 @@ if (v.isValid() && qstrcmp(v.typeName(), "sqlite3_stmt*")) {
//! [2]
-if (v.typeName() == "PGresult*") {
+if (qstrcmp(v.typeName(), "PGresult*") == 0) {
PGresult *handle = *static_cast<PGresult **>(v.data());
- if (handle != 0) ...
+ if (handle) ...
}
-if (v.typeName() == "MYSQL_STMT*") {
+if (qstrcmp(v.typeName(), "MYSQL_STMT*") == 0) {
MYSQL_STMT *handle = *static_cast<MYSQL_STMT **>(v.data());
- if (handle != 0) ...
+ if (handle) ...
}
//! [2]
diff --git a/src/tools/uic/cpp/cppwriteinitialization.cpp b/src/tools/uic/cpp/cppwriteinitialization.cpp
index 6a0e2f0338..4f6ac1eb97 100644
--- a/src/tools/uic/cpp/cppwriteinitialization.cpp
+++ b/src/tools/uic/cpp/cppwriteinitialization.cpp
@@ -1405,10 +1405,10 @@ void WriteInitialization::writeProperties(const QString &varName,
propertyValue += QLatin1Char(')');
break;
case DomProperty::Float:
- propertyValue = QString::number(p->elementFloat());
+ propertyValue = QString::number(p->elementFloat(), 'f', 8);
break;
case DomProperty::Double:
- propertyValue = QString::number(p->elementDouble());
+ propertyValue = QString::number(p->elementDouble(), 'f', 15);
break;
case DomProperty::Char: {
const DomChar *c = p->elementChar();
diff --git a/src/widgets/accessible/itemviews.cpp b/src/widgets/accessible/itemviews.cpp
index 04a5dcc878..159d61d683 100644
--- a/src/widgets/accessible/itemviews.cpp
+++ b/src/widgets/accessible/itemviews.cpp
@@ -110,7 +110,7 @@ QAccessibleTable::QAccessibleTable(QWidget *w)
bool QAccessibleTable::isValid() const
{
- return (view() && !qobject_cast<QWidget*>(view())->d_func()->data.in_destructor);
+ return view() && !qt_widget_private(view())->data.in_destructor;
}
QAccessibleTable::~QAccessibleTable()
@@ -1091,7 +1091,8 @@ void QAccessibleTableCell::setText(QAccessible::Text /*t*/, const QString &text)
bool QAccessibleTableCell::isValid() const
{
- return view && view->model() && m_index.isValid();
+ return view && !qt_widget_private(view)->data.in_destructor
+ && view->model() && m_index.isValid();
}
QAccessibleInterface *QAccessibleTableCell::parent() const
@@ -1180,7 +1181,8 @@ void QAccessibleTableHeaderCell::setText(QAccessible::Text, const QString &)
bool QAccessibleTableHeaderCell::isValid() const
{
- return view && view->model() && (index >= 0)
+ return view && !qt_widget_private(view)->data.in_destructor
+ && view->model() && (index >= 0)
&& ((orientation == Qt::Horizontal) ? (index < view->model()->columnCount()) : (index < view->model()->rowCount()));
}
diff --git a/src/widgets/dialogs/qcolordialog.cpp b/src/widgets/dialogs/qcolordialog.cpp
index 434cedfdb9..4aa680af61 100644
--- a/src/widgets/dialogs/qcolordialog.cpp
+++ b/src/widgets/dialogs/qcolordialog.cpp
@@ -2123,7 +2123,6 @@ void QColorDialog::setVisible(bool visible)
}
/*!
- \overload
\since 4.5
Opens the dialog and connects its colorSelected() signal to the slot specified
diff --git a/src/widgets/dialogs/qfiledialog.cpp b/src/widgets/dialogs/qfiledialog.cpp
index 6b037726a0..870a833b34 100644
--- a/src/widgets/dialogs/qfiledialog.cpp
+++ b/src/widgets/dialogs/qfiledialog.cpp
@@ -802,8 +802,6 @@ QFileDialog::Options QFileDialog::options() const
}
/*!
- \overload
-
\since 4.5
This function connects one of its signals to the slot specified by \a receiver
diff --git a/src/widgets/dialogs/qfontdialog.cpp b/src/widgets/dialogs/qfontdialog.cpp
index 5f912c582f..477c6bd540 100644
--- a/src/widgets/dialogs/qfontdialog.cpp
+++ b/src/widgets/dialogs/qfontdialog.cpp
@@ -931,7 +931,6 @@ QFontDialog::FontDialogOptions QFontDialog::options() const
/*!
\since 4.5
- \overload
Opens the dialog and connects its fontSelected() signal to the slot specified
by \a receiver and \a member.
diff --git a/src/widgets/dialogs/qinputdialog.cpp b/src/widgets/dialogs/qinputdialog.cpp
index 9a9bd173bd..5a7d6edddf 100644
--- a/src/widgets/dialogs/qinputdialog.cpp
+++ b/src/widgets/dialogs/qinputdialog.cpp
@@ -1070,7 +1070,6 @@ QString QInputDialog::cancelButtonText() const
/*!
\since 4.5
- \overload
This function connects one of its signals to the slot specified by \a receiver
and \a member. The specific signal depends on the arguments that are specified
diff --git a/src/widgets/dialogs/qmessagebox.cpp b/src/widgets/dialogs/qmessagebox.cpp
index 41a21e6086..99157747dd 100644
--- a/src/widgets/dialogs/qmessagebox.cpp
+++ b/src/widgets/dialogs/qmessagebox.cpp
@@ -1500,8 +1500,6 @@ void QMessageBox::keyPressEvent(QKeyEvent *e)
}
/*!
- \overload
-
Opens the dialog and connects its finished() or buttonClicked() signal to
the slot specified by \a receiver and \a member. If the slot in \a member
has a pointer for its first parameter the connection is to buttonClicked(),
diff --git a/src/widgets/dialogs/qprogressdialog.cpp b/src/widgets/dialogs/qprogressdialog.cpp
index a276e28a0c..4bf78e2115 100644
--- a/src/widgets/dialogs/qprogressdialog.cpp
+++ b/src/widgets/dialogs/qprogressdialog.cpp
@@ -865,7 +865,6 @@ void QProgressDialog::forceShow()
/*!
\since 4.5
- \overload
Opens the dialog and connects its canceled() signal to the slot specified
by \a receiver and \a member.
diff --git a/src/widgets/graphicsview/qgraphicsitem.cpp b/src/widgets/graphicsview/qgraphicsitem.cpp
index 203b879020..a32f1388bf 100644
--- a/src/widgets/graphicsview/qgraphicsitem.cpp
+++ b/src/widgets/graphicsview/qgraphicsitem.cpp
@@ -1598,7 +1598,7 @@ QGraphicsItem::~QGraphicsItem()
#ifndef QT_NO_GESTURES
if (d_ptr->isObject && !d_ptr->gestureContext.isEmpty()) {
QGraphicsObject *o = static_cast<QGraphicsObject *>(this);
- if (QGestureManager *manager = QGestureManager::instance()) {
+ if (QGestureManager *manager = QGestureManager::instance(QGestureManager::DontForceCreation)) {
const auto types = d_ptr->gestureContext.keys(); // FIXME: iterate over the map directly?
for (Qt::GestureType type : types)
manager->cleanupCachedGestures(o, type);
diff --git a/src/widgets/graphicsview/qgraphicsscene.cpp b/src/widgets/graphicsview/qgraphicsscene.cpp
index 37af4ecda0..bba992144d 100644
--- a/src/widgets/graphicsview/qgraphicsscene.cpp
+++ b/src/widgets/graphicsview/qgraphicsscene.cpp
@@ -297,6 +297,7 @@ QGraphicsScenePrivate::QGraphicsScenePrivate()
painterStateProtection(true),
sortCacheEnabled(false),
allItemsIgnoreTouchEvents(true),
+ focusOnTouch(true),
minimumRenderSize(0.0),
selectionChanging(0),
rectAdjust(2),
@@ -2393,6 +2394,7 @@ void QGraphicsScene::clear()
d->allItemsIgnoreHoverEvents = true;
d->allItemsUseDefaultCursor = true;
d->allItemsIgnoreTouchEvents = true;
+ d->focusOnTouch = true;
}
/*!
@@ -5854,6 +5856,41 @@ void QGraphicsScene::setMinimumRenderSize(qreal minSize)
update();
}
+/*!
+ \property QGraphicsScene::focusOnTouch
+ \since 5.12
+ \brief whether items gain focus when receiving a \e {touch begin} event.
+
+ The usual behavior is to transfer focus only when an item is clicked. Often
+ a tap on a touchpad is interpreted as equivalent to a mouse click by the
+ operating system, generating a synthesized click event in response. However,
+ at least on macOS you can configure this behavior.
+
+ By default, QGraphicsScene also transfers focus when you touch on a trackpad
+ or similar. If the operating system is configured to not generate a
+ synthetic mouse click on tapping the trackpad, this is surprising. If the
+ operating system does generate synthetic mouse clicks on tapping the
+ trackpad, the focus transfer on starting a touch gesture is unnecessary.
+
+ With focusOnTouch switched off, QGraphicsScene behaves as one would expect
+ on macOS.
+
+ The default value is \c true, ensuring that the default behavior is just as
+ in Qt versions prior to 5.12. Set to \c false to prevent touch events from
+ triggering focus changes.
+*/
+bool QGraphicsScene::focusOnTouch() const
+{
+ Q_D(const QGraphicsScene);
+ return d->focusOnTouch;
+}
+
+void QGraphicsScene::setFocusOnTouch(bool enabled)
+{
+ Q_D(QGraphicsScene);
+ d->focusOnTouch = enabled;
+}
+
void QGraphicsScenePrivate::addView(QGraphicsView *view)
{
views << view;
@@ -6033,39 +6070,41 @@ bool QGraphicsScenePrivate::sendTouchBeginEvent(QGraphicsItem *origin, QTouchEve
{
Q_Q(QGraphicsScene);
- if (cachedItemsUnderMouse.isEmpty() || cachedItemsUnderMouse.constFirst() != origin) {
- const QTouchEvent::TouchPoint &firstTouchPoint = touchEvent->touchPoints().first();
- cachedItemsUnderMouse = itemsAtPosition(firstTouchPoint.screenPos().toPoint(),
- firstTouchPoint.scenePos(),
- static_cast<QWidget *>(touchEvent->target()));
- }
+ if (focusOnTouch) {
+ if (cachedItemsUnderMouse.isEmpty() || cachedItemsUnderMouse.constFirst() != origin) {
+ const QTouchEvent::TouchPoint &firstTouchPoint = touchEvent->touchPoints().first();
+ cachedItemsUnderMouse = itemsAtPosition(firstTouchPoint.screenPos().toPoint(),
+ firstTouchPoint.scenePos(),
+ static_cast<QWidget *>(touchEvent->target()));
+ }
- // Set focus on the topmost enabled item that can take focus.
- bool setFocus = false;
+ // Set focus on the topmost enabled item that can take focus.
+ bool setFocus = false;
- foreach (QGraphicsItem *item, cachedItemsUnderMouse) {
- if (item->isEnabled() && ((item->flags() & QGraphicsItem::ItemIsFocusable) && item->d_ptr->mouseSetsFocus)) {
- if (!item->isWidget() || ((QGraphicsWidget *)item)->focusPolicy() & Qt::ClickFocus) {
+ foreach (QGraphicsItem *item, cachedItemsUnderMouse) {
+ if (item->isEnabled() && ((item->flags() & QGraphicsItem::ItemIsFocusable) && item->d_ptr->mouseSetsFocus)) {
+ if (!item->isWidget() || ((QGraphicsWidget *)item)->focusPolicy() & Qt::ClickFocus) {
+ setFocus = true;
+ if (item != q->focusItem())
+ q->setFocusItem(item, Qt::MouseFocusReason);
+ break;
+ }
+ }
+ if (item->isPanel())
+ break;
+ if (item->d_ptr->flags & QGraphicsItem::ItemStopsClickFocusPropagation)
+ break;
+ if (item->d_ptr->flags & QGraphicsItem::ItemStopsFocusHandling) {
+ // Make sure we don't clear focus.
setFocus = true;
- if (item != q->focusItem())
- q->setFocusItem(item, Qt::MouseFocusReason);
break;
}
}
- if (item->isPanel())
- break;
- if (item->d_ptr->flags & QGraphicsItem::ItemStopsClickFocusPropagation)
- break;
- if (item->d_ptr->flags & QGraphicsItem::ItemStopsFocusHandling) {
- // Make sure we don't clear focus.
- setFocus = true;
- break;
- }
- }
- // If nobody could take focus, clear it.
- if (!stickyFocus && !setFocus)
- q->setFocusItem(0, Qt::MouseFocusReason);
+ // If nobody could take focus, clear it.
+ if (!stickyFocus && !setFocus)
+ q->setFocusItem(0, Qt::MouseFocusReason);
+ }
bool res = false;
bool eventAccepted = touchEvent->isAccepted();
diff --git a/src/widgets/graphicsview/qgraphicsscene.h b/src/widgets/graphicsview/qgraphicsscene.h
index 8efbcd273e..287e551db7 100644
--- a/src/widgets/graphicsview/qgraphicsscene.h
+++ b/src/widgets/graphicsview/qgraphicsscene.h
@@ -106,6 +106,7 @@ class Q_WIDGETS_EXPORT QGraphicsScene : public QObject
Q_PROPERTY(bool sortCacheEnabled READ isSortCacheEnabled WRITE setSortCacheEnabled)
Q_PROPERTY(bool stickyFocus READ stickyFocus WRITE setStickyFocus)
Q_PROPERTY(qreal minimumRenderSize READ minimumRenderSize WRITE setMinimumRenderSize)
+ Q_PROPERTY(bool focusOnTouch READ focusOnTouch WRITE setFocusOnTouch)
public:
enum ItemIndexMethod {
@@ -253,6 +254,9 @@ public:
qreal minimumRenderSize() const;
void setMinimumRenderSize(qreal minSize);
+ bool focusOnTouch() const;
+ void setFocusOnTouch(bool enabled);
+
public Q_SLOTS:
void update(const QRectF &rect = QRectF());
void invalidate(const QRectF &rect = QRectF(), SceneLayers layers = AllLayers);
diff --git a/src/widgets/graphicsview/qgraphicsscene_p.h b/src/widgets/graphicsview/qgraphicsscene_p.h
index 2f5d7c54bb..a2d13436fc 100644
--- a/src/widgets/graphicsview/qgraphicsscene_p.h
+++ b/src/widgets/graphicsview/qgraphicsscene_p.h
@@ -114,7 +114,8 @@ public:
quint32 painterStateProtection : 1;
quint32 sortCacheEnabled : 1; // for compatibility
quint32 allItemsIgnoreTouchEvents : 1;
- quint32 padding : 15;
+ quint32 focusOnTouch : 1;
+ quint32 padding : 14;
qreal minimumRenderSize;
diff --git a/src/widgets/itemviews/qtreeview.cpp b/src/widgets/itemviews/qtreeview.cpp
index 2be126ebc6..dd2bcb124e 100644
--- a/src/widgets/itemviews/qtreeview.cpp
+++ b/src/widgets/itemviews/qtreeview.cpp
@@ -131,11 +131,12 @@ QT_BEGIN_NAMESPACE
of the sibling that follows the parent.
\row \li Left \li Hides the children of the current item (if present)
by collapsing a branch.
- \row \li Minus \li Same as LeftArrow.
+ \row \li Minus \li Same as Left.
\row \li Right \li Reveals the children of the current item (if present)
by expanding a branch.
- \row \li Plus \li Same as RightArrow.
- \row \li Asterisk \li Expands all children of the current item (if present).
+ \row \li Plus \li Same as Right.
+ \row \li Asterisk \li Expands the current item and all its children
+ (if present).
\row \li PageUp \li Moves the cursor up one page.
\row \li PageDown \li Moves the cursor down one page.
\row \li Home \li Moves the cursor to an item in the same column of the first
diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp
index 038226c521..45b98e9475 100644
--- a/src/widgets/kernel/qapplication.cpp
+++ b/src/widgets/kernel/qapplication.cpp
@@ -1345,7 +1345,6 @@ void QApplication::setGlobalStrut(const QSize& strut)
/*!
\fn QPalette QApplication::palette(const QWidget* widget)
- \overload
If a \a widget is passed, the default palette for the widget's class is
returned. This may or may not be the application palette. In most cases
@@ -4522,12 +4521,12 @@ void QApplicationPrivate::notifyDragStarted(const QDrag *drag)
#endif // QT_CONFIG(draganddrop)
#ifndef QT_NO_GESTURES
-QGestureManager* QGestureManager::instance()
+QGestureManager* QGestureManager::instance(InstanceCreation ic)
{
QApplicationPrivate *qAppPriv = QApplicationPrivate::instance();
if (!qAppPriv)
return 0;
- if (!qAppPriv->gestureManager)
+ if (!qAppPriv->gestureManager && ic == ForceCreation)
qAppPriv->gestureManager = new QGestureManager(qApp);
return qAppPriv->gestureManager;
}
diff --git a/src/widgets/kernel/qgesturemanager.cpp b/src/widgets/kernel/qgesturemanager.cpp
index 5bf66d68e3..c4188044cf 100644
--- a/src/widgets/kernel/qgesturemanager.cpp
+++ b/src/widgets/kernel/qgesturemanager.cpp
@@ -773,7 +773,7 @@ void QGestureManager::recycle(QGesture *gesture)
bool QGestureManager::gesturePending(QObject *o)
{
- const QGestureManager *gm = QGestureManager::instance();
+ const QGestureManager *gm = QGestureManager::instance(DontForceCreation);
return gm && gm->m_gestureOwners.key(o);
}
diff --git a/src/widgets/kernel/qgesturemanager_p.h b/src/widgets/kernel/qgesturemanager_p.h
index 3df80bab55..3a5c9822eb 100644
--- a/src/widgets/kernel/qgesturemanager_p.h
+++ b/src/widgets/kernel/qgesturemanager_p.h
@@ -81,7 +81,9 @@ public:
bool filterEvent(QGraphicsObject *receiver, QEvent *event);
#endif // QT_CONFIG(graphicsview)
- static QGestureManager* instance(); // declared in qapplication.cpp
+ enum InstanceCreation { ForceCreation, DontForceCreation };
+
+ static QGestureManager *instance(InstanceCreation ic = ForceCreation); // declared in qapplication.cpp
static bool gesturePending(QObject *o);
void cleanupCachedGestures(QObject *target, Qt::GestureType type);
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp
index a1a861e216..6753c35cfc 100644
--- a/src/widgets/kernel/qwidget.cpp
+++ b/src/widgets/kernel/qwidget.cpp
@@ -1572,7 +1572,7 @@ QWidget::~QWidget()
#endif
#ifndef QT_NO_GESTURES
- if (QGestureManager *manager = QGestureManager::instance()) {
+ if (QGestureManager *manager = QGestureManager::instance(QGestureManager::DontForceCreation)) {
// \forall Qt::GestureType type : ungrabGesture(type) (inlined)
for (auto it = d->gestureContext.keyBegin(), end = d->gestureContext.keyEnd(); it != end; ++it)
manager->cleanupCachedGestures(this, *it);
@@ -6600,9 +6600,12 @@ QWidget *QWidgetPrivate::deepestFocusProxy() const
void QWidgetPrivate::setFocus_sys()
{
Q_Q(QWidget);
- // Embedded native widget may have taken the focus; get it back to toplevel if that is the case
+ // Embedded native widget may have taken the focus; get it back to toplevel
+ // if that is the case (QTBUG-25852)
const QWidget *topLevel = q->window();
- if (topLevel->windowType() != Qt::Popup) {
+ // Do not activate in case the popup menu opens another application (QTBUG-70810).
+ if (QGuiApplication::applicationState() == Qt::ApplicationActive
+ && topLevel->windowType() != Qt::Popup) {
if (QWindow *nativeWindow = q->window()->windowHandle()) {
if (nativeWindow != QGuiApplication::focusWindow()
&& q->testAttribute(Qt::WA_WState_Created)) {
diff --git a/src/widgets/styles/qstylesheetstyle.cpp b/src/widgets/styles/qstylesheetstyle.cpp
index 325a2f024a..f2af8aee32 100644
--- a/src/widgets/styles/qstylesheetstyle.cpp
+++ b/src/widgets/styles/qstylesheetstyle.cpp
@@ -116,6 +116,8 @@
#include <QtWidgets/qtoolbar.h>
#endif
+#include <QtGui/qscreen.h>
+
QT_BEGIN_NAMESPACE
using namespace QCss;
@@ -954,7 +956,7 @@ QRenderRule::QRenderRule(const QVector<Declaration> &declarations, const QObject
origin = Origin_Padding;
Origin clip = Origin_Border;
if (v.extractBackground(&brush, &uri, &repeat, &alignment, &origin, &attachment, &clip)) {
- QPixmap pixmap(uri);
+ QPixmap pixmap = QStyleSheetStyle::loadPixmap(uri, object);
if (!uri.isEmpty() && pixmap.isNull())
qWarning("Could not create pixmap from %s", qPrintable(QDir::toNativeSeparators(uri)));
bg = new QStyleSheetBackgroundData(brush, pixmap, repeat, alignment, origin, attachment, clip);
@@ -997,7 +999,7 @@ QRenderRule::QRenderRule(const QVector<Declaration> &declarations, const QObject
bd->bi = new QStyleSheetBorderImageData;
QStyleSheetBorderImageData *bi = bd->bi;
- bi->pixmap = QPixmap(uri);
+ bi->pixmap = QStyleSheetStyle::loadPixmap(uri, object);
for (int i = 0; i < 4; i++)
bi->cuts[i] = cuts[i];
bi->horizStretch = horizStretch;
@@ -1220,30 +1222,33 @@ void QRenderRule::drawBackgroundImage(QPainter *p, const QRect &rect, QPoint off
if (background()->attachment == Attachment_Fixed)
off = QPoint(0, 0);
+ QSize bgpSize = bgp.size() / bgp.devicePixelRatio();
+ int bgpHeight = bgpSize.height();
+ int bgpWidth = bgpSize.width();
QRect r = originRect(rect, background()->origin);
- QRect aligned = QStyle::alignedRect(Qt::LeftToRight, background()->position, bgp.size(), r);
+ QRect aligned = QStyle::alignedRect(Qt::LeftToRight, background()->position, bgpSize, r);
QRect inter = aligned.translated(-off).intersected(r);
switch (background()->repeat) {
case Repeat_Y:
p->drawTiledPixmap(inter.x(), r.y(), inter.width(), r.height(), bgp,
inter.x() - aligned.x() + off.x(),
- bgp.height() - int(aligned.y() - r.y()) % bgp.height() + off.y());
+ bgpHeight - int(aligned.y() - r.y()) % bgpHeight + off.y());
break;
case Repeat_X:
p->drawTiledPixmap(r.x(), inter.y(), r.width(), inter.height(), bgp,
- bgp.width() - int(aligned.x() - r.x())%bgp.width() + off.x(),
+ bgpWidth - int(aligned.x() - r.x())%bgpWidth + off.x(),
inter.y() - aligned.y() + off.y());
break;
case Repeat_XY:
p->drawTiledPixmap(r, bgp,
- QPoint(bgp.width() - int(aligned.x() - r.x())% bgp.width() + off.x(),
- bgp.height() - int(aligned.y() - r.y())%bgp.height() + off.y()));
+ QPoint(bgpWidth - int(aligned.x() - r.x())% bgpWidth + off.x(),
+ bgpHeight - int(aligned.y() - r.y())%bgpHeight + off.y()));
break;
case Repeat_None:
default:
p->drawPixmap(inter.x(), inter.y(), bgp, inter.x() - aligned.x() + off.x(),
- inter.y() - aligned.y() + off.y(), inter.width(), inter.height());
+ inter.y() - aligned.y() + off.y(), bgp.width() , bgp.height());
break;
}
@@ -6118,6 +6123,28 @@ bool QStyleSheetStyle::isNaturalChild(const QObject *obj)
return false;
}
+QPixmap QStyleSheetStyle::loadPixmap(const QString &fileName, const QObject *context)
+{
+ qreal ratio = -1.0;
+ if (const QWidget *widget = qobject_cast<const QWidget *>(context)) {
+ if (QScreen *screen = QApplication::screenAt(widget->mapToGlobal(QPoint(0, 0))))
+ ratio = screen->devicePixelRatio();
+ }
+
+ if (ratio < 0) {
+ if (const QApplication *app = qApp)
+ ratio = app->devicePixelRatio();
+ else
+ ratio = 1.0;
+ }
+
+ qreal sourceDevicePixelRatio = 1.0;
+ QString resolvedFileName = qt_findAtNxFile(fileName, ratio, &sourceDevicePixelRatio);
+ QPixmap pixmap(resolvedFileName);
+ pixmap.setDevicePixelRatio(sourceDevicePixelRatio);
+ return pixmap;
+}
+
QT_END_NAMESPACE
#include "moc_qstylesheetstyle_p.cpp"
diff --git a/src/widgets/styles/qstylesheetstyle_p.h b/src/widgets/styles/qstylesheetstyle_p.h
index d1647fb107..d4edb83525 100644
--- a/src/widgets/styles/qstylesheetstyle_p.h
+++ b/src/widgets/styles/qstylesheetstyle_p.h
@@ -167,6 +167,7 @@ private:
static Qt::Alignment resolveAlignment(Qt::LayoutDirection, Qt::Alignment);
static bool isNaturalChild(const QObject *obj);
+ static QPixmap loadPixmap(const QString &fileName, const QObject *context);
bool initObject(const QObject *obj) const;
public:
static int numinstances;
diff --git a/src/widgets/widgets/qdockwidget.cpp b/src/widgets/widgets/qdockwidget.cpp
index 0b2eee7180..6c871aae2c 100644
--- a/src/widgets/widgets/qdockwidget.cpp
+++ b/src/widgets/widgets/qdockwidget.cpp
@@ -696,7 +696,6 @@ void QDockWidget::initStyleOption(QStyleOptionDockWidget *option) const
// If we are in a floating tab, init from the parent because the attributes and the geometry
// of the title bar should be taken from the floating window.
option->initFrom(floatingTab && !isFloating() ? parentWidget() : this);
- option->fontMetrics = QFontMetrics(d->font);
option->rect = dwlayout->titleArea();
option->title = d->fixedWindowTitle;
option->closable = hasFeature(this, QDockWidget::DockWidgetClosable);
@@ -1473,6 +1472,7 @@ void QDockWidget::closeEvent(QCloseEvent *event)
void QDockWidget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event)
+ Q_D(QDockWidget);
QDockWidgetLayout *layout
= qobject_cast<QDockWidgetLayout*>(this->layout());
@@ -1493,7 +1493,11 @@ void QDockWidget::paintEvent(QPaintEvent *event)
// the title may wish to extend out to all sides (eg. Vista style)
QStyleOptionDockWidget titleOpt;
initStyleOption(&titleOpt);
- p.setFont(d_func()->font);
+ if (font() == QApplication::font("QDockWidget")) {
+ titleOpt.fontMetrics = QFontMetrics(d->font);
+ p.setFont(d->font);
+ }
+
p.drawControl(QStyle::CE_DockWidgetTitle, titleOpt);
}
}
diff --git a/src/widgets/widgets/qlineedit.cpp b/src/widgets/widgets/qlineedit.cpp
index 190ff8d2c5..242a4405ca 100644
--- a/src/widgets/widgets/qlineedit.cpp
+++ b/src/widgets/widgets/qlineedit.cpp
@@ -437,8 +437,6 @@ bool QLineEdit::hasFrame() const
#if QT_CONFIG(action)
/*!
- \overload
-
Adds the \a action to the list of actions at the \a position.
\since 5.2
@@ -682,7 +680,8 @@ QSize QLineEdit::sizeHint() const
Q_D(const QLineEdit);
ensurePolished();
QFontMetrics fm(font());
- int h = qMax(fm.height(), 14) + 2*d->verticalMargin
+ const int iconSize = style()->pixelMetric(QStyle::PM_SmallIconSize, 0, this);
+ int h = qMax(fm.height(), iconSize - 2) + 2*d->verticalMargin
+ d->topTextMargin + d->bottomTextMargin
+ d->topmargin + d->bottommargin;
int w = fm.horizontalAdvance(QLatin1Char('x')) * 17 + 2*d->horizontalMargin
diff --git a/src/widgets/widgets/qlineedit_p.cpp b/src/widgets/widgets/qlineedit_p.cpp
index 33d542abc0..fce3d47b17 100644
--- a/src/widgets/widgets/qlineedit_p.cpp
+++ b/src/widgets/widgets/qlineedit_p.cpp
@@ -441,7 +441,7 @@ QLineEditPrivate::SideWidgetParameters QLineEditPrivate::sideWidgetParameters()
{
Q_Q(const QLineEdit);
SideWidgetParameters result;
- result.iconSize = q->height() < 34 ? 16 : 32;
+ result.iconSize = q->style()->pixelMetric(QStyle::PM_SmallIconSize, 0, q);
result.margin = result.iconSize / 4;
result.widgetWidth = result.iconSize + 6;
result.widgetHeight = result.iconSize + 2;
diff --git a/src/widgets/widgets/qmenu.cpp b/src/widgets/widgets/qmenu.cpp
index 96635ae505..c79e88f094 100644
--- a/src/widgets/widgets/qmenu.cpp
+++ b/src/widgets/widgets/qmenu.cpp
@@ -1741,8 +1741,6 @@ QMenu::~QMenu()
}
/*!
- \overload
-
This convenience function creates a new action with \a text.
The function adds the newly created action to the menu's
list of actions, and returns it.
diff --git a/src/widgets/widgets/qmenubar.cpp b/src/widgets/widgets/qmenubar.cpp
index 6df53dc4e4..ce74a4c2ff 100644
--- a/src/widgets/widgets/qmenubar.cpp
+++ b/src/widgets/widgets/qmenubar.cpp
@@ -749,8 +749,6 @@ QMenuBar::~QMenuBar()
}
/*!
- \overload
-
This convenience function creates a new action with \a text.
The function adds the newly created action to the menu's
list of actions, and returns it.
diff --git a/src/widgets/widgets/qplaintextedit.cpp b/src/widgets/widgets/qplaintextedit.cpp
index 63db93d43f..e54b28a045 100644
--- a/src/widgets/widgets/qplaintextedit.cpp
+++ b/src/widgets/widgets/qplaintextedit.cpp
@@ -2338,8 +2338,6 @@ void QPlainTextEdit::wheelEvent(QWheelEvent *e)
#endif
/*!
- \fn QPlainTextEdit::zoomIn(int range)
-
Zooms in on the text by making the base font size \a range
points larger and recalculating all font sizes to be the new size.
This does not change the size of any images.
@@ -2352,10 +2350,6 @@ void QPlainTextEdit::zoomIn(int range)
}
/*!
- \fn QPlainTextEdit::zoomOut(int range)
-
- \overload
-
Zooms out on the text by making the base font size \a range points
smaller and recalculating all font sizes to be the new size. This
does not change the size of any images.
diff --git a/src/widgets/widgets/qtabwidget.cpp b/src/widgets/widgets/qtabwidget.cpp
index df847e4894..8a848554e3 100644
--- a/src/widgets/widgets/qtabwidget.cpp
+++ b/src/widgets/widgets/qtabwidget.cpp
@@ -511,8 +511,6 @@ QString QTabWidget::tabText(int index) const
}
/*!
- \overload
-
Sets the \a icon for the tab at position \a index.
*/
void QTabWidget::setTabIcon(int index, const QIcon &icon)
diff --git a/src/widgets/widgets/qtextedit.cpp b/src/widgets/widgets/qtextedit.cpp
index 3a368651de..e3a45680ef 100644
--- a/src/widgets/widgets/qtextedit.cpp
+++ b/src/widgets/widgets/qtextedit.cpp
@@ -2310,8 +2310,6 @@ void QTextEdit::scrollToAnchor(const QString &name)
}
/*!
- \fn QTextEdit::zoomIn(int range)
-
Zooms in on the text by making the base font size \a range
points larger and recalculating all font sizes to be the new size.
This does not change the size of any images.
@@ -2324,10 +2322,6 @@ void QTextEdit::zoomIn(int range)
}
/*!
- \fn QTextEdit::zoomOut(int range)
-
- \overload
-
Zooms out on the text by making the base font size \a range points
smaller and recalculating all font sizes to be the new size. This
does not change the size of any images.
diff --git a/src/widgets/widgets/qtoolbar.cpp b/src/widgets/widgets/qtoolbar.cpp
index 4e90bce69d..4af71c126e 100644
--- a/src/widgets/widgets/qtoolbar.cpp
+++ b/src/widgets/widgets/qtoolbar.cpp
@@ -743,8 +743,6 @@ void QToolBar::clear()
}
/*!
- \overload
-
Creates a new action with the given \a text. This action is added to
the end of the toolbar.
*/
diff --git a/tests/auto/corelib/itemmodels/qsortfilterproxymodel_regexp/tst_qsortfilterproxymodel_regexp.cpp b/tests/auto/corelib/itemmodels/qsortfilterproxymodel_regexp/tst_qsortfilterproxymodel_regexp.cpp
index e83738661e..38607f1378 100644
--- a/tests/auto/corelib/itemmodels/qsortfilterproxymodel_regexp/tst_qsortfilterproxymodel_regexp.cpp
+++ b/tests/auto/corelib/itemmodels/qsortfilterproxymodel_regexp/tst_qsortfilterproxymodel_regexp.cpp
@@ -37,6 +37,7 @@ public:
tst_QSortFilterProxyModelRegExp();
private slots:
void tst_invalid();
+ void tst_caseSensitivity();
};
tst_QSortFilterProxyModelRegExp::tst_QSortFilterProxyModelRegExp() :
@@ -55,5 +56,14 @@ void tst_QSortFilterProxyModelRegExp::tst_invalid()
QCOMPARE(model.filterRegExp(), QRegExp());
}
+void tst_QSortFilterProxyModelRegExp::tst_caseSensitivity()
+{
+ const QLatin1String pattern("test");
+ QSortFilterProxyModel model;
+ model.setFilterCaseSensitivity(Qt::CaseInsensitive);
+ model.setFilterRegExp(pattern);
+ QCOMPARE(model.filterCaseSensitivity(), Qt::CaseInsensitive);
+}
+
QTEST_MAIN(tst_QSortFilterProxyModelRegExp)
#include "tst_qsortfilterproxymodel_regexp.moc"
diff --git a/tests/auto/opengl/qgl/BLACKLIST b/tests/auto/opengl/qgl/BLACKLIST
index 1eb0197484..d3165a51e5 100644
--- a/tests/auto/opengl/qgl/BLACKLIST
+++ b/tests/auto/opengl/qgl/BLACKLIST
@@ -19,7 +19,7 @@ winrt
[graphicsViewClipping]
windows
winrt
-rhel-7.4 ci
+linux ci
[glFBOUseInGLWidget]
windows
winrt
diff --git a/tests/auto/tools/uic/baseline/buttongroup.ui.h b/tests/auto/tools/uic/baseline/buttongroup.ui.h
index ddc3995d4b..87814dcba1 100644
--- a/tests/auto/tools/uic/baseline/buttongroup.ui.h
+++ b/tests/auto/tools/uic/baseline/buttongroup.ui.h
@@ -1,7 +1,7 @@
/********************************************************************************
** Form generated from reading UI file 'buttongroup.ui'
**
-** Created by: Qt User Interface Compiler version 5.10.1
+** Created by: Qt User Interface Compiler version 5.12.0
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
@@ -129,9 +129,9 @@ public:
sizePolicy3.setHeightForWidth(periodSpinBox->sizePolicy().hasHeightForWidth());
periodSpinBox->setSizePolicy(sizePolicy3);
periodSpinBox->setMinimumSize(QSize(0, 30));
- periodSpinBox->setMinimum(-1);
- periodSpinBox->setSingleStep(0.1);
- periodSpinBox->setValue(-1);
+ periodSpinBox->setMinimum(-1.000000000000000);
+ periodSpinBox->setSingleStep(0.100000000000000);
+ periodSpinBox->setValue(-1.000000000000000);
formLayout->setWidget(0, QFormLayout::FieldRole, periodSpinBox);
@@ -139,9 +139,9 @@ public:
amplitudeSpinBox->setObjectName(QString::fromUtf8("amplitudeSpinBox"));
amplitudeSpinBox->setEnabled(false);
amplitudeSpinBox->setMinimumSize(QSize(0, 30));
- amplitudeSpinBox->setMinimum(-1);
- amplitudeSpinBox->setSingleStep(0.1);
- amplitudeSpinBox->setValue(-1);
+ amplitudeSpinBox->setMinimum(-1.000000000000000);
+ amplitudeSpinBox->setSingleStep(0.100000000000000);
+ amplitudeSpinBox->setValue(-1.000000000000000);
formLayout->setWidget(2, QFormLayout::FieldRole, amplitudeSpinBox);
@@ -155,9 +155,9 @@ public:
overshootSpinBox->setObjectName(QString::fromUtf8("overshootSpinBox"));
overshootSpinBox->setEnabled(false);
overshootSpinBox->setMinimumSize(QSize(0, 30));
- overshootSpinBox->setMinimum(-1);
- overshootSpinBox->setSingleStep(0.1);
- overshootSpinBox->setValue(-1);
+ overshootSpinBox->setMinimum(-1.000000000000000);
+ overshootSpinBox->setSingleStep(0.100000000000000);
+ overshootSpinBox->setValue(-1.000000000000000);
formLayout->setWidget(4, QFormLayout::FieldRole, overshootSpinBox);
diff --git a/tests/auto/tools/uic/baseline/qpagesetupwidget.ui.h b/tests/auto/tools/uic/baseline/qpagesetupwidget.ui.h
index e914c664d3..a5379bc468 100644
--- a/tests/auto/tools/uic/baseline/qpagesetupwidget.ui.h
+++ b/tests/auto/tools/uic/baseline/qpagesetupwidget.ui.h
@@ -1,7 +1,7 @@
/********************************************************************************
** Form generated from reading UI file 'qpagesetupwidget.ui'
**
-** Created by: Qt User Interface Compiler version 5.9.0
+** Created by: Qt User Interface Compiler version 5.12.0
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
@@ -104,7 +104,7 @@ public:
horizontalLayout_3->setObjectName(QString::fromUtf8("horizontalLayout_3"));
pageWidth = new QDoubleSpinBox(groupBox_2);
pageWidth->setObjectName(QString::fromUtf8("pageWidth"));
- pageWidth->setMaximum(9999.99);
+ pageWidth->setMaximum(9999.989999999999782);
horizontalLayout_3->addWidget(pageWidth);
@@ -115,7 +115,7 @@ public:
pageHeight = new QDoubleSpinBox(groupBox_2);
pageHeight->setObjectName(QString::fromUtf8("pageHeight"));
- pageHeight->setMaximum(9999.99);
+ pageHeight->setMaximum(9999.989999999999782);
horizontalLayout_3->addWidget(pageHeight);
@@ -199,7 +199,7 @@ public:
topMargin = new QDoubleSpinBox(groupBox);
topMargin->setObjectName(QString::fromUtf8("topMargin"));
topMargin->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
- topMargin->setMaximum(999.99);
+ topMargin->setMaximum(999.990000000000009);
gridLayout->addWidget(topMargin, 0, 1, 1, 1);
@@ -212,7 +212,7 @@ public:
leftMargin = new QDoubleSpinBox(groupBox);
leftMargin->setObjectName(QString::fromUtf8("leftMargin"));
leftMargin->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
- leftMargin->setMaximum(999.99);
+ leftMargin->setMaximum(999.990000000000009);
horizontalLayout->addWidget(leftMargin);
@@ -223,7 +223,7 @@ public:
rightMargin = new QDoubleSpinBox(groupBox);
rightMargin->setObjectName(QString::fromUtf8("rightMargin"));
rightMargin->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
- rightMargin->setMaximum(999.99);
+ rightMargin->setMaximum(999.990000000000009);
horizontalLayout->addWidget(rightMargin);
@@ -241,7 +241,7 @@ public:
bottomMargin = new QDoubleSpinBox(groupBox);
bottomMargin->setObjectName(QString::fromUtf8("bottomMargin"));
bottomMargin->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
- bottomMargin->setMaximum(999.99);
+ bottomMargin->setMaximum(999.990000000000009);
gridLayout->addWidget(bottomMargin, 2, 1, 1, 1);
diff --git a/tests/auto/tools/uic/baseline/qtgradienteditor.ui.h b/tests/auto/tools/uic/baseline/qtgradienteditor.ui.h
index 21dc9551d0..9db07f35ac 100644
--- a/tests/auto/tools/uic/baseline/qtgradienteditor.ui.h
+++ b/tests/auto/tools/uic/baseline/qtgradienteditor.ui.h
@@ -31,7 +31,7 @@
/********************************************************************************
** Form generated from reading UI file 'qtgradienteditor.ui'
**
-** Created by: Qt User Interface Compiler version 5.0.0
+** Created by: Qt User Interface Compiler version 5.12.0
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
@@ -176,8 +176,8 @@ public:
spinBox1->setGeometry(QRect(279, 69, 73, 23));
spinBox1->setKeyboardTracking(false);
spinBox1->setDecimals(3);
- spinBox1->setMaximum(1);
- spinBox1->setSingleStep(0.01);
+ spinBox1->setMaximum(1.000000000000000);
+ spinBox1->setSingleStep(0.010000000000000);
label2 = new QLabel(QtGradientEditor);
label2->setObjectName(QString::fromUtf8("label2"));
label2->setGeometry(QRect(209, 99, 64, 23));
@@ -186,8 +186,8 @@ public:
spinBox2->setGeometry(QRect(279, 99, 73, 23));
spinBox2->setKeyboardTracking(false);
spinBox2->setDecimals(3);
- spinBox2->setMaximum(1);
- spinBox2->setSingleStep(0.01);
+ spinBox2->setMaximum(1.000000000000000);
+ spinBox2->setSingleStep(0.010000000000000);
label3 = new QLabel(QtGradientEditor);
label3->setObjectName(QString::fromUtf8("label3"));
label3->setGeometry(QRect(209, 129, 64, 23));
@@ -196,8 +196,8 @@ public:
spinBox3->setGeometry(QRect(279, 129, 73, 23));
spinBox3->setKeyboardTracking(false);
spinBox3->setDecimals(3);
- spinBox3->setMaximum(1);
- spinBox3->setSingleStep(0.01);
+ spinBox3->setMaximum(1.000000000000000);
+ spinBox3->setSingleStep(0.010000000000000);
label4 = new QLabel(QtGradientEditor);
label4->setObjectName(QString::fromUtf8("label4"));
label4->setGeometry(QRect(209, 159, 64, 23));
@@ -206,8 +206,8 @@ public:
spinBox4->setGeometry(QRect(279, 159, 73, 23));
spinBox4->setKeyboardTracking(false);
spinBox4->setDecimals(3);
- spinBox4->setMaximum(1);
- spinBox4->setSingleStep(0.01);
+ spinBox4->setMaximum(1.000000000000000);
+ spinBox4->setSingleStep(0.010000000000000);
label5 = new QLabel(QtGradientEditor);
label5->setObjectName(QString::fromUtf8("label5"));
label5->setGeometry(QRect(209, 189, 64, 23));
@@ -216,8 +216,8 @@ public:
spinBox5->setGeometry(QRect(279, 189, 73, 23));
spinBox5->setKeyboardTracking(false);
spinBox5->setDecimals(3);
- spinBox5->setMaximum(1);
- spinBox5->setSingleStep(0.01);
+ spinBox5->setMaximum(1.000000000000000);
+ spinBox5->setSingleStep(0.010000000000000);
gradientStopsWidget = new QtGradientStopsWidget(QtGradientEditor);
gradientStopsWidget->setObjectName(QString::fromUtf8("gradientStopsWidget"));
gradientStopsWidget->setGeometry(QRect(10, 225, 193, 67));
@@ -390,10 +390,10 @@ public:
positionSpinBox->setObjectName(QString::fromUtf8("positionSpinBox"));
positionSpinBox->setKeyboardTracking(false);
positionSpinBox->setDecimals(3);
- positionSpinBox->setMinimum(0);
- positionSpinBox->setMaximum(1);
- positionSpinBox->setSingleStep(0.01);
- positionSpinBox->setValue(0);
+ positionSpinBox->setMinimum(0.000000000000000);
+ positionSpinBox->setMaximum(1.000000000000000);
+ positionSpinBox->setSingleStep(0.010000000000000);
+ positionSpinBox->setValue(0.000000000000000);
vboxLayout1->addWidget(positionSpinBox);
diff --git a/tests/auto/tools/uic/baseline/validators.ui.h b/tests/auto/tools/uic/baseline/validators.ui.h
index 0595cf2037..d0ae777f65 100644
--- a/tests/auto/tools/uic/baseline/validators.ui.h
+++ b/tests/auto/tools/uic/baseline/validators.ui.h
@@ -1,7 +1,7 @@
/********************************************************************************
** Form generated from reading UI file 'validators.ui'
**
-** Created by: Qt User Interface Compiler version 5.10.0
+** Created by: Qt User Interface Compiler version 5.12.0
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
@@ -252,9 +252,9 @@ public:
doubleMinVal->setObjectName(QString::fromUtf8("doubleMinVal"));
sizePolicy.setHeightForWidth(doubleMinVal->sizePolicy().hasHeightForWidth());
doubleMinVal->setSizePolicy(sizePolicy);
- doubleMinVal->setMinimum(-100000);
- doubleMinVal->setMaximum(100000);
- doubleMinVal->setValue(0);
+ doubleMinVal->setMinimum(-100000.000000000000000);
+ doubleMinVal->setMaximum(100000.000000000000000);
+ doubleMinVal->setValue(0.000000000000000);
gridLayout1->addWidget(doubleMinVal, 0, 1, 1, 1);
@@ -281,9 +281,9 @@ public:
doubleMaxVal->setObjectName(QString::fromUtf8("doubleMaxVal"));
sizePolicy.setHeightForWidth(doubleMaxVal->sizePolicy().hasHeightForWidth());
doubleMaxVal->setSizePolicy(sizePolicy);
- doubleMaxVal->setMinimum(-100000);
- doubleMaxVal->setMaximum(100000);
- doubleMaxVal->setValue(1000);
+ doubleMaxVal->setMinimum(-100000.000000000000000);
+ doubleMaxVal->setMaximum(100000.000000000000000);
+ doubleMaxVal->setValue(1000.000000000000000);
gridLayout1->addWidget(doubleMaxVal, 1, 1, 1, 1);
diff --git a/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp b/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp
index c8ee2d65a3..838b1f4be6 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp
@@ -254,6 +254,7 @@ private slots:
void zeroScale();
void focusItemChangedSignal();
void minimumRenderSize();
+ void focusOnTouch();
// task specific tests below me
void task139710_bspTreeCrash();
@@ -4758,6 +4759,41 @@ void tst_QGraphicsScene::minimumRenderSize()
QVERIFY(smallChild->repaints > smallerGrandChild->repaints);
}
+void tst_QGraphicsScene::focusOnTouch()
+{
+ QGraphicsScene scene;
+ QGraphicsView view(&scene);
+ scene.setSceneRect(0, 0, 100, 100);
+ QGraphicsRectItem *rect = scene.addRect(0, 0, 100, 100);
+ rect->setFlag(QGraphicsItem::ItemIsFocusable, true);
+
+ view.show();
+ QApplication::setActiveWindow(&view);
+ QVERIFY(QTest::qWaitForWindowActive(&view));
+
+ QVERIFY(!rect->hasFocus());
+
+ scene.setFocusOnTouch(false);
+
+ QTouchDevice device;
+ device.setType(QTouchDevice::TouchPad);
+ QList<QTouchEvent::TouchPoint> touchPoints;
+ QTouchEvent::TouchPoint point;
+ point.setScenePos(QPointF(10, 10));
+ point.setState(Qt::TouchPointPressed);
+ touchPoints.append(point);
+ QTouchEvent event(QEvent::TouchBegin, &device, Qt::NoModifier, Qt::TouchPointStates(),
+ touchPoints);
+
+ QApplication::sendEvent(&scene, &event);
+
+ QVERIFY(!rect->hasFocus());
+ scene.setFocusOnTouch(true);
+
+ QApplication::sendEvent(&scene, &event);
+ QVERIFY(rect->hasFocus());
+}
+
void tst_QGraphicsScene::taskQTBUG_15977_renderWithDeviceCoordinateCache()
{
QGraphicsScene scene;
diff --git a/tests/auto/widgets/styles/qstylesheetstyle/images/testimage.png b/tests/auto/widgets/styles/qstylesheetstyle/images/testimage.png
index 06fb34f0d6..a4adc7a47f 100644
--- a/tests/auto/widgets/styles/qstylesheetstyle/images/testimage.png
+++ b/tests/auto/widgets/styles/qstylesheetstyle/images/testimage.png
Binary files differ
diff --git a/tests/auto/widgets/styles/qstylesheetstyle/images/testimage@2x.png b/tests/auto/widgets/styles/qstylesheetstyle/images/testimage@2x.png
new file mode 100644
index 0000000000..d55f0c507b
--- /dev/null
+++ b/tests/auto/widgets/styles/qstylesheetstyle/images/testimage@2x.png
Binary files differ
diff --git a/tests/auto/widgets/styles/qstylesheetstyle/resources.qrc b/tests/auto/widgets/styles/qstylesheetstyle/resources.qrc
index 248bf80f50..f523070073 100644
--- a/tests/auto/widgets/styles/qstylesheetstyle/resources.qrc
+++ b/tests/auto/widgets/styles/qstylesheetstyle/resources.qrc
@@ -2,5 +2,6 @@
<RCC version="1.0">
<qresource>
<file>images/testimage.png</file>
+ <file>images/testimage@2x.png</file>
</qresource>
</RCC> \ No newline at end of file
diff --git a/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp b/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp
index 43aec651fe..f5d9433f70 100644
--- a/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp
+++ b/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp
@@ -33,6 +33,7 @@
#include <QMetaObject>
#include <private/qstylesheetstyle_p.h>
+#include <private/qhighdpiscaling_p.h>
#include <QtTest/private/qtesthelpers_p.h>
using namespace QTestPrivate;
@@ -101,6 +102,9 @@ private slots:
void styleSheetTargetAttribute();
void unpolish();
+ void highdpiImages_data();
+ void highdpiImages();
+
private:
QColor COLOR(const QWidget& w) {
w.ensurePolished();
@@ -2066,6 +2070,35 @@ void tst_QStyleSheetStyle::unpolish()
QCOMPARE(w.minimumWidth(), 0);
}
+void tst_QStyleSheetStyle::highdpiImages_data()
+{
+ QTest::addColumn<qreal>("screenFactor");
+ QTest::addColumn<QColor>("color");
+
+ QTest::newRow("highdpi") << 2.0 << QColor(0x00, 0xFF, 0x00);
+ QTest::newRow("lowdpi") << 1.0 << QColor(0xFF, 0x00, 0x00);
+}
+
+void tst_QStyleSheetStyle::highdpiImages()
+{
+ QFETCH(qreal, screenFactor);
+ QFETCH(QColor, color);
+
+ QWidget w;
+ QScreen *screen = QGuiApplication::screenAt(w.pos());
+ QHighDpiScaling::setScreenFactor(screen, screenFactor);
+ w.setStyleSheet("QWidget { background-image: url(\":/images/testimage.png\"); }");
+ w.show();
+
+ QVERIFY(QTest::qWaitForWindowExposed(&w));
+ QImage image(w.size(), QImage::Format_ARGB32);
+ w.render(&image);
+ QVERIFY(testForColors(image, color));
+
+ QHighDpiScaling::setScreenFactor(screen, 1.0);
+ QHighDpiScaling::updateHighDpiScaling(); // reset to normal
+}
+
QTEST_MAIN(tst_QStyleSheetStyle)
#include "tst_qstylesheetstyle.moc"