summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/3rdparty/libjpeg/COPYRIGHT.txt2
-rw-r--r--src/3rdparty/libjpeg/ChangeLog.md43
-rw-r--r--src/3rdparty/libjpeg/qt_attribution.json4
-rw-r--r--src/3rdparty/libjpeg/src/jconfig.h4
-rw-r--r--src/3rdparty/libjpeg/src/jconfigint.h2
-rw-r--r--src/corelib/configure.cmake2
-rw-r--r--src/corelib/doc/images/javaiterators1.svg60
-rw-r--r--src/corelib/doc/images/javaiterators2.svg57
-rw-r--r--src/corelib/doc/images/modelview-begin-append-columns.svg80
-rw-r--r--src/corelib/doc/images/modelview-begin-append-rows.svg66
-rw-r--r--src/corelib/doc/images/modelview-begin-insert-columns.svg91
-rw-r--r--src/corelib/doc/images/modelview-begin-insert-rows.svg82
-rw-r--r--src/corelib/doc/images/modelview-begin-remove-columns.svg91
-rw-r--r--src/corelib/doc/images/modelview-begin-remove-rows.svg76
-rw-r--r--src/corelib/doc/images/modelview-move-rows-1.svg169
-rw-r--r--src/corelib/doc/images/modelview-move-rows-2.svg169
-rw-r--r--src/corelib/doc/images/modelview-move-rows-3.svg108
-rw-r--r--src/corelib/doc/images/modelview-move-rows-4.svg108
-rw-r--r--src/corelib/doc/images/stliterators1.svg90
-rw-r--r--src/corelib/doc/src/cmake/cmake-configure-variables.qdoc2
-rw-r--r--src/corelib/doc/src/cmake/cmake-properties.qdoc2
-rw-r--r--src/corelib/doc/src/cmake/qt_deploy_translations.qdoc1
-rw-r--r--src/corelib/doc/src/cmake/qt_extract_metatypes.qdoc1
-rw-r--r--src/corelib/doc/src/cmake/qt_finalize_project.qdoc1
-rw-r--r--src/corelib/doc/src/containers.qdoc2
-rw-r--r--src/corelib/doc/src/java-style-iterators.qdoc2
-rw-r--r--src/corelib/itemmodels/qabstractitemmodel.cpp20
-rw-r--r--src/corelib/kernel/qmetacontainer.h9
-rw-r--r--src/corelib/kernel/qmetasequence.cpp40
-rw-r--r--src/corelib/kernel/qmetasequence.h21
-rw-r--r--src/corelib/text/qregularexpression.cpp2
-rw-r--r--src/corelib/text/qstringconverter_p.h1
-rw-r--r--src/corelib/thread/qfuture.qdoc2
-rw-r--r--src/gui/painting/qcolor.cpp30
-rw-r--r--src/network/access/qnetworkaccessmanager.cpp13
-rw-r--r--src/network/kernel/qauthenticator.cpp2
-rw-r--r--src/network/kernel/qauthenticator.h2
-rw-r--r--src/plugins/styles/modernwindows/qwindows11style.cpp9
-rw-r--r--src/plugins/styles/modernwindows/qwindows11style_p.h1
-rw-r--r--src/testlib/qtestlog.cpp6
-rw-r--r--src/tools/macdeployqt/shared/shared.cpp27
-rw-r--r--src/widgets/dialogs/qwizard.cpp34
-rw-r--r--src/widgets/dialogs/qwizard.h10
-rw-r--r--src/widgets/widgets/qlcdnumber.cpp14
-rw-r--r--src/widgets/widgets/qtabbar.cpp66
-rw-r--r--src/widgets/widgets/qtabbar_p.h3
46 files changed, 1422 insertions, 205 deletions
diff --git a/src/3rdparty/libjpeg/COPYRIGHT.txt b/src/3rdparty/libjpeg/COPYRIGHT.txt
index f5eae868466..ce9d95bfebc 100644
--- a/src/3rdparty/libjpeg/COPYRIGHT.txt
+++ b/src/3rdparty/libjpeg/COPYRIGHT.txt
@@ -1,4 +1,4 @@
-Copyright (C) 2009-2025 D. R. Commander
+Copyright (C) 2009-2024 D. R. Commander
Copyright (C) 2015, 2020 Google, Inc.
Copyright (C) 2019-2020 Arm Limited
Copyright (C) 2015-2016, 2018 Matthieu Darbois
diff --git a/src/3rdparty/libjpeg/ChangeLog.md b/src/3rdparty/libjpeg/ChangeLog.md
index 4bdbf53dd34..17390d80bd0 100644
--- a/src/3rdparty/libjpeg/ChangeLog.md
+++ b/src/3rdparty/libjpeg/ChangeLog.md
@@ -1,3 +1,34 @@
+3.1.3
+=====
+
+### Significant changes relative to 3.1.2:
+
+1. Hardened the TurboJPEG API against hypothetical applications that may
+erroneously call `tj*Compress*()` or `tj*Transform()` with a reused JPEG
+destination buffer pointer while specifying a destination buffer size of 0.
+
+2. Hardened the TurboJPEG API against hypothetical applications that may
+erroneously set `TJPARAM_LOSSLESS` or `TJPARAM_COLORSPACE` prior to calling
+`tj3EncodeYUV*8()` or `tj3CompressFromYUV*8()`. `tj3EncodeYUV*8()` and
+`tj3CompressFromYUV*8()` now ignore `TJPARAM_LOSSLESS` and
+`TJPARAM_COLORSPACE`.
+
+3. Hardened the TurboJPEG Java API against hypothetical applications that may
+erroneously pass huge X or Y offsets to one of the compression, YUV encoding,
+decompression, or YUV decoding methods, leading to signed integer overflow in
+the JNI wrapper's buffer size checks that rendered those checks ineffective.
+
+4. Fixed an issue in the TurboJPEG Java API whereby
+`TJCompressor.getSourceBuf()` sometimes returned the buffer from a previous
+invocation of `TJCompressor.loadSourceImage()` if the target data precision was
+changed before the most recent invocation.
+
+5. Fixed an issue in the PPM reader that caused incorrect pixels to be
+generated when using `tj3LoadImage*()` or `TJCompressor.loadSourceImage()` to
+load a PBMPLUS (PPM/PGM) file into a CMYK buffer with a different data
+precision than that of the file.
+
+
3.1.2
=====
@@ -962,9 +993,9 @@ storage.
64-bit libjpeg-turbo SDK for Visual C++ were installed on the same system, only
one of them could be uninstalled.
-2. Fixed a signed integer overflow and subsequent segfault that occurred when
-attempting to decompress images with more than 715827882 pixels using the
-64-bit C version of TJBench.
+2. Fixed a signed integer overflow and subsequent segfault (CVE-2019-2201) that
+occurred when attempting to decompress images with more than 715827882 pixels
+using the 64-bit C version of TJBench.
3. Fixed out-of-bounds write in `tjDecompressToYUV2()` and
`tjDecompressToYUVPlanes()` (sometimes manifesting as a double free) that
@@ -1016,9 +1047,9 @@ regardless of whether a 4:2:2 JPEG image is rotated or transposed prior to
decompression (in the frequency domain) or after decompression (in the spatial
domain), the final image will be similar.
-4. Fixed an integer overflow and subsequent segfault that occurred when
-attempting to compress or decompress images with more than 1 billion pixels
-using the TurboJPEG API.
+4. Fixed an integer overflow and subsequent segfault (CVE-2019-2201) that
+occurred when attempting to compress or decompress images with more than 1
+billion pixels using the TurboJPEG API.
5. Fixed a regression introduced by 2.0 beta1[15] whereby attempting to
generate a progressive JPEG image on an SSE2-capable CPU using a scan script
diff --git a/src/3rdparty/libjpeg/qt_attribution.json b/src/3rdparty/libjpeg/qt_attribution.json
index fe38aec1f68..5ac811a12b4 100644
--- a/src/3rdparty/libjpeg/qt_attribution.json
+++ b/src/3rdparty/libjpeg/qt_attribution.json
@@ -7,8 +7,8 @@
"Description": "The Independent JPEG Group's JPEG software",
"Homepage": "http://libjpeg-turbo.virtualgl.org/",
- "Version": "3.1.2",
- "DownloadLocation": "https://github.com/libjpeg-turbo/libjpeg-turbo/releases/download/3.1.2/libjpeg-turbo-3.1.2.tar.gz",
+ "Version": "3.1.3",
+ "DownloadLocation": "https://github.com/libjpeg-turbo/libjpeg-turbo/releases/download/3.1.3/libjpeg-turbo-3.1.3.tar.gz",
"PURL": "pkg:github/libjpeg-turbo/libjpeg-turbo@$<VERSION>",
"CPE": "cpe:2.3:a:libjpeg-turbo:libjpeg-turbo:$<VERSION>:*:*:*:*:*:*:*",
diff --git a/src/3rdparty/libjpeg/src/jconfig.h b/src/3rdparty/libjpeg/src/jconfig.h
index e81574b9a48..85a1509fb68 100644
--- a/src/3rdparty/libjpeg/src/jconfig.h
+++ b/src/3rdparty/libjpeg/src/jconfig.h
@@ -2,9 +2,9 @@
#define JPEG_LIB_VERSION 80
-#define LIBJPEG_TURBO_VERSION 3.0.3
+#define LIBJPEG_TURBO_VERSION 3.1.3
-#define LIBJPEG_TURBO_VERSION_NUMBER 3000003
+#define LIBJPEG_TURBO_VERSION_NUMBER 3001003
#define C_ARITH_CODING_SUPPORTED 1
diff --git a/src/3rdparty/libjpeg/src/jconfigint.h b/src/3rdparty/libjpeg/src/jconfigint.h
index 6e7dbd75a1e..6d5f9633928 100644
--- a/src/3rdparty/libjpeg/src/jconfigint.h
+++ b/src/3rdparty/libjpeg/src/jconfigint.h
@@ -10,7 +10,7 @@
#define PACKAGE_NAME "libjpeg-turbo"
-#define VERSION "3.0.3"
+#define VERSION "3.1.3"
#if SIZE_MAX == 0xffffffff
#define SIZEOF_SIZE_T 4
diff --git a/src/corelib/configure.cmake b/src/corelib/configure.cmake
index 7274b51cc0a..0f717ff2ae0 100644
--- a/src/corelib/configure.cmake
+++ b/src/corelib/configure.cmake
@@ -812,7 +812,7 @@ qt_feature("winsdkicu" PRIVATE
)
qt_feature("windows-ioring" PRIVATE
LABEL "Windows I/O Ring"
- AUTODETECT WIN32 AND CMAKE_HOST_SYSTEM_VERSION VERSION_GREATER_EQUAL 10.0.22000
+ AUTODETECT WIN32
CONDITION TEST_windows_ioring
)
qt_feature("inotify" PUBLIC PRIVATE
diff --git a/src/corelib/doc/images/javaiterators1.svg b/src/corelib/doc/images/javaiterators1.svg
index 468dbe5371c..c10329ab480 100644
--- a/src/corelib/doc/images/javaiterators1.svg
+++ b/src/corelib/doc/images/javaiterators1.svg
@@ -12,6 +12,11 @@
svg .text-style { font: 20px arial; fill: black }
svg .fill-style { stroke: none; fill: red }
+ svg.dark .box-style { stroke: #f2f2f2; fill: black }
+ svg.dark .line-style { stroke: red; fill: none }
+ svg.dark .text-style { font: 20px arial; fill: #f2f2f2 }
+ svg.dark .fill-style { stroke: none; fill: red }
+
[data-theme="dark"] svg .box-style { stroke: #f2f2f2; fill: black }
[data-theme="dark"] svg .line-style { stroke: red; fill: none }
[data-theme="dark"] svg .text-style { font: 20px arial; fill: #f2f2f2 }
@@ -24,36 +29,53 @@
</style>
<g transform="translate(10.5, 10.5)">
-<path d="m 0,0 h 80 v 60 h -80 z" class="box-style" />
-<text x="35" y="36" class="text-style">A</text>
-<path d="M 0,60 v 30" class="line-style" />
-<path d="M 0,60 l -5,10 l 10,0 z" class="fill-style" />
+<path d="m 0,0 h 80 v 60 h -80 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="35" y="36" font-family="arial" font-size="20px"
+ class="text-style">A</text>
+<path d="M 0,60 v 30" stroke="red"
+ class="line-style" />
+<path d="M 0,60 l -5,10 l 10,0 z" stroke="red" fill="red"
+ class="fill-style" />
</g>
<g transform="translate(90.5, 10.5)">
-<path d="m 0,0 h 80 v 60 h -80 z" class="box-style" />
-<text x="35" y="36" class="text-style">B</text>
-<path d="M 0,60 v 30" class="line-style" />
-<path d="M 0,60 l -5,10 l 10,0 z" class="fill-style" />
+<path d="m 0,0 h 80 v 60 h -80 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="35" y="36" font-family="arial" font-size="20px"
+ class="text-style">B</text>
+<path d="M 0,60 v 30" stroke="red"
+ class="line-style" />
+<path d="M 0,60 l -5,10 l 10,0 z" stroke="red" fill="red"
+ class="fill-style" />
</g>
<g transform="translate(170.5, 10.5)">
-<path d="m 0,0 h 80 v 60 h -80 z" class="box-style" />
-<text x="35" y="36" class="text-style">C</text>
-<path d="M 0,60 v 30" class="line-style" />
-<path d="M 0,60 l -5,10 l 10,0 z" class="fill-style" />
+<path d="m 0,0 h 80 v 60 h -80 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="35" y="36" font-family="arial" font-size="20px"
+ class="text-style">C</text>
+<path d="M 0,60 v 30" stroke="red"
+ class="line-style" />
+<path d="M 0,60 l -5,10 l 10,0 z" stroke="red" fill="red"
+ class="fill-style" />
</g>
<g transform="translate(250.5, 10.5)">
-<path d="m 0,0 h 80 v 60 h -80 z" class="box-style" />
-<text x="35" y="36" class="text-style">D</text>
-<path d="M 0,60 v 30" class="line-style" />
-<path d="M 0,60 l -5,10 l 10,0 z" class="fill-style" />
+<path d="m 0,0 h 80 v 60 h -80 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="35" y="36" font-family="arial" font-size="20px"
+ class="text-style">D</text>
+<path d="M 0,60 v 30" stroke="red"
+ class="line-style" />
+<path d="M 0,60 l -5,10 l 10,0 z" stroke="red" fill="red"
+ class="fill-style" />
</g>
<g transform="translate(330.5, 10.5)">
-<path d="M 0,60 v 30" class="line-style" />
-<path d="M 0,60 l -5,10 l 10,0 z" class="fill-style" />
+<path d="M 0,60 v 30" stroke="red"
+ class="line-style" />
+<path d="M 0,60 l -5,10 l 10,0 z" stroke="red" fill="red"
+ class="fill-style" />
</g>
-
</svg>
diff --git a/src/corelib/doc/images/javaiterators2.svg b/src/corelib/doc/images/javaiterators2.svg
index df4c6b352a6..3b41b3f8730 100644
--- a/src/corelib/doc/images/javaiterators2.svg
+++ b/src/corelib/doc/images/javaiterators2.svg
@@ -15,6 +15,14 @@
svg .text-style { font: 20px arial; fill: black }
svg .small-text-style { font: 12px monospace; fill: black }
+ svg.dark .box-style { stroke: #f2f2f2; fill: black }
+ svg.dark .line-style { stroke: red; fill: none }
+ svg.dark .fill-style { stroke: none; fill: red }
+ svg.dark .np-line-style { stroke: #4080ff; fill: none; stroke-width: 1.5 }
+ svg.dark .np-fill-style { stroke: none; fill: #4080ff }
+ svg.dark .text-style { font: 20px arial; fill: #f2f2f2 }
+ svg.dark .small-text-style { font: 12px monospace; fill: #f2f2f2 }
+
[data-theme="dark"] svg .box-style { stroke: #f2f2f2; fill: black }
[data-theme="dark"] svg .line-style { stroke: red; fill: none }
[data-theme="dark"] svg .fill-style { stroke: none; fill: red }
@@ -33,31 +41,46 @@
</style>
<g transform="translate(10.5, 10.5)">
-<path d="m 0,0 h 80 v 60 h -80 z" class="box-style" />
-<text x="35" y="36" class="text-style">A</text>
+<path d="m 0,0 h 80 v 60 h -80 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="35" y="36" font-family="arial" font-size="20px"
+ class="text-style">A</text>
</g>
<g transform="translate(90.5, 10.5)">
-<path d="m 0,0 h 80 v 60 h -80 z" class="box-style" />
-<text x="35" y="36" class="text-style">B</text>
-<path d="M 0,60 c 0,30 50,40 80,30" class="np-line-style" />
-<path d="M 0,60 l -2,14 l 11,-4 z" class="np-fill-style" />
-<text x="-15" y="110" class="small-text-style">previous()</text>
+<path d="m 0,0 h 80 v 60 h -80 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="35" y="36" font-family="arial" font-size="20px"
+ class="text-style">B</text>
+<path d="M 0,60 c 0,30 50,40 80,30" stroke="blue" fill="none"
+ class="np-line-style" />
+<path d="M 0,60 l -2,14 l 11,-4 z" stroke="none" fill="blue"
+ class="np-fill-style" />
+<text x="-15" y="110"
+ class="small-text-style">previous()</text>
</g>
<g transform="translate(170.5, 10.5)">
-<path d="m 0,0 h 80 v 60 h -80 z" class="box-style" />
-<text x="35" y="36" class="text-style">C</text>
-<path d="M 0,60 v 50" class="line-style" />
-<path d="M 0,60 l -5,10 l 10,0 z" class="fill-style" />
-<text x="30" y="110" class="small-text-style">next()</text>
+<path d="m 0,0 h 80 v 60 h -80 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="35" y="36" font-family="arial" font-size="20px"
+ class="text-style">C</text>
+<path d="M 0,60 v 50" stroke="red"
+ class="line-style" />
+<path d="M 0,60 l -5,10 l 10,0 z" stroke="none" fill="red"
+ class="fill-style" />
+<text x="30" y="110"
+ class="small-text-style">next()</text>
</g>
<g transform="translate(250.5, 10.5)">
-<path d="m 0,0 h 80 v 60 h -80 z" class="box-style" />
-<text x="35" y="36" class="text-style">D</text>
-<path d="M 0,60 c 0,30 -50,40 -80,30" class="np-line-style" />
-<path d="M 0,60 l 2,14 l -11,-4 z" class="np-fill-style" />
+<path d="m 0,0 h 80 v 60 h -80 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="35" y="36" font-family="arial" font-size="20px"
+ class="text-style">D</text>
+<path d="M 0,60 c 0,30 -50,40 -80,30" stroke="blue" fill="none"
+ class="np-line-style" />
+<path d="M 0,60 l 2,14 l -11,-4 z" stroke="none" fill="blue"
+ class="np-fill-style" />
</g>
-
</svg>
diff --git a/src/corelib/doc/images/modelview-begin-append-columns.svg b/src/corelib/doc/images/modelview-begin-append-columns.svg
new file mode 100644
index 00000000000..937a2c03206
--- /dev/null
+++ b/src/corelib/doc/images/modelview-begin-append-columns.svg
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ version="1.1"
+ width="291"
+ height="166"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+
+<style>
+ svg .box-style { stroke: black; fill: white }
+ svg .highlighted-style { stroke: black; fill: #c0ffc0 }
+ svg .fill-style { stroke: none; fill: black }
+ svg .line-style { stroke: black; fill: none }
+ svg .text-style { font: 20px arial; fill: black }
+ svg .high-text-style { font: 20px arial; fill: black }
+
+ svg.dark .box-style { stroke: #f2f2f2; fill: black }
+ svg.dark .highlighted-style { stroke: #f2f2f2; fill: #c0ffc0 }
+ svg.dark .fill-style { stroke: none; fill: #f2f2f2 }
+ svg.dark .line-style { stroke: #f2f2f2; fill: none }
+ svg.dark .text-style { font: 20px arial; fill: #f2f2f2 }
+ svg.dark .high-text-style { font: 20px arial; fill: black }
+
+ [data-theme="dark"] svg .box-style { stroke: #f2f2f2; fill: black }
+ [data-theme="dark"] svg .highlighted-style { stroke: #f2f2f2; fill: #c0ffc0 }
+ [data-theme="dark"] svg .fill-style { stroke: none; fill: #f2f2f2 }
+ [data-theme="dark"] svg .line-style { stroke: #f2f2f2; fill: none }
+ [data-theme="dark"] svg .text-style { font: 20px arial; fill: #f2f2f2 }
+ [data-theme="dark"] svg .high-text-style { font: 20px arial; fill: black }
+
+ [data-theme="light"] svg .box-style { stroke: black; fill: white }
+ [data-theme="light"] svg .highlighted-style { stroke: black; fill: #c0ffc0 }
+ [data-theme="light"] svg .fill-style { stroke: none; fill: black }
+ [data-theme="light"] svg .line-style { stroke: black; fill: none }
+ [data-theme="light"] svg .text-style { font: 20px arial; fill: black }
+ [data-theme="light"] svg .high-text-style { font: 20px arial; fill: black }
+</style>
+
+<path d="m 10.5,10.5 h 30 v 30 h -30 v -30" class="box-style" />
+<text x="20" y="32" font-family="arial" font-size="20px" class="text-style">0</text>
+<path d="m 40.5,10.5 h 30 v 30 h -30 v -30" class="box-style" />
+<text x="50" y="32" font-family="arial" font-size="20px" class="text-style">1</text>
+<path d="m 70.5,10.5 h 30 v 30 h -30 v -30" class="box-style" />
+<text x="80" y="32" font-family="arial" font-size="20px" class="text-style">2</text>
+<path d="m 100.5,10.5 h 30 v 30 h -30 v -30" class="box-style" />
+<text x="110" y="32" font-family="arial" font-size="20px" class="text-style">3</text>
+<path d="m 130.5,10.5 h 30 v 30 h -30 v -30" class="box-style" />
+<text x="140" y="32" font-family="arial" font-size="20px" class="text-style">4</text>
+<path d="m 160.5,10.5 h 30 v 30 h -30 v -30" class="box-style" />
+<text x="170" y="32" font-family="arial" font-size="20px" class="text-style">5</text>
+
+<path d="m 190.5,68.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="200" y="90" font-family="arial" font-size="20px" class="high-text-style">6</text>
+<path d="m 220.5,68.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="230" y="90" font-family="arial" font-size="20px" class="high-text-style">7</text>
+<path d="m 250.5,68.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="260" y="90" font-family="arial" font-size="20px" class="high-text-style">8</text>
+
+<path d="m 10.5,125.5 h 30 v 30 h -30 v -30" class="box-style" />
+<text x="20" y="147" font-family="arial" font-size="20px" class="text-style">0</text>
+<path d="m 40.5,125.5 h 30 v 30 h -30 v -30" class="box-style" />
+<text x="50" y="147" font-family="arial" font-size="20px" class="text-style">1</text>
+<path d="m 70.5,125.5 h 30 v 30 h -30 v -30" class="box-style" />
+<text x="80" y="147" font-family="arial" font-size="20px" class="text-style">2</text>
+<path d="m 100.5,125.5 h 30 v 30 h -30 v -30" class="box-style" />
+<text x="110" y="147" font-family="arial" font-size="20px" class="text-style">3</text>
+<path d="m 130.5,125.5 h 30 v 30 h -30 v -30" class="box-style" />
+<text x="140" y="147" font-family="arial" font-size="20px" class="text-style">4</text>
+<path d="m 160.5,125.5 h 30 v 30 h -30 v -30" class="box-style" />
+<text x="170" y="147" font-family="arial" font-size="20px" class="text-style">5</text>
+<path d="m 190.5,125.5 h 30 v 30 h -30 v -30" class="highlighted-style" />
+<text x="200" y="147" font-family="arial" font-size="20px" class="high-text-style">6</text>
+<path d="m 220.5,125.5 h 30 v 30 h -30 v -30" class="highlighted-style" />
+<text x="230" y="147" font-family="arial" font-size="20px" class="high-text-style">7</text>
+<path d="m 250.5,125.5 h 30 v 30 h -30 v -30" class="highlighted-style" />
+<text x="260" y="147" font-family="arial" font-size="20px" class="high-text-style">8</text>
+
+<path d="m 190.5,65.5 v -20" class="line-style" />
+<path d="M 190.5 42.5 l 5,10 l -10,0 z" class="fill-style" />
+</svg>
diff --git a/src/corelib/doc/images/modelview-begin-append-rows.svg b/src/corelib/doc/images/modelview-begin-append-rows.svg
new file mode 100644
index 00000000000..7e66d0d8756
--- /dev/null
+++ b/src/corelib/doc/images/modelview-begin-append-rows.svg
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ version="1.1"
+ width="165"
+ height="200"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+
+<style>
+ svg .box-style { stroke: black; fill: white }
+ svg .highlighted-style { stroke: black; fill: #c0ffc0 }
+ svg .fill-style { stroke: none; fill: black }
+ svg .line-style { stroke: black; fill: none }
+ svg .text-style { font: 20px arial; fill: black }
+ svg .high-text-style { font: 20px arial; fill: black }
+
+ svg.dark .box-style { stroke: #f2f2f2; fill: black }
+ svg.dark .highlighted-style { stroke: #f2f2f2; fill: #c0ffc0 }
+ svg.dark .fill-style { stroke: none; fill: #f2f2f2 }
+ svg.dark .line-style { stroke: #f2f2f2; fill: none }
+ svg.dark .text-style { font: 20px arial; fill: #f2f2f2 }
+ svg.dark .high-text-style { font: 20px arial; fill: black }
+
+ [data-theme="dark"] svg .box-style { stroke: #f2f2f2; fill: black }
+ [data-theme="dark"] svg .highlighted-style { stroke: #f2f2f2; fill: #c0ffc0 }
+ [data-theme="dark"] svg .fill-style { stroke: none; fill: #f2f2f2 }
+ [data-theme="dark"] svg .line-style { stroke: #f2f2f2; fill: none }
+ [data-theme="dark"] svg .text-style { font: 20px arial; fill: #f2f2f2 }
+ [data-theme="dark"] svg .high-text-style { font: 20px arial; fill: black }
+
+ [data-theme="light"] svg .box-style { stroke: black; fill: white }
+ [data-theme="light"] svg .highlighted-style { stroke: black; fill: #c0ffc0 }
+ [data-theme="light"] svg .text-style { font: 20px arial; fill: black }
+ [data-theme="light"] svg .fill-style { stroke: none; fill: black }
+ [data-theme="light"] svg .line-style { stroke: black; fill: none }
+</style>
+
+<path d="m 10.5,10.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="20" y="32" font-family="arial" font-size="20px" class="text-style">0</text>
+<path d="m 10.5,40.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="20" y="62" font-family="arial" font-size="20px" class="text-style">1</text>
+<path d="m 10.5,70.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="20" y="92" font-family="arial" font-size="20px" class="text-style">2</text>
+<path d="m 10.5,100.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="20" y="122" font-family="arial" font-size="20px" class="text-style">3</text>
+<path d="m 68.5,130.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="77" y="152" font-family="arial" font-size="20px" class="high-text-style">4</text>
+<path d="m 68.5,160.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="77" y="182" font-family="arial" font-size="20px" class="high-text-style">5</text>
+
+<path d="m 125.5,10.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="135" y="32" font-family="arial" font-size="20px" class="text-style">0</text>
+<path d="m 125.5,40.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="135" y="62" font-family="arial" font-size="20px" class="text-style">1</text>
+<path d="m 125.5,70.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="135" y="92" font-family="arial" font-size="20px" class="text-style">2</text>
+<path d="m 125.5,100.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="135" y="122" font-family="arial" font-size="20px" class="text-style">3</text>
+<path d="m 125.5,130.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="135" y="152" font-family="arial" font-size="20px" class="high-text-style">4</text>
+<path d="m 125.5,160.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="135" y="182" font-family="arial" font-size="20px" class="high-text-style">5</text>
+
+<path d="m 65.5,130.5 h -20" class="line-style" />
+<path d="M 42.5,130.5 l 10,-5 l 0,10 z" class="fill-style" />
+</svg>
diff --git a/src/corelib/doc/images/modelview-begin-insert-columns.svg b/src/corelib/doc/images/modelview-begin-insert-columns.svg
new file mode 100644
index 00000000000..51664b80568
--- /dev/null
+++ b/src/corelib/doc/images/modelview-begin-insert-columns.svg
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ version="1.1"
+ width="290"
+ height="165"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+
+<style>
+ svg .box-style { stroke: black; fill: white }
+ svg .highlighted-style { stroke: black; fill: #c0ffc0 }
+ svg .fill-style { stroke: none; fill: black }
+ svg .line-style { stroke: black; fill: none }
+ svg .text-style { font: 20px arial; fill: black }
+ svg .high-text-style { font: 20px arial; fill: black }
+ svg .faded-text-style { font: 20px arial; fill: #808080 }
+
+ svg.dark .box-style { stroke: #f2f2f2; fill: black }
+ svg.dark .highlighted-style { stroke: #f2f2f2; fill: #c0ffc0 }
+ svg.dark .fill-style { stroke: none; fill: #f2f2f2 }
+ svg.dark .line-style { stroke: #f2f2f2; fill: none }
+ svg.dark .text-style { font: 20px arial; fill: #f2f2f2 }
+ svg.dark .high-text-style { font: 20px arial; fill: black }
+ svg.dark .faded-text-style { font: 20px arial; fill: #808080 }
+
+ [data-theme="dark"] svg .box-style { stroke: #f2f2f2; fill: black }
+ [data-theme="dark"] svg .highlighted-style { stroke: #f2f2f2; fill: #c0ffc0 }
+ [data-theme="dark"] svg .fill-style { stroke: none; fill: #f2f2f2 }
+ [data-theme="dark"] svg .line-style { stroke: #f2f2f2; fill: none }
+ [data-theme="dark"] svg .text-style { font: 20px arial; fill: #f2f2f2 }
+ [data-theme="dark"] svg .high-text-style { font: 20px arial; fill: black }
+ [data-theme="dark"] svg .faded-text-style { font: 20px arial; fill: #808080 }
+
+ [data-theme="light"] svg .box-style { stroke: black; fill: white }
+ [data-theme="light"] svg .highlighted-style { stroke: black; fill: #c0ffc0 }
+ [data-theme="light"] svg .fill-style { stroke: none; fill: black }
+ [data-theme="light"] svg .line-style { stroke: black; fill: none }
+ [data-theme="light"] svg .text-style { font: 20px arial; fill: black }
+ [data-theme="light"] svg .high-text-style { font: 20px arial; fill: black }
+ [data-theme="light"] svg .faded-text-style { font: 20px arial; fill: #808080 }
+</style>
+
+<path d="m 10.5,10.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="20" y="32" font-family="arial" font-size="20px" class="text-style">0</text>
+<path d="m 40.5,10.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="50" y="32" font-family="arial" font-size="20px" class="text-style">1</text>
+<path d="m 70.5,10.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="80" y="32" font-family="arial" font-size="20px" class="text-style">2</text>
+<path d="m 100.5,10.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="110" y="32" font-family="arial" font-size="20px" class="text-style">3</text>
+<path d="m 130.5,10.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="140" y="32" font-family="arial" font-size="20px" class="text-style">4</text>
+<path d="m 160.5,10.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="170" y="32" font-family="arial" font-size="20px" class="text-style">5</text>
+<path d="m 190.5,10.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="200" y="32" font-family="arial" font-size="20px" class="text-style">6</text>
+<path d="m 220.5,10.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="230" y="32" font-family="arial" font-size="20px" class="text-style">7</text>
+<path d="m 250.5,10.5 h 30 v 30 h -30 z" class="line-style"
+ stroke-dasharray="5, 5" />
+
+<path d="m 130.5,68.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="140" y="90" font-family="arial" font-size="20px" class="high-text-style">4</text>
+<path d="m 160.5,68.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="170" y="90" font-family="arial" font-size="20px" class="high-text-style">5</text>
+<path d="m 190.5,68.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="200" y="90" font-family="arial" font-size="20px" class="high-text-style">6</text>
+
+<path d="m 10.5,125.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="20" y="147" font-family="arial" font-size="20px" class="text-style">0</text>
+<path d="m 40.5,125.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="50" y="147" font-family="arial" font-size="20px" class="text-style">1</text>
+<path d="m 70.5,125.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="80" y="147" font-family="arial" font-size="20px" class="text-style">2</text>
+<path d="m 100.5,125.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="110" y="147" font-family="arial" font-size="20px" class="text-style">3</text>
+<path d="m 130.5,125.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="140" y="147" font-family="arial" font-size="20px" class="high-text-style">4</text>
+<path d="m 160.5,125.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="170" y="147" font-family="arial" font-size="20px" class="high-text-style">5</text>
+<path d="m 190.5,125.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="200" y="147" font-family="arial" font-size="20px" class="high-text-style">6</text>
+<path d="m 220.5,125.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="230" y="147" font-family="arial" font-size="20px" fill="#808080" class="faded-text-style">4</text>
+<path d="m 250.5,125.5 h 30 v 30 h -30 z" class="line-style"
+ stroke-dasharray="5, 5" />
+
+
+<path d="m 130.5,65.5 v -20" class="line-style" />
+<path d="M 130.5,42.5 l 5,10 l -10,0 z" class="fill-style" />
+</svg>
diff --git a/src/corelib/doc/images/modelview-begin-insert-rows.svg b/src/corelib/doc/images/modelview-begin-insert-rows.svg
new file mode 100644
index 00000000000..fd6641218ed
--- /dev/null
+++ b/src/corelib/doc/images/modelview-begin-insert-rows.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ version="1.1"
+ width="165"
+ height="230"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+
+<style>
+ svg .box-style { stroke: black; fill: white }
+ svg .highlighted-style { stroke: black; fill: #c0ffc0 }
+ svg .fill-style { stroke: none; fill: black }
+ svg .line-style { stroke: black; fill: none }
+ svg .text-style { font: 20px arial; fill: black }
+ svg .high-text-style { font: 20px arial; fill: black }
+ svg .faded-text-style { font: 20px arial; fill: #808080 }
+
+ svg.dark .box-style { stroke: #f2f2f2; fill: black }
+ svg.dark .highlighted-style { stroke: #f2f2f2; fill: #c0ffc0 }
+ svg.dark .fill-style { stroke: none; fill: #f2f2f2 }
+ svg.dark .line-style { stroke: #f2f2f2; fill: none }
+ svg.dark .text-style { font: 20px arial; fill: #f2f2f2 }
+ svg.dark .high-text-style { font: 20px arial; fill: black }
+ svg.dark .faded-text-style { font: 20px arial; fill: #808080 }
+
+ [data-theme="dark"] svg .box-style { stroke: #f2f2f2; fill: black }
+ [data-theme="dark"] svg .highlighted-style { stroke: #f2f2f2; fill: #c0ffc0 }
+ [data-theme="dark"] svg .fill-style { stroke: none; fill: #f2f2f2 }
+ [data-theme="dark"] svg .line-style { stroke: #f2f2f2; fill: none }
+ [data-theme="dark"] svg .text-style { font: 20px arial; fill: #f2f2f2 }
+ [data-theme="dark"] svg .high-text-style { font: 20px arial; fill: black }
+ [data-theme="dark"] svg .faded-text-style { font: 20px arial; fill: #808080 }
+
+ [data-theme="light"] svg .box-style { stroke: black; fill: white }
+ [data-theme="light"] svg .highlighted-style { stroke: black; fill: #c0ffc0 }
+ [data-theme="light"] svg .fill-style { stroke: none; fill: black }
+ [data-theme="light"] svg .line-style { stroke: black; fill: none }
+ [data-theme="light"] svg .text-style { font: 20px arial; fill: black }
+ [data-theme="light"] svg .high-text-style { font: 20px arial; fill: black }
+ [data-theme="light"] svg .faded-text-style { font: 20px arial; fill: #808080 }
+</style>
+
+<path d="m 10.5,190.5 h 30 v 30 h -30 z" class="box-style"
+ stroke-dasharray="5, 5" />
+<path d="m 125.5,190.5 h 30 v 30 h -30 z" class="box-style"
+ stroke-dasharray="5, 5" />
+<path d="m 10.5,10.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="20" y="32" font-family="arial" font-size="20px" class="text-style">0</text>
+<path d="m 10.5,40.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="20" y="62" font-family="arial" font-size="20px" class="text-style">1</text>
+<path d="m 10.5,70.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="20" y="92" font-family="arial" font-size="20px" class="text-style">2</text>
+<path d="m 10.5,100.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="20" y="122" font-family="arial" font-size="20px" class="text-style">3</text>
+<path d="m 10.5,130.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="20" y="152" font-family="arial" font-size="20px" class="text-style">4</text>
+<path d="m 10.5,160.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="20" y="182" font-family="arial" font-size="20px" class="text-style">5</text>
+
+<path d="m 68.5,70.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="77" y="92" font-family="arial" font-size="20px" class="high-text-style">2</text>
+<path d="m 68.5,100.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="77" y="122" font-family="arial" font-size="20px" class="high-text-style">3</text>
+<path d="m 68.5,130.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="77" y="152" font-family="arial" font-size="20px" class="high-text-style">4</text>
+
+<path d="m 125.5,10.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="135" y="32" font-family="arial" font-size="20px" class="text-style">0</text>
+<path d="m 125.5,40.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="135" y="62" font-family="arial" font-size="20px" class="text-style">1</text>
+<path d="m 125.5,70.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="135" y="92" font-family="arial" font-size="20px" class="high-text-style">2</text>
+<path d="m 125.5,100.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="135" y="122" font-family="arial" font-size="20px" class="high-text-style">3</text>
+<path d="m 125.5,130.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="135" y="152" font-family="arial" font-size="20px" class="high-text-style">4</text>
+<path d="m 125.5,160.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="135" y="182" font-family="arial" font-size="20px" fill="#808080" class="faded-text-style">2</text>
+
+<path d="m 65.5,70.5 h -20" class="line-style" />
+<path d="M 42.5,70.5 l 10,-5 l 0,10 z" class="fill-style" />
+</svg>
diff --git a/src/corelib/doc/images/modelview-begin-remove-columns.svg b/src/corelib/doc/images/modelview-begin-remove-columns.svg
new file mode 100644
index 00000000000..a221bfda9fc
--- /dev/null
+++ b/src/corelib/doc/images/modelview-begin-remove-columns.svg
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ version="1.1"
+ width="290"
+ height="165"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+
+<style>
+ svg .box-style { stroke: black; fill: white }
+ svg .highlighted-style { stroke: black; fill: #c0ffc0 }
+ svg .fill-style { stroke: none; fill: black }
+ svg .line-style { stroke: black; fill: none }
+ svg .text-style { font: 20px arial; fill: black }
+ svg .high-text-style { font: 20px arial; fill: black }
+ svg .faded-text-style { font: 20px arial; fill: #808080 }
+
+ svg.dark .box-style { stroke: #f2f2f2; fill: black }
+ svg.dark .highlighted-style { stroke: #f2f2f2; fill: #c0ffc0 }
+ svg.dark .fill-style { stroke: none; fill: #f2f2f2 }
+ svg.dark .line-style { stroke: #f2f2f2; fill: none }
+ svg.dark .text-style { font: 20px arial; fill: #f2f2f2 }
+ svg.dark .high-text-style { font: 20px arial; fill: black }
+ svg.dark .faded-text-style { font: 20px arial; fill: #808080 }
+
+ [data-theme="dark"] svg .box-style { stroke: #f2f2f2; fill: black }
+ [data-theme="dark"] svg .highlighted-style { stroke: #f2f2f2; fill: #c0ffc0 }
+ [data-theme="dark"] svg .fill-style { stroke: none; fill: #f2f2f2 }
+ [data-theme="dark"] svg .line-style { stroke: #f2f2f2; fill: none }
+ [data-theme="dark"] svg .text-style { font: 20px arial; fill: #f2f2f2 }
+ [data-theme="dark"] svg .high-text-style { font: 20px arial; fill: black }
+ [data-theme="dark"] svg .faded-text-style { font: 20px arial; fill: #808080 }
+
+ [data-theme="light"] svg .box-style { stroke: black; fill: white }
+ [data-theme="light"] svg .highlighted-style { stroke: black; fill: #c0ffc0 }
+ [data-theme="light"] svg .fill-style { stroke: none; fill: black }
+ [data-theme="light"] svg .line-style { stroke: black; fill: none }
+ [data-theme="light"] svg .text-style { font: 20px arial; fill: black }
+ [data-theme="light"] svg .high-text-style { font: 20px arial; fill: black }
+ [data-theme="light"] svg .faded-text-style { font: 20px arial; fill: #808080 }
+</style>
+
+<path d="m 10.5,10.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="20" y="32" font-family="arial" font-size="20px" class="text-style">0</text>
+<path d="m 40.5,10.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="50" y="32" font-family="arial" font-size="20px" class="text-style">1</text>
+<path d="m 70.5,10.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="80" y="32" font-family="arial" font-size="20px" class="text-style">2</text>
+<path d="m 100.5,10.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="110" y="32" font-family="arial" font-size="20px" class="text-style">3</text>
+<path d="m 130.5,10.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="140" y="32" font-family="arial" font-size="20px" class="high-text-style">4</text>
+<path d="m 160.5,10.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="170" y="32" font-family="arial" font-size="20px" class="high-text-style">5</text>
+<path d="m 190.5,10.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="200" y="32" font-family="arial" font-size="20px" class="high-text-style">6</text>
+<path d="m 220.5,10.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="230" y="32" font-family="arial" font-size="20px" class="text-style">7</text>
+<path d="m 250.5,10.5 h 30 v 30 h -30 z" class="box-style"
+ stroke-dasharray="5, 5" />
+
+<path d="m 130.5,68.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="140" y="89" font-family="arial" font-size="20px" class="high-text-style">4</text>
+<path d="m 160.5,68.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="170" y="89" font-family="arial" font-size="20px" class="high-text-style">5</text>
+<path d="m 190.5,68.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="200" y="89" font-family="arial" font-size="20px" class="high-text-style">6</text>
+
+<path d="m 10.5,125.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="20" y="147" font-family="arial" font-size="20px" class="text-style">0</text>
+<path d="m 40.5,125.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="50" y="147" font-family="arial" font-size="20px" class="text-style">1</text>
+<path d="m 70.5,125.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="80" y="147" font-family="arial" font-size="20px" class="text-style">2</text>
+<path d="m 100.5,125.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="110" y="147" font-family="arial" font-size="20px" class="text-style">3</text>
+<path d="m 130.5,125.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="140" y="147" font-family="arial" font-size="20px" fill="#808080" class="faded-text-style">7</text>
+<path d="m 160.5,125.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="170" y="147" font-family="arial" font-size="20px" fill="#808080" class="faded-text-style">8</text>
+<path d="m 190.5,125.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="200" y="147" font-family="arial" font-size="20px" fill="#808080" class="faded-text-style">9</text>
+<path d="m 220.5,125.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="224" y="147" font-family="arial" font-size="20px" fill="#808080" class="faded-text-style">10</text>
+<path d="m 250.5,125.5 h 30 v 30 h -30 z" class="box-style"
+ stroke-dasharray="5, 5" />
+
+<path d="M 130.5,63 V 43" class="line-style" />
+<path d="M 130.5,66 l -5,-10 l 10,0 z" class="fill-style" />
+
+</svg>
diff --git a/src/corelib/doc/images/modelview-begin-remove-rows.svg b/src/corelib/doc/images/modelview-begin-remove-rows.svg
new file mode 100644
index 00000000000..0c67b1b6404
--- /dev/null
+++ b/src/corelib/doc/images/modelview-begin-remove-rows.svg
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ version="1.1"
+ width="165"
+ height="230"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+
+<style>
+ svg .box-style { stroke: black; fill: white }
+ svg .highlighted-style { stroke: black; fill: #c0ffc0 }
+ svg .fill-style { stroke: none; fill: black }
+ svg .line-style { stroke: black; fill: none }
+ svg .text-style { font: 20px arial; fill: black }
+ svg .high-text-style { font: 20px arial; fill: black }
+ svg .faded-text-style { font: 20px arial; fill: #808080 }
+
+ svg.dark .box-style { stroke: #f2f2f2; fill: black }
+ svg.dark .highlighted-style { stroke: #f2f2f2; fill: #c0ffc0 }
+ svg.dark .fill-style { stroke: none; fill: #f2f2f2 }
+ svg.dark .line-style { stroke: #f2f2f2; fill: none }
+ svg.dark .text-style { font: 20px arial; fill: #f2f2f2 }
+ svg.dark .high-text-style { font: 20px arial; fill: black }
+ svg.dark .faded-text-style { font: 20px arial; fill: #808080 }
+
+ [data-theme="dark"] svg .box-style { stroke: #f2f2f2; fill: black }
+ [data-theme="dark"] svg .highlighted-style { stroke: #f2f2f2; fill: #c0ffc0 }
+ [data-theme="dark"] svg .fill-style { stroke: none; fill: #f2f2f2 }
+ [data-theme="dark"] svg .line-style { stroke: #f2f2f2; fill: none }
+ [data-theme="dark"] svg .text-style { font: 20px arial; fill: #f2f2f2 }
+ [data-theme="dark"] svg .high-text-style { font: 20px arial; fill: black }
+ [data-theme="dark"] svg .faded-text-style { font: 20px arial; fill: #808080 }
+
+ [data-theme="light"] svg .box-style { stroke: black; fill: white }
+ [data-theme="light"] svg .highlighted-style { stroke: black; fill: #c0ffc0 }
+ [data-theme="light"] svg .fill-style { stroke: none; fill: black }
+ [data-theme="light"] svg .line-style { stroke: black; fill: none }
+ [data-theme="light"] svg .text-style { font: 20px arial; fill: black }
+ [data-theme="light"] svg .high-text-style { font: 20px arial; fill: black }
+ [data-theme="light"] svg .faded-text-style { font: 20px arial; fill: #808080 }
+</style>
+
+<path d="m 10.5,10.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="20" y="32" font-family="arial" font-size="20px" class="text-style">0</text>
+<path d="m 10.5,40.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="20" y="62" font-family="arial" font-size="20px" class="text-style">1</text>
+<path d="m 10.5,70.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="20" y="92" font-family="arial" font-size="20px" class="high-text-style">2</text>
+<path d="m 10.5,100.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="20" y="122" font-family="arial" font-size="20px" class="high-text-style">3</text>
+<path d="m 10.5,130.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="20" y="152" font-family="arial" font-size="20px" class="text-style">4</text>
+<path d="m 10.5,160.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="20" y="182" font-family="arial" font-size="20px" class="text-style">5</text>
+<path d="m 10.5,190.5 h 30 v 30 h -30 z" class="box-style"
+ stroke-dasharray="5, 5" />
+
+<path d="m 125.5,10.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="135" y="32" font-family="arial" font-size="20px" class="text-style">0</text>
+<path d="m 125.5,40.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="135" y="62" font-family="arial" font-size="20px" class="text-style">1</text>
+<path d="m 125.5,70.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="135" y="92" font-family="arial" font-size="20px" fill="#808080" class="faded-text-style">4</text>
+<path d="m 125.5,100.5 h 30 v 30 h -30 z" class="box-style" />
+<text x="135" y="122" font-family="arial" font-size="20px" fill="#808080" class="faded-text-style">5</text>
+<path d="m 125.5,130.5 h 30 v 30 h -30 z" class="box-style"
+ stroke-dasharray="5, 5" />
+
+<path d="m 68.5,70.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="77" y="92" font-family="arial" font-size="20px" class="high-text-style">2</text>
+<path d="m 68.5,100.5 h 30 v 30 h -30 z" class="highlighted-style" />
+<text x="77" y="122" font-family="arial" font-size="20px" class="high-text-style">3</text>
+
+<path d="M 63,70.5 H 43" class="line-style" />
+<path d="M 66,70.5 l -10,-5 l 0,10 z" class="fill-style" />
+</svg>
diff --git a/src/corelib/doc/images/modelview-move-rows-1.svg b/src/corelib/doc/images/modelview-move-rows-1.svg
new file mode 100644
index 00000000000..1c90c42f730
--- /dev/null
+++ b/src/corelib/doc/images/modelview-move-rows-1.svg
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ version="1.1"
+ width="200"
+ height="440"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+
+<style>
+ svg .box-style { stroke: black; fill: white }
+ svg .highlighted-style { stroke: black; fill: #c0ffc0 }
+ svg .fill-style { stroke: none; fill: black }
+ svg .line-style { stroke: black; fill: none }
+ svg .text-style { font: 20px arial; fill: black }
+ svg .high-text-style { font: 20px arial; fill: black }
+ svg .faded-text-style { font: 20px arial; fill: #808080 }
+
+ svg.dark .box-style { stroke: #f2f2f2; fill: black }
+ svg.dark .highlighted-style { stroke: #f2f2f2; fill: #c0ffc0 }
+ svg.dark .fill-style { stroke: none; fill: #f2f2f2 }
+ svg.dark .line-style { stroke: #f2f2f2; fill: none }
+ svg.dark .text-style { font: 20px arial; fill: #f2f2f2 }
+ svg.dark .high-text-style { font: 20px arial; fill: black }
+ svg.dark .faded-text-style { font: 20px arial; fill: #808080 }
+
+ [data-theme="dark"] svg .box-style { stroke: #f2f2f2; fill: black }
+ [data-theme="dark"] svg .highlighted-style { stroke: #f2f2f2; fill: #c0ffc0 }
+ [data-theme="dark"] svg .fill-style { stroke: none; fill: #f2f2f2 }
+ [data-theme="dark"] svg .line-style { stroke: #f2f2f2; fill: none }
+ [data-theme="dark"] svg .text-style { font: 20px arial; fill: #f2f2f2 }
+ [data-theme="dark"] svg .high-text-style { font: 20px arial; fill: black }
+ [data-theme="dark"] svg .faded-text-style { font: 20px arial; fill: #808080 }
+
+ [data-theme="light"] svg .box-style { stroke: black; fill: white }
+ [data-theme="light"] svg .highlighted-style { stroke: black; fill: #c0ffc0 }
+ [data-theme="light"] svg .fill-style { stroke: none; fill: black }
+ [data-theme="light"] svg .line-style { stroke: black; fill: none }
+ [data-theme="light"] svg .text-style { font: 20px arial; fill: black }
+ [data-theme="light"] svg .high-text-style { font: 20px arial; fill: black }
+ [data-theme="light"] svg .faded-text-style { font: 20px arial; fill: #808080 }
+</style>
+
+<g transform="translate(10,10)">
+<path d="m 0.5,0.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="22" font-family="arial" font-size="20px"
+ class="text-style">0</text>
+<path d="m 0.5,30.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="52" font-family="arial" font-size="20px"
+ class="text-style">1</text>
+<path d="m 0.5,60.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="82" font-family="arial" font-size="20px"
+ class="text-style">2</text>
+<path d="m 0.5,90.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="112" font-family="arial" font-size="20px"
+ class="text-style">3</text>
+<path d="m 0.5,120.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="142" font-family="arial" font-size="20px"
+ class="text-style">4</text>
+<path d="m 0.5,180.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ stroke-dasharray="5, 5"
+ class="box-style" />
+<path d="m 0.5,150.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="172" font-family="arial" font-size="20px"
+ class="text-style">5</text>
+
+<path d="m 0.5,240.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="262" font-family="arial" font-size="20px"
+ class="text-style">0</text>
+<path d="m 0.5,270.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="292" font-family="arial" font-size="20px"
+ class="text-style">1</text>
+<path d="m 0.5,300.5 h 30 v 30 h -30 z" stroke="black" fill="#c0ffc0"
+ class="highlighted-style" />
+<text x="10" y="322" font-family="arial" font-size="20px"
+ class="high-text-style">2</text>
+<path d="m 0.5,330.5 h 30 v 30 h -30 z" stroke="black" fill="#c0ffc0"
+ class="highlighted-style" />
+<text x="10" y="352" font-family="arial" font-size="20px"
+ class="high-text-style">3</text>
+<path d="m 0.5,360.5 h 30 v 30 h -30 z" stroke="black" fill="#c0ffc0"
+ class="highlighted-style" />
+<text x="10" y="382" font-family="arial" font-size="20px"
+ class="high-text-style">4</text>
+<path d="m 0.5,390.5 h 30 V 420.5 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="412" font-family="arial" font-size="20px"
+ class="text-style">5</text>
+
+<path d="m 58.5,60.5 h 30 v 30 h -30 z" stroke="black" fill="#c0ffc0"
+ class="highlighted-style" />
+<text x="67" y="82" font-family="arial" font-size="20px"
+ class="high-text-style">2</text>
+<path d="m 58.5,90.5 h 30 v 30 h -30 z" stroke="black" fill="#c0ffc0"
+ class="highlighted-style" />
+<text x="67" y="112" font-family="arial" font-size="20px"
+ class="high-text-style">3</text>
+<path d="m 58.5,120.5 h 30 v 30 h -30 z" stroke="black" fill="#c0ffc0"
+ class="highlighted-style" />
+<text x="67" y="142" font-family="arial" font-size="20px"
+ class="high-text-style">4</text>
+
+<path d="m 145.5,0.5 h 30 v 30.956 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="22" font-family="arial" font-size="20px"
+ class="text-style">0</text>
+<path d="m 145.5,31.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="52" font-family="arial" font-size="20px"
+ class="text-style">1</text>
+<path d="m 145.5,60.5 h 30 v 30 h -30 z" stroke="black" fill="#c0ffc0"
+ class="highlighted-style" />
+<text x="155" y="82" font-family="arial" font-size="20px"
+ class="high-text-style">2</text>
+<path d="m 145.5,90.5 h 30 v 30 h -30 z" stroke="black" fill="#c0ffc0"
+ class="highlighted-style" />
+<text x="155" y="112" font-family="arial" font-size="20px"
+ class="high-text-style">3</text>
+<path d="m 145.5,180.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="202" font-family="arial" font-size="20px" fill="#808080"
+ class="faded-text-style">3</text>
+<path d="m 145.5,210.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="232" font-family="arial" font-size="20px" fill="#808080"
+ class="faded-text-style">4</text>
+<path d="m 145.5,120.5 h 30 v 30 h -30 z" stroke="black" fill="#c0ffc0"
+ class="highlighted-style" />
+<text x="155" y="142" font-family="arial" font-size="20px"
+ class="high-text-style">4</text>
+<path d="m 145.5,150.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="172" font-family="arial" font-size="20px" fill="#808080"
+ class="faded-text-style">2</text>
+<path d="m 145.5,240.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="262" font-family="arial" font-size="20px" fill="#808080"
+ class="faded-text-style">5</text>
+
+<path d="m 145.5,330.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="352" font-family="arial" font-size="20px"
+ class="text-style">0</text>
+<path d="m 145.5,360.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="382" font-family="arial" font-size="20px"
+ class="text-style">1</text>
+<path d="m 145.5,390.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="412" font-family="arial" font-size="20px" fill="#808080"
+ class="faded-text-style">5</text>
+
+<path d="M 58.5,60.5 h -25" stroke="black"
+ class="line-style" />
+<path d="M 31.5,60.5 l 10,-5 l 0,10 z" stroke="none" fill="black"
+ class="fill-style" />
+<path d="M 31.5,315.5 h 42 v -163" stroke="black" fill="none"
+ class="line-style" />
+<path d="M 73.5,151.5 l -5,10 l 10,0 z" stroke="none" fill="black"
+ class="fill-style" />
+</g>
+</svg>
diff --git a/src/corelib/doc/images/modelview-move-rows-2.svg b/src/corelib/doc/images/modelview-move-rows-2.svg
new file mode 100644
index 00000000000..12ebfc43a16
--- /dev/null
+++ b/src/corelib/doc/images/modelview-move-rows-2.svg
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ version="1.1"
+ width="200"
+ height="440"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+
+<style>
+ svg .box-style { stroke: black; fill: white }
+ svg .highlighted-style { stroke: black; fill: #c0ffc0 }
+ svg .fill-style { stroke: none; fill: black }
+ svg .line-style { stroke: black; fill: none }
+ svg .text-style { font: 20px arial; fill: black }
+ svg .high-text-style { font: 20px arial; fill: black }
+ svg .faded-text-style { font: 20px arial; fill: #808080 }
+
+ svg.dark .box-style { stroke: #f2f2f2; fill: black }
+ svg.dark .highlighted-style { stroke: #f2f2f2; fill: #c0ffc0 }
+ svg.dark .fill-style { stroke: none; fill: #f2f2f2 }
+ svg.dark .line-style { stroke: #f2f2f2; fill: none }
+ svg.dark .text-style { font: 20px arial; fill: #f2f2f2 }
+ svg.dark .high-text-style { font: 20px arial; fill: black }
+ svg.dark .faded-text-style { font: 20px arial; fill: #808080 }
+
+ [data-theme="dark"] svg .box-style { stroke: #f2f2f2; fill: black }
+ [data-theme="dark"] svg .highlighted-style { stroke: #f2f2f2; fill: #c0ffc0 }
+ [data-theme="dark"] svg .fill-style { stroke: none; fill: #f2f2f2 }
+ [data-theme="dark"] svg .line-style { stroke: #f2f2f2; fill: none }
+ [data-theme="dark"] svg .text-style { font: 20px arial; fill: #f2f2f2 }
+ [data-theme="dark"] svg .high-text-style { font: 20px arial; fill: black }
+ [data-theme="dark"] svg .faded-text-style { font: 20px arial; fill: #808080 }
+
+ [data-theme="light"] svg .box-style { stroke: black; fill: white }
+ [data-theme="light"] svg .highlighted-style { stroke: black; fill: #c0ffc0 }
+ [data-theme="light"] svg .fill-style { stroke: none; fill: black }
+ [data-theme="light"] svg .line-style { stroke: black; fill: none }
+ [data-theme="light"] svg .text-style { font: 20px arial; fill: black }
+ [data-theme="light"] svg .high-text-style { font: 20px arial; fill: black }
+ [data-theme="light"] svg .faded-text-style { font: 20px arial; fill: #808080 }
+</style>
+
+<g transform="translate(10,10)">
+<path d="m 0.5,0.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="22" font-family="arial" font-size="20px"
+ class="text-style">0</text>
+<path d="m 0.5,30.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="52" font-family="arial" font-size="20px"
+ class="text-style">1</text>
+<path d="m 0.5,60.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="82" font-family="arial" font-size="20px"
+ class="text-style">2</text>
+<path d="m 0.5,90.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="112" font-family="arial" font-size="20px"
+ class="text-style">3</text>
+<path d="m 0.5,120.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="142" font-family="arial" font-size="20px"
+ class="text-style">4</text>
+<path d="m 0.5,180.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ stroke-dasharray="5, 5"
+ class="box-style" />
+<path d="m 0.5,150.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="172" font-family="arial" font-size="20px"
+ class="text-style">5</text>
+
+<path d="m 0.5,240.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="262" font-family="arial" font-size="20px"
+ class="text-style">0</text>
+<path d="m 0.5,270.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="292" font-family="arial" font-size="20px"
+ class="text-style">1</text>
+<path d="m 0.5,300.5 h 30 v 30 h -30 z" stroke="black" fill="#c0ffc0"
+ class="highlighted-style" />
+<text x="10" y="322" font-family="arial" font-size="20px"
+ class="high-text-style">2</text>
+<path d="m 0.5,330.5 h 30 v 30 h -30 z" stroke="black" fill="#c0ffc0"
+ class="highlighted-style" />
+<text x="10" y="352" font-family="arial" font-size="20px"
+ class="high-text-style">3</text>
+<path d="m 0.5,360.5 h 30 v 30 h -30 z" stroke="black" fill="#c0ffc0"
+ class="highlighted-style" />
+<text x="10" y="382" font-family="arial" font-size="20px"
+ class="high-text-style">4</text>
+<path d="m 0.5,390.5 h 30 V 420.5 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="412" font-family="arial" font-size="20px"
+ class="text-style">5</text>
+
+<path d="m 58.5,180.5 h 30 v 30 h -30 z" stroke="black" fill="#c0ffc0"
+ class="highlighted-style" />
+<text x="67" y="202" font-family="arial" font-size="20px"
+ class="high-text-style">2</text>
+<path d="m 58.5,210.5 h 30 v 30 h -30 z" stroke="black" fill="#c0ffc0"
+ class="highlighted-style" />
+<text x="67" y="232" font-family="arial" font-size="20px"
+ class="high-text-style">3</text>
+<path d="m 58.5,240.5 h 30 v 30 h -30 z" stroke="black" fill="#c0ffc0"
+ class="highlighted-style" />
+<text x="67" y="262" font-family="arial" font-size="20px"
+ class="high-text-style">4</text>
+
+<path d="m 145.5,0.5 h 30 v 30.956 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="22" font-family="arial" font-size="20px"
+ class="text-style">0</text>
+<path d="m 145.5,31.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="52" font-family="arial" font-size="20px"
+ class="text-style">1</text>
+<path d="m 145.5,60.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="82" font-family="arial" font-size="20px"
+ class="text-style">2</text>
+<path d="m 145.5,90.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="112" font-family="arial" font-size="20px"
+ class="text-style">3</text>
+<path d="m 145.5,120.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="142" font-family="arial" font-size="20px"
+ class="text-style">4</text>
+<path d="m 145.5,150.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="172" font-family="arial" font-size="20px"
+ class="text-style">5</text>
+<path d="m 145.5,180.5 h 30 v 30 h -30 z" stroke="black" fill="#c0ffc0"
+ class="highlighted-style" />
+<text x="155" y="202" font-family="arial" font-size="20px"
+ class="high-text-style">2</text>
+<path d="m 145.5,210.5 h 30 v 30 h -30 z" stroke="black" fill="#c0ffc0"
+ class="highlighted-style" />
+<text x="155" y="232" font-family="arial" font-size="20px"
+ class="high-text-style">3</text>
+<path d="m 145.5,240.5 h 30 v 30 h -30 z" stroke="black" fill="#c0ffc0"
+ class="highlighted-style" />
+<text x="155" y="262" font-family="arial" font-size="20px"
+ class="high-text-style">4</text>
+
+<path d="m 145.5,330.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="352" font-family="arial" font-size="20px"
+ class="text-style">0</text>
+<path d="m 145.5,360.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="382" font-family="arial" font-size="20px"
+ class="text-style">1</text>
+<path d="m 145.5,390.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="412" font-family="arial" font-size="20px" fill="#808080"
+ class="faded-text-style">5</text>
+
+<path d="M 58.5,180.5 h -25" stroke="black"
+ class="line-style" />
+<path d="M 31.5,180.5 l 10,-5 l 0,10 z" stroke="none" fill="black"
+ class="fill-style" />
+<path d="M 31.5,315.5 h 42 v -43" stroke="black" fill="none"
+ class="line-style" />
+<path d="M 73.5,271.5 l -5,10 l 10,0 z" stroke="none" fill="black"
+ class="fill-style" />
+</g>
+</svg>
diff --git a/src/corelib/doc/images/modelview-move-rows-3.svg b/src/corelib/doc/images/modelview-move-rows-3.svg
new file mode 100644
index 00000000000..21d9803eb91
--- /dev/null
+++ b/src/corelib/doc/images/modelview-move-rows-3.svg
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ version="1.1"
+ width="200"
+ height="200"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+
+<style>
+ svg .box-style { stroke: black; fill: white }
+ svg .highlighted-style { stroke: black; fill: #c0ffc0 }
+ svg .fill-style { stroke: none; fill: black }
+ svg .line-style { stroke: black; fill: none }
+ svg .text-style { font: 20px arial; fill: black }
+ svg .high-text-style { font: 20px arial; fill: black }
+ svg .faded-text-style { font: 20px arial; fill: #808080 }
+
+ svg.dark .box-style { stroke: #f2f2f2; fill: black }
+ svg.dark .highlighted-style { stroke: #f2f2f2; fill: #c0ffc0 }
+ svg.dark .fill-style { stroke: none; fill: #f2f2f2 }
+ svg.dark .line-style { stroke: #f2f2f2; fill: none }
+ svg.dark .text-style { font: 20px arial; fill: #f2f2f2 }
+ svg.dark .high-text-style { font: 20px arial; fill: black }
+ svg.dark .faded-text-style { font: 20px arial; fill: #808080 }
+
+ [data-theme="dark"] svg .box-style { stroke: #f2f2f2; fill: black }
+ [data-theme="dark"] svg .highlighted-style { stroke: #f2f2f2; fill: #c0ffc0 }
+ [data-theme="dark"] svg .fill-style { stroke: none; fill: #f2f2f2 }
+ [data-theme="dark"] svg .line-style { stroke: #f2f2f2; fill: none }
+ [data-theme="dark"] svg .text-style { font: 20px arial; fill: #f2f2f2 }
+ [data-theme="dark"] svg .high-text-style { font: 20px arial; fill: black }
+ [data-theme="dark"] svg .faded-text-style { font: 20px arial; fill: #808080 }
+
+ [data-theme="light"] svg .box-style { stroke: black; fill: white }
+ [data-theme="light"] svg .highlighted-style { stroke: black; fill: #c0ffc0 }
+ [data-theme="light"] svg .fill-style { stroke: none; fill: black }
+ [data-theme="light"] svg .line-style { stroke: black; fill: none }
+ [data-theme="light"] svg .text-style { font: 20px arial; fill: black }
+ [data-theme="light"] svg .high-text-style { font: 20px arial; fill: black }
+ [data-theme="light"] svg .faded-text-style { font: 20px arial; fill: #808080 }
+</style>
+
+<g transform="translate(10,10)">
+<path d="m 0.5,0.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="22" font-family="arial" font-size="20px"
+ class="text-style">0</text>
+<path d="m 0.5,30.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="52" font-family="arial" font-size="20px"
+ class="text-style">1</text>
+<path d="m 0.5,60.5 h 30 v 30 h -30 z" stroke="black" fill="#c0ffc0"
+ class="highlighted-style" />
+<text x="10" y="82" font-family="arial" font-size="20px"
+ class="high-text-style">2</text>
+<path d="m 0.5,90.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="112" font-family="arial" font-size="20px"
+ class="text-style">3</text>
+<path d="m 0.5,120.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="142" font-family="arial" font-size="20px"
+ class="text-style">4</text>
+<path d="m 0.5,150.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="172" font-family="arial" font-size="20px"
+ class="text-style">5</text>
+
+<path d="m 58.5,0.5 h 30 v 30 h -30 z" stroke="black" fill="#c0ffc0"
+ class="highlighted-style" />
+<text x="67" y="22" font-family="arial" font-size="20px"
+ class="high-text-style">2</text>
+
+<path d="m 145.5,0.5 h 30 v 30.956 h -30 z" stroke="black" fill="#c0ffc0"
+ class="highlighted-style" />
+<text x="155" y="22" font-family="arial" font-size="20px"
+ class="high-text-style">2</text>
+<path d="m 145.5,31.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="52" font-family="arial" font-size="20px" fill="#808080"
+ class="faded-text-style">0</text>
+<path d="m 145.5,60.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="82" font-family="arial" font-size="20px" fill="#808080"
+ class="faded-text-style">1</text>
+<path d="m 145.5,90.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="112" font-family="arial" font-size="20px"
+ class="text-style">3</text>
+<path d="m 145.5,120.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="142" font-family="arial" font-size="20px"
+ class="text-style">4</text>
+<path d="m 145.5,150.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="172" font-family="arial" font-size="20px"
+ class="text-style">5</text>
+
+<path d="M 58.5,0.5 h -25" stroke="black" fill="none"
+ class="line-style" />
+<path d="M 31.5,0.5 l 10,-5 l 0,10 z" stroke="none" fill="black"
+ class="fill-style" />
+<path d="M 31.5,75.5 h 42 v -43" stroke="black" fill="none"
+ class="line-style" />
+<path d="M 73.5,31.5 l -5,10 l 10,0 z" stroke="black" fill="black"
+ class="fill-style" />
+</g>
+</svg>
diff --git a/src/corelib/doc/images/modelview-move-rows-4.svg b/src/corelib/doc/images/modelview-move-rows-4.svg
new file mode 100644
index 00000000000..708eb71f440
--- /dev/null
+++ b/src/corelib/doc/images/modelview-move-rows-4.svg
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ version="1.1"
+ width="200"
+ height="200"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+
+<style>
+ svg .box-style { stroke: black; fill: white }
+ svg .highlighted-style { stroke: black; fill: #c0ffc0 }
+ svg .fill-style { stroke: none; fill: black }
+ svg .line-style { stroke: black; fill: none }
+ svg .text-style { font: 20px arial; fill: black }
+ svg .high-text-style { font: 20px arial; fill: black }
+ svg .faded-text-style { font: 20px arial; fill: #808080 }
+
+ svg.dark .box-style { stroke: #f2f2f2; fill: black }
+ svg.dark .highlighted-style { stroke: #f2f2f2; fill: #c0ffc0 }
+ svg.dark .fill-style { stroke: none; fill: #f2f2f2 }
+ svg.dark .line-style { stroke: #f2f2f2; fill: none }
+ svg.dark .text-style { font: 20px arial; fill: #f2f2f2 }
+ svg.dark .high-text-style { font: 20px arial; fill: black }
+ svg.dark .faded-text-style { font: 20px arial; fill: #808080 }
+
+ [data-theme="dark"] svg .box-style { stroke: #f2f2f2; fill: black }
+ [data-theme="dark"] svg .highlighted-style { stroke: #f2f2f2; fill: #c0ffc0 }
+ [data-theme="dark"] svg .fill-style { stroke: none; fill: #f2f2f2 }
+ [data-theme="dark"] svg .line-style { stroke: #f2f2f2; fill: none }
+ [data-theme="dark"] svg .text-style { font: 20px arial; fill: #f2f2f2 }
+ [data-theme="dark"] svg .high-text-style { font: 20px arial; fill: black }
+ [data-theme="dark"] svg .faded-text-style { font: 20px arial; fill: #808080 }
+
+ [data-theme="light"] svg .box-style { stroke: black; fill: white }
+ [data-theme="light"] svg .highlighted-style { stroke: black; fill: #c0ffc0 }
+ [data-theme="light"] svg .fill-style { stroke: none; fill: black }
+ [data-theme="light"] svg .line-style { stroke: black; fill: none }
+ [data-theme="light"] svg .text-style { font: 20px arial; fill: black }
+ [data-theme="light"] svg .high-text-style { font: 20px arial; fill: black }
+ [data-theme="light"] svg .faded-text-style { font: 20px arial; fill: #808080 }
+</style>
+
+<g transform="translate(10,10)">
+<path d="m 0.5,0.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="22" font-family="arial" font-size="20px"
+ class="text-style">0</text>
+<path d="m 0.5,30.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="52" font-family="arial" font-size="20px"
+ class="text-style">1</text>
+<path d="m 0.5,60.5 h 30 v 30 h -30 z" stroke="black" fill="#c0ffc0"
+ class="highlighted-style" />
+<text x="10" y="82" font-family="arial" font-size="20px"
+ class="high-text-style">2</text>
+<path d="m 0.5,90.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="112" font-family="arial" font-size="20px"
+ class="text-style">3</text>
+<path d="m 0.5,120.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="142" font-family="arial" font-size="20px"
+ class="text-style">4</text>
+<path d="m 0.5,150.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="10" y="172" font-family="arial" font-size="20px"
+ class="text-style">5</text>
+
+<path d="m 58.5,120.5 h 30 v 30 h -30 z" stroke="black" fill="#c0ffc0"
+ class="highlighted-style" />
+<text x="67" y="142" font-family="arial" font-size="20px"
+ class="high-text-style">2</text>
+
+<path d="m 145.5,0.5 h 30 v 30.956 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="22" font-family="arial" font-size="20px"
+ class="text-style">0</text>
+<path d="m 145.5,31.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="52" font-family="arial" font-size="20px"
+ class="text-style">1</text>
+<path d="m 145.5,60.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="82" font-family="arial" font-size="20px" fill="#808080"
+ class="faded-text-style">3</text>
+<path d="m 145.5,90.5 h 30 v 30 h -30 z" stroke="black" fill="#c0ffc0"
+ class="highlighted-style" />
+<text x="155" y="112" font-family="arial" font-size="20px"
+ class="high-text-style">2</text>
+<path d="m 145.5,120.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="142" font-family="arial" font-size="20px"
+ class="text-style">4</text>
+<path d="m 145.5,150.5 h 30 v 30 h -30 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="155" y="172" font-family="arial" font-size="20px"
+ class="text-style">5</text>
+
+<path d="M 58.5,120.5 h -25" stroke="black" fill="none"
+ class="line-style" />
+<path d="M 31.5,120.5 l 10,-5 l 0,10 z" stroke="black" fill="black"
+ class="fill-style" />
+<path d="M 31.5,75.5 h 42 v 43" stroke="black" fill="none"
+ class="line-style" />
+<path d="M 73.5,119.5 l -5,-10 l 10,0 z" stroke="black" fill="black"
+ class="fill-style" />
+</g>
+</svg>
diff --git a/src/corelib/doc/images/stliterators1.svg b/src/corelib/doc/images/stliterators1.svg
new file mode 100644
index 00000000000..478211c78d7
--- /dev/null
+++ b/src/corelib/doc/images/stliterators1.svg
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ version="1.1"
+ width="420"
+ height="110"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+
+<style>
+ svg .box-style { stroke: black; fill: white }
+ svg .line-style { stroke: red; fill: none }
+ svg .text-style { font: 20px arial; fill: black }
+ svg .fill-style { stroke: none; fill: red }
+ svg .fn-text-style { font: 14px monospace; fill: black }
+
+ svg.dark .box-style { stroke: #f2f2f2; fill: black }
+ svg.dark .line-style { stroke: red; fill: none }
+ svg.dark .text-style { font: 20px arial; fill: #f2f2f2 }
+ svg.dark .fill-style { stroke: none; fill: red }
+ svg.dark .fn-text-style { font: 14px monospace; fill: #f2f2f2 }
+
+ [data-theme="dark"] svg .box-style { stroke: #f2f2f2; fill: black }
+ [data-theme="dark"] svg .line-style { stroke: red; fill: none }
+ [data-theme="dark"] svg .text-style { font: 20px arial; fill: #f2f2f2 }
+ [data-theme="dark"] svg .fill-style { stroke: none; fill: red }
+ [data-theme="dark"] svg .fn-text-style { font: 14px monospace; fill: #f2f2f2 }
+
+ [data-theme="light"] svg .box-style { stroke: black; fill: white }
+ [data-theme="light"] svg .line-style { stroke: red; fill: none }
+ [data-theme="light"] svg .text-style { font: 20px arial; fill: black }
+ [data-theme="light"] svg .fill-style { stroke: none; fill: red }
+ [data-theme="light"] svg .fn-text-style { font: 14px monospace; fill: black }
+</style>
+
+<g transform="translate(10.5, 10.5)">
+<path d="m 0,0 h 80 v 60 h -80 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="35" y="36" font-family="arial" font-size="20px"
+ class="text-style">A</text>
+<path d="M 40,60 v 30" stroke="red"
+ class="line-style" />
+<path d="M 40,60 l -5,10 l 10,0 z" stroke="none" fill="red"
+ class="fill-style" />
+</g>
+
+<g transform="translate(90.5, 10.5)">
+<path d="m 0,0 h 80 v 60 h -80 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="35" y="36" font-family="arial" font-size="20px"
+ class="text-style">B</text>
+<path d="M 40,60 v 30" stroke="red"
+ class="line-style" />
+<path d="M 40,60 l -5,10 l 10,0 z" stroke="none" fill="red"
+ class="fill-style" />
+</g>
+
+<g transform="translate(170.5, 10.5)">
+<path d="m 0,0 h 80 v 60 h -80 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="35" y="36" font-family="arial" font-size="20px"
+ class="text-style">C</text>
+<path d="M 40,60 v 30" stroke="red"
+ class="line-style" />
+<path d="M 40,60 l -5,10 l 10,0 z" stroke="none" fill="red"
+ class="fill-style" />
+</g>
+
+<g transform="translate(250.5, 10.5)">
+<path d="m 0,0 h 80 v 60 h -80 z" stroke="black" fill="white"
+ class="box-style" />
+<text x="35" y="36" font-family="arial" font-size="20px"
+ class="text-style">D</text>
+<path d="M 40,60 v 30" stroke="red"
+ class="line-style" />
+<path d="M 40,60 l -5,10 l 10,0 z" stroke="none" fill="red"
+ class="fill-style" />
+</g>
+
+<g transform="translate(330.5, 10.5)">
+<path d="m 0,0 h 80 v 60 h -80 z" stroke="black" fill="white"
+ stroke-dasharray="3,3"
+ class="box-style" />
+<text x="20" y="36" font-family="monospace" font-size="14px"
+ class="fn-text-style">end()</text>
+<path d="M 40,60 v 30" stroke="red"
+ class="line-style" />
+<path d="M 40,60 l -5,10 l 10,0 z" stroke="none" fill="red"
+ class="fill-style" />
+</g>
+</svg>
diff --git a/src/corelib/doc/src/cmake/cmake-configure-variables.qdoc b/src/corelib/doc/src/cmake/cmake-configure-variables.qdoc
index b8e5e038a33..7cd3f91b901 100644
--- a/src/corelib/doc/src/cmake/cmake-configure-variables.qdoc
+++ b/src/corelib/doc/src/cmake/cmake-configure-variables.qdoc
@@ -525,7 +525,6 @@ To prevent this, set \c QT_NO_SET_XCODE_BUNDLE_IDENTIFIER to \c TRUE.
\summary {Enables verbose mode of deployment tools.}
\cmakevariablesince 6.3
-\preliminarycmakevariable
Enables verbose mode of the \l androiddeployqt deployment tool when it is called
internally at build time, usually during target finalization.
@@ -545,7 +544,6 @@ must be set before the first \c{find_package(Qt6)} call to have that effect.
\summary {Name of the file to include for setting up deployment support.}
\cmakevariablesince 6.3
-\preliminarycmakevariable
\note The value of this variable should never be modified by project code.
This configure-phase variable is set by the Core package. It is intended to be
diff --git a/src/corelib/doc/src/cmake/cmake-properties.qdoc b/src/corelib/doc/src/cmake/cmake-properties.qdoc
index 821862494a2..c7b1a27a4b4 100644
--- a/src/corelib/doc/src/cmake/cmake-properties.qdoc
+++ b/src/corelib/doc/src/cmake/cmake-properties.qdoc
@@ -665,7 +665,6 @@ UTF-8 input). Use the \l QT_NO_CAST_FROM_ASCII and
\summary {Specifies the default Qt resource prefix.}
\cmakepropertysince 6.0
-\preliminarycmakeproperty
When using \l{qt6_add_resources}{qt_add_resources} without a \c PREFIX
argument, then the value of this target property will be used as
@@ -773,7 +772,6 @@ CMake properties:
\brief Sets the FOLDER property for Qt-internal targets.
\cmakepropertysince 6.5
-\preliminarycmakeproperty
Name of the \l FOLDER for internal targets that are added by Qt's CMake
commands.
diff --git a/src/corelib/doc/src/cmake/qt_deploy_translations.qdoc b/src/corelib/doc/src/cmake/qt_deploy_translations.qdoc
index 43ff23a35a1..e6d3edbbdc4 100644
--- a/src/corelib/doc/src/cmake/qt_deploy_translations.qdoc
+++ b/src/corelib/doc/src/cmake/qt_deploy_translations.qdoc
@@ -17,7 +17,6 @@ can only be called from a deployment script. It cannot be called directly by the
project during the configure stage.
\cmakecommandsince 6.5
-\preliminarycmakecommand
\note This command does not usually need to be called directly. It is used
internally by other higher level commands, but projects wishing to
implement more customized deployment logic may find it useful.
diff --git a/src/corelib/doc/src/cmake/qt_extract_metatypes.qdoc b/src/corelib/doc/src/cmake/qt_extract_metatypes.qdoc
index 7ec8d90f9b1..24112b1cf87 100644
--- a/src/corelib/doc/src/cmake/qt_extract_metatypes.qdoc
+++ b/src/corelib/doc/src/cmake/qt_extract_metatypes.qdoc
@@ -11,7 +11,6 @@
\summary {Extracts metatypes from a Qt target and generates an associated metatypes.json file.}
\cmakecommandsince 6.0
-\preliminarycmakecommand
\section1 Synopsis
diff --git a/src/corelib/doc/src/cmake/qt_finalize_project.qdoc b/src/corelib/doc/src/cmake/qt_finalize_project.qdoc
index 5506712691e..f60b850fcdb 100644
--- a/src/corelib/doc/src/cmake/qt_finalize_project.qdoc
+++ b/src/corelib/doc/src/cmake/qt_finalize_project.qdoc
@@ -9,7 +9,6 @@
\keyword qt6_finalize_project
\summary {Handles various common platform-specific tasks associated with a Qt project.}
-\preliminarycmakecommand
\include cmake-find-package-core.qdocinc
diff --git a/src/corelib/doc/src/containers.qdoc b/src/corelib/doc/src/containers.qdoc
index 874ab807609..38ce2188e13 100644
--- a/src/corelib/doc/src/containers.qdoc
+++ b/src/corelib/doc/src/containers.qdoc
@@ -275,7 +275,7 @@
The diagram below shows the valid iterator positions as red
arrows for a list containing four items:
- \image stliterators1.png
+ \image stliterators1.svg STL-style iterators point to items
Iterating backward with an STL-style iterator is done with reverse iterators:
diff --git a/src/corelib/doc/src/java-style-iterators.qdoc b/src/corelib/doc/src/java-style-iterators.qdoc
index a0e5c53d633..fc1378bb718 100644
--- a/src/corelib/doc/src/java-style-iterators.qdoc
+++ b/src/corelib/doc/src/java-style-iterators.qdoc
@@ -70,7 +70,7 @@
\l{QListIterator::next()}{next()} and
\l{QListIterator::previous()}{previous()} on an iterator:
- \image javaiterators2.png Iterating to the next and previous items
+ \image javaiterators2.svg Iterating to the next and previous items
The following table summarizes the QListIterator API:
diff --git a/src/corelib/itemmodels/qabstractitemmodel.cpp b/src/corelib/itemmodels/qabstractitemmodel.cpp
index c960e11f6bb..58a057009ff 100644
--- a/src/corelib/itemmodels/qabstractitemmodel.cpp
+++ b/src/corelib/itemmodels/qabstractitemmodel.cpp
@@ -2867,7 +2867,7 @@ bool QAbstractItemModel::decodeData(int row, int column, const QModelIndex &pare
\table 80%
\row
- \li \inlineimage modelview-begin-insert-rows.png Inserting rows
+ \li \inlineimage modelview-begin-insert-rows.svg Inserting rows
\li Specify the first and last row numbers for the span of rows you
want to insert into an item in a model.
@@ -2878,7 +2878,7 @@ bool QAbstractItemModel::decodeData(int row, int column, const QModelIndex &pare
This inserts the three new rows as rows 2, 3, and 4.
\row
- \li \inlineimage modelview-begin-append-rows.png Appending rows
+ \li \inlineimage modelview-begin-append-rows.svg Appending rows
\li To append rows, insert them after the last row.
For example, as shown in the diagram, we append two rows to a
@@ -2934,7 +2934,7 @@ void QAbstractItemModel::endInsertRows()
\table 80%
\row
- \li \inlineimage modelview-begin-remove-rows.png Removing rows
+ \li \inlineimage modelview-begin-remove-rows.svg Removing rows
\li Specify the first and last row numbers for the span of rows you
want to remove from an item in a model.
@@ -3055,7 +3055,7 @@ void QAbstractItemModelPrivate::executePendingOperations() const { }
\table 80%
\row
- \li \inlineimage modelview-move-rows-1.png Moving rows to another parent
+ \li \inlineimage modelview-move-rows-1.svg Moving rows to another parent
\li Specify the first and last row numbers for the span of rows in
the source parent you want to move in the model. Also specify
the row in the destination parent to move the span to.
@@ -3069,7 +3069,7 @@ void QAbstractItemModelPrivate::executePendingOperations() const { }
This moves the three rows rows 2, 3, and 4 in the source to become 2, 3 and 4 in
the destination. Other affected siblings are displaced accordingly.
\row
- \li \inlineimage modelview-move-rows-2.png Moving rows to append to another parent
+ \li \inlineimage modelview-move-rows-2.svg Moving rows to append to another parent
\li To append rows to another parent, move them to after the last row.
For example, as shown in the diagram, we move three rows to a
@@ -3079,7 +3079,7 @@ void QAbstractItemModelPrivate::executePendingOperations() const { }
This moves the target rows to the end of the target parent as 6, 7 and 8.
\row
- \li \inlineimage modelview-move-rows-3.png Moving rows in the same parent up
+ \li \inlineimage modelview-move-rows-3.svg Moving rows in the same parent up
\li To move rows within the same parent, specify the row to move them to.
For example, as shown in the diagram, we move one item from row 2 to row 0,
@@ -3094,7 +3094,7 @@ void QAbstractItemModelPrivate::executePendingOperations() const { }
it is already)
\row
- \li \inlineimage modelview-move-rows-4.png Moving rows in the same parent down
+ \li \inlineimage modelview-move-rows-4.svg Moving rows in the same parent down
\li To move rows within the same parent, specify the row to move them to.
For example, as shown in the diagram, we move one item from row 2 to row 4,
@@ -3176,7 +3176,7 @@ void QAbstractItemModel::endMoveRows()
\table 80%
\row
- \li \inlineimage modelview-begin-insert-columns.png Inserting columns
+ \li \inlineimage modelview-begin-insert-columns.svg Inserting columns
\li Specify the first and last column numbers for the span of columns
you want to insert into an item in a model.
@@ -3187,7 +3187,7 @@ void QAbstractItemModel::endMoveRows()
This inserts the three new columns as columns 4, 5, and 6.
\row
- \li \inlineimage modelview-begin-append-columns.png Appending columns
+ \li \inlineimage modelview-begin-append-columns.svg Appending columns
\li To append columns, insert them after the last column.
For example, as shown in the diagram, we append three columns to a
@@ -3245,7 +3245,7 @@ void QAbstractItemModel::endInsertColumns()
\table 80%
\row
- \li \inlineimage modelview-begin-remove-columns.png Removing columns
+ \li \inlineimage modelview-begin-remove-columns.svg Removing columns
\li Specify the first and last column numbers for the span of columns
you want to remove from an item in a model.
diff --git a/src/corelib/kernel/qmetacontainer.h b/src/corelib/kernel/qmetacontainer.h
index c9d3a6bf9c6..66047afefd4 100644
--- a/src/corelib/kernel/qmetacontainer.h
+++ b/src/corelib/kernel/qmetacontainer.h
@@ -971,18 +971,11 @@ public:
Iterator mutableEnd();
QVariant at(qsizetype idx) const;
- void set(qsizetype idx, const QVariant &value);
+ void setAt(qsizetype idx, const QVariant &value);
void append(const QVariant &value);
void prepend(const QVariant &value);
void removeLast();
void removeFirst();
-
-#if QT_DEPRECATED_SINCE(6, 11)
- enum Position: quint8 { Unspecified, AtBegin, AtEnd };
- void addValue(const QVariant &value, Position position = Unspecified);
- void removeValue(Position position = Unspecified);
- QMetaType valueMetaType() const;
-#endif // QT_DEPRECATED_SINCE(6, 11)
};
#else
using Iterable = QtMetaContainerPrivate::Sequence;
diff --git a/src/corelib/kernel/qmetasequence.cpp b/src/corelib/kernel/qmetasequence.cpp
index 2a3a923d5ca..018dd610146 100644
--- a/src/corelib/kernel/qmetasequence.cpp
+++ b/src/corelib/kernel/qmetasequence.cpp
@@ -531,39 +531,6 @@ void QMetaSequence::valueAtConstIterator(const void *iterator, void *result) con
*/
/*!
- \enum QMetaSequence::Iterable::Position
- \deprecated [6.11] Use append(), prepend(), removeFirst(), or removeLast()
-
- Specifies the position at which an element shall be added to or removed from
- the iterable.
-
- \value AtBegin
- Add or remove at the beginning of the iterable.
- \value AtEnd
- Add or remove at the end of the iterable.
- \value Unspecified
- Add or remove at an unspecified position in the iterable.
- */
-
-/*!
- \fn void QMetaSequence::Iterable::addValue(const QVariant &value, Position position)
- \deprecated [6.11] Use append() or prepend()
- Adds \a value to the container, at \a position, if possible.
- */
-
-/*!
- \deprecated [6.11] Use removeFirst() or removeLast()
- \fn void QMetaSequence::Iterable::removeValue(Position position)
- Removes a value from the container, at \a position, if possible.
- */
-
-/*!
- \deprecated [6.11] Use QMetaSequence::valueMetaType()
- \fn QMetaType QMetaSequence::Iterable::valueMetaType() const
- Returns the meta type for values stored in the underlying container.
- */
-
-/*!
\fn QVariant QMetaSequence::Iterable::at(qsizetype idx) const
Returns the value at position \a idx in the container.
@@ -574,13 +541,8 @@ void QMetaSequence::valueAtConstIterator(const void *iterator, void *result) con
*/
/*!
- \fn void QMetaSequence::Iterable::set(qsizetype idx, const QVariant &value)
+ \fn void QMetaSequence::Iterable::setAt(qsizetype idx, const QVariant &value)
Sets the element at position \a idx in the container to \a value.
-
- \note If the underlying container does not provide a native way to assign
- an element at an index, this method will synthesize the assignment
- using iterators. This behavior is deprecated and will be removed in a
- future version of Qt.
*/
/*!
diff --git a/src/corelib/kernel/qmetasequence.h b/src/corelib/kernel/qmetasequence.h
index 26156e7924f..f8052476d79 100644
--- a/src/corelib/kernel/qmetasequence.h
+++ b/src/corelib/kernel/qmetasequence.h
@@ -196,25 +196,11 @@ public:
});
}
- void set(qsizetype idx, const QVariant &value)
+ void setAt(qsizetype idx, const QVariant &value)
{
const QMetaSequence meta = metaContainer();
QtPrivate::QVariantTypeCoercer coercer;
- const void *dataPtr = coercer.coerce(value, meta.valueMetaType());
- if (meta.canSetValueAtIndex()) {
- meta.setValueAtIndex(mutableIterable(), idx, dataPtr);
- return;
- }
-
-#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
- // We shouldn't second-guess the underlying container
- QtPrivate::warnSynthesizedAccess(
- "set() called on an iterable without native indexed accessors. This is slow");
- void *it = meta.begin(m_iterable.mutablePointer());
- meta.advanceIterator(it, idx);
- meta.setValueAtIterator(it, dataPtr);
- meta.destroyIterator(it);
-#endif
+ meta.setValueAtIndex(mutableIterable(), idx, coercer.coerce(value, meta.valueMetaType()));
}
void append(const QVariant &value)
@@ -261,6 +247,9 @@ public:
QMetaType valueMetaType() const
Q_DECL_EQ_DELETE_X("Use QMetaSequence::valueMetaType() instead.");
+ void set(qsizetype idx, const QVariant &value)
+ Q_DECL_EQ_DELETE_X("Use setAt() instead.");
+
QT_WARNING_POP
#endif // QT_DEPRECATED_SINCE(6, 11)
};
diff --git a/src/corelib/text/qregularexpression.cpp b/src/corelib/text/qregularexpression.cpp
index 5cc8e8681bb..0c65e18ec10 100644
--- a/src/corelib/text/qregularexpression.cpp
+++ b/src/corelib/text/qregularexpression.cpp
@@ -952,7 +952,7 @@ void QRegularExpressionPrivate::getPatternInfo()
namespace {
struct PcreJitStackFree
{
- void operator()(pcre2_jit_stack_16 *stack)
+ void operator()(pcre2_jit_stack_16 *stack) const
{
if (stack)
pcre2_jit_stack_free_16(stack);
diff --git a/src/corelib/text/qstringconverter_p.h b/src/corelib/text/qstringconverter_p.h
index 3ac60ce8c70..3923c2f302f 100644
--- a/src/corelib/text/qstringconverter_p.h
+++ b/src/corelib/text/qstringconverter_p.h
@@ -334,6 +334,7 @@ struct QUtf8
static char16_t *convertToUnicode(char16_t *dst, QByteArrayView in, QStringConverter::State *state);
+ Q_CORE_EXPORT
static char *convertFromUnicode(char *dst, QStringView in) noexcept;
Q_CORE_EXPORT static QByteArray convertFromUnicode(QStringView in);
Q_CORE_EXPORT static QByteArray convertFromUnicode(QStringView in, QStringConverter::State *state);
diff --git a/src/corelib/thread/qfuture.qdoc b/src/corelib/thread/qfuture.qdoc
index f3f32e20adc..5e97086694b 100644
--- a/src/corelib/thread/qfuture.qdoc
+++ b/src/corelib/thread/qfuture.qdoc
@@ -786,7 +786,7 @@
between the second and third result, and returns the second result; and
so on.
- \image javaiterators1.png
+ \image javaiterators1.svg
Here's how to iterate over the elements in reverse order:
diff --git a/src/gui/painting/qcolor.cpp b/src/gui/painting/qcolor.cpp
index fe79490f54b..d63da38b747 100644
--- a/src/gui/painting/qcolor.cpp
+++ b/src/gui/painting/qcolor.cpp
@@ -2196,29 +2196,27 @@ QColor QColor::toHsv() const noexcept
color.ct.ahsv.alpha = ct.argb.alpha;
color.ct.ahsv.pad = 0;
- const float r = ct.argb.red / float(USHRT_MAX);
- const float g = ct.argb.green / float(USHRT_MAX);
- const float b = ct.argb.blue / float(USHRT_MAX);
- const float max = Q_MAX_3(r, g, b);
- const float min = Q_MIN_3(r, g, b);
- const float delta = max - min;
- color.ct.ahsv.value = qRound(max * USHRT_MAX);
- if (qFuzzyIsNull(delta)) {
+ const ushort r = ct.argb.red;
+ const ushort g = ct.argb.green;
+ const ushort b = ct.argb.blue;
+ const auto [min, max] = std::minmax({r, g, b});
+ color.ct.ahsv.value = max;
+ if (max == min) {
// achromatic case, hue is undefined
color.ct.ahsv.hue = USHRT_MAX;
color.ct.ahsv.saturation = 0;
} else {
// chromatic case
- float hue = 0;
+ const float delta = max - min; // cannot overflow
+ float hue;
color.ct.ahsv.saturation = qRound((delta / max) * USHRT_MAX);
- if (qFuzzyCompare(r, max)) {
- hue = ((g - b) /delta);
- } else if (qFuzzyCompare(g, max)) {
- hue = (2.0f + (b - r) / delta);
- } else if (qFuzzyCompare(b, max)) {
- hue = (4.0f + (r - g) / delta);
+ if (max == r) {
+ hue = 0 + (g - b) / delta;
+ } else if (max == g) {
+ hue = 2 + (b - r) / delta;
} else {
- Q_ASSERT_X(false, "QColor::toHsv", "internal error");
+ Q_ASSERT(max == b); // max({r,g,b}) must be one of r, g, and b!
+ hue = 4 + (r - g) / delta;
}
hue *= 60.0f;
if (hue < 0.0f)
diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp
index 6428653de26..66bb65685fa 100644
--- a/src/network/access/qnetworkaccessmanager.cpp
+++ b/src/network/access/qnetworkaccessmanager.cpp
@@ -216,6 +216,19 @@ static void ensureInitialized()
can be:
\snippet code/src_network_access_qnetworkaccessmanager.cpp 1
+ Since Qt 6.11 the defaults of the TCP Keepalive parameters used by
+ QNetworkAccessManager have been changed. With the current settings
+ the connection will be terminated after 2 minutes of inactivity.
+
+ These settings can be changed the individual requests, to make
+ them more lenient, or even more aggressive via the QNetworkRequest API.
+ \snippet http/httpwindow.cpp qnam-tcpkeepalive
+
+ In the above snippet we are picking a more aggressive strategy, to
+ terminate the connection after thirty seconds of inactivity. This can
+ be useful, for example, in early detection of network hangs caused
+ by network changes on Linux.
+
\sa QNetworkRequest, QNetworkReply, QNetworkProxy
*/
diff --git a/src/network/kernel/qauthenticator.cpp b/src/network/kernel/qauthenticator.cpp
index 2ef1c31ce1c..7be1d7fe3aa 100644
--- a/src/network/kernel/qauthenticator.cpp
+++ b/src/network/kernel/qauthenticator.cpp
@@ -365,7 +365,7 @@ bool QAuthenticator::isNull() const
state.
*/
-void QAuthenticator::clear() noexcept
+void QAuthenticator::clear()
{
*d = QAuthenticatorPrivate();
d->phase = QAuthenticatorPrivate::Done;
diff --git a/src/network/kernel/qauthenticator.h b/src/network/kernel/qauthenticator.h
index db309fb87ad..c4993ff0fc7 100644
--- a/src/network/kernel/qauthenticator.h
+++ b/src/network/kernel/qauthenticator.h
@@ -44,7 +44,7 @@ public:
bool isNull() const;
void detach();
- void clear() noexcept;
+ void clear();
private:
friend class QAuthenticatorPrivate;
QAuthenticatorPrivate *d;
diff --git a/src/plugins/styles/modernwindows/qwindows11style.cpp b/src/plugins/styles/modernwindows/qwindows11style.cpp
index e9b90d787bc..98e51397c17 100644
--- a/src/plugins/styles/modernwindows/qwindows11style.cpp
+++ b/src/plugins/styles/modernwindows/qwindows11style.cpp
@@ -2622,6 +2622,7 @@ void QWindows11Style::polish(QPalette& result)
d->m_titleBarNormalIcon = QIcon();
d->m_toolbarExtensionButton = QIcon();
d->m_lineEditClearButton = QIcon();
+ d->m_tabCloseButton = QIcon();
}
QPixmap QWindows11Style::standardPixmap(StandardPixmap standardPixmap,
@@ -2662,6 +2663,14 @@ QIcon QWindows11Style::standardIcon(StandardPixmap standardIcon,
}
return d->m_toolbarExtensionButton;
}
+ case SP_TabCloseButton: {
+ if (d->m_tabCloseButton.isNull()) {
+ auto e = new WinFontIconEngine(fluentIcon(Icon::ChromeClose), d->assetFont);
+ e->setScale(0.6);
+ d->m_tabCloseButton = QIcon(e);
+ }
+ return d->m_tabCloseButton;
+ }
default:
break;
}
diff --git a/src/plugins/styles/modernwindows/qwindows11style_p.h b/src/plugins/styles/modernwindows/qwindows11style_p.h
index 9d0cdda3e33..43a344a6ac9 100644
--- a/src/plugins/styles/modernwindows/qwindows11style_p.h
+++ b/src/plugins/styles/modernwindows/qwindows11style_p.h
@@ -125,6 +125,7 @@ class QWindows11StylePrivate : public QWindowsVistaStylePrivate {
protected:
QIcon m_toolbarExtensionButton;
QIcon m_lineEditClearButton;
+ QIcon m_tabCloseButton;
};
QT_END_NAMESPACE
diff --git a/src/testlib/qtestlog.cpp b/src/testlib/qtestlog.cpp
index 29cafe9aea4..f3db4ece49e 100644
--- a/src/testlib/qtestlog.cpp
+++ b/src/testlib/qtestlog.cpp
@@ -305,9 +305,7 @@ namespace QTest {
{
static QBasicAtomicInt counter = Q_BASIC_ATOMIC_INITIALIZER(QTest::maxWarnings);
- auto loggerCapture = loggers->allLoggers();
-
- if (loggerCapture.isEmpty()) {
+ if (loggers.isDestroyed() || loggers->allLoggers().isEmpty()) {
// the message handler may be called from a worker thread, after the main thread stopped
// logging. Forwarding to original message handler to avoid swallowing the message
Q_ASSERT(oldMessageHandler);
@@ -326,6 +324,8 @@ namespace QTest {
return;
}
+ auto loggerCapture = loggers->allLoggers();
+
if (type != QtFatalMsg) {
if (counter.loadRelaxed() <= 0)
return;
diff --git a/src/tools/macdeployqt/shared/shared.cpp b/src/tools/macdeployqt/shared/shared.cpp
index 0731fb616ed..7f8590ae894 100644
--- a/src/tools/macdeployqt/shared/shared.cpp
+++ b/src/tools/macdeployqt/shared/shared.cpp
@@ -1008,6 +1008,31 @@ DeploymentInfo deployQtFrameworks(QList<FrameworkInfo> frameworks,
rpathsUsed.append(framework.rpathUsed);
}
+ // To properly find all dependencies of the current framework / library further down in
+ // getQtFrameworks, we need to get its rpaths, resolve them in the context of its original
+ // location before it is copied, and add them as candidate rpaths.
+ //
+ // This is necessary to handle cases like
+ // (1) QtNetwork.framework -> (2) libbrotlidec.dylib -> (3) libbrotlicommon.1.dylib
+ // to correctly resolve the path to (3) when it is referenced as
+ // '@rpath/libbrotlicommon.1.dylib' and (2) has an LC_RPATH of '@loader_path/../lib', and
+ // no other absolute rpaths. So the '@loader_path/../lib' will be resolved relative
+ // to (2)'s original location and its LC_RPATH.
+ //
+ // Otherwise we'd only have the Qt prefix and the current bundle app dir as rpath
+ // candidates, and once (2) is copied into the app bundle, there's no way
+ // '@rpath/libbrotlicommon.1.dylib' could resolve to the real path on disk from the two
+ // candidates above.
+ if (!framework.sourceFilePath.isEmpty()) {
+ const QList<QString> sourceRPaths = getBinaryRPaths(framework.sourceFilePath, true);
+ for (const QString &sourceRPath : sourceRPaths) {
+ const QDir sourceRPathDir(sourceRPath);
+ if (sourceRPathDir.exists() && !rpathsUsed.contains(sourceRPath)) {
+ rpathsUsed.append(sourceRPath);
+ }
+ }
+ }
+
// Copy the framework/dylib to the app bundle.
const QString deployedBinaryPath = framework.isDylib ? copyDylib(framework, bundlePath)
: copyFramework(framework, bundlePath);
@@ -1032,7 +1057,7 @@ DeploymentInfo deployQtFrameworks(QList<FrameworkInfo> frameworks,
for (const FrameworkInfo &dependency : dependencies) {
if (dependency.rpathUsed.isEmpty()) {
changeInstallName(bundlePath, dependency, QStringList() << deployedBinaryPath, useLoaderPath);
- } else {
+ } else if (!rpathsUsed.contains(dependency.rpathUsed)) {
rpathsUsed.append(dependency.rpathUsed);
}
diff --git a/src/widgets/dialogs/qwizard.cpp b/src/widgets/dialogs/qwizard.cpp
index e23ed9f23ee..58a4115374e 100644
--- a/src/widgets/dialogs/qwizard.cpp
+++ b/src/widgets/dialogs/qwizard.cpp
@@ -259,7 +259,7 @@ public:
void setup(const QWizardLayoutInfo &info, const QString &title,
const QString &subTitle, const QPixmap &logo, const QPixmap &banner,
Qt::TextFormat titleFormat, Qt::TextFormat subTitleFormat,
- QWizard::BannerSizePolicy bannerSizePolicy);
+ QWizard::BannerStretchPolicy bannerStretchPolicy);
protected:
void paintEvent(QPaintEvent *event) override;
@@ -273,7 +273,7 @@ private:
QLabel *logoLabel;
QGridLayout *layout;
QPixmap bannerPixmap;
- QWizard::BannerSizePolicy wizardBannerSizePolicy = QWizard::BannerSizePolicy::NoStretch;
+ QWizard::BannerStretchPolicy wizardBannerStretchPolicy = QWizard::BannerStretchPolicy::NoStretch;
};
QWizardHeader::QWizardHeader(QWidget *parent)
@@ -329,7 +329,7 @@ bool QWizardHeader::vistaDisabled() const
void QWizardHeader::setup(const QWizardLayoutInfo &info, const QString &title,
const QString &subTitle, const QPixmap &logo, const QPixmap &banner,
Qt::TextFormat titleFormat, Qt::TextFormat subTitleFormat,
- QWizard::BannerSizePolicy bannerSizePolicy)
+ QWizard::BannerStretchPolicy bannerStretchPolicy)
{
bool modern = ((info.wizStyle == QWizard::ModernStyle)
#if QT_CONFIG(style_windowsvista)
@@ -337,7 +337,7 @@ void QWizardHeader::setup(const QWizardLayoutInfo &info, const QString &title,
#endif
);
- wizardBannerSizePolicy = bannerSizePolicy;
+ wizardBannerStretchPolicy = bannerStretchPolicy;
layout->setRowMinimumHeight(0, modern ? ModernHeaderTopMargin : 0);
layout->setRowMinimumHeight(1, modern ? info.topLevelMarginTop - ModernHeaderTopMargin - 1 : 0);
@@ -364,7 +364,7 @@ void QWizardHeader::setup(const QWizardLayoutInfo &info, const QString &title,
bannerPixmap = QPixmap();
}
- if (bannerPixmap.isNull() || wizardBannerSizePolicy != QWizard::BannerSizePolicy::NoStretch) {
+ if (bannerPixmap.isNull() || wizardBannerStretchPolicy != QWizard::BannerStretchPolicy::NoStretch) {
/*
There is no widthForHeight() function, so we simulate it with a loop.
*/
@@ -392,12 +392,12 @@ void QWizardHeader::setup(const QWizardLayoutInfo &info, const QString &title,
void QWizardHeader::paintEvent(QPaintEvent * /* event */)
{
QStylePainter painter(this);
- switch (wizardBannerSizePolicy) {
- case QWizard::BannerSizePolicy::Stretch:
+ switch (wizardBannerStretchPolicy) {
+ case QWizard::BannerStretchPolicy::Stretch:
painter.setRenderHint(QPainter::SmoothPixmapTransform);
painter.drawPixmap(0, 0, width(), height(), bannerPixmap);
break;
- case QWizard::BannerSizePolicy::NoStretch:
+ case QWizard::BannerStretchPolicy::NoStretch:
painter.drawPixmap(0, 0, bannerPixmap);
break;
}
@@ -582,7 +582,7 @@ public:
QList<QWizard::WizardButton> buttonsCustomLayout;
Qt::TextFormat titleFmt = Qt::AutoText;
Qt::TextFormat subTitleFmt = Qt::AutoText;
- QWizard::BannerSizePolicy bannerSizePolicy = QWizard::BannerSizePolicy::NoStretch;
+ QWizard::BannerStretchPolicy bannerStretchPolicy = QWizard::BannerStretchPolicy::NoStretch;
mutable QPixmap defaultPixmaps[QWizard::NPixmaps];
union {
@@ -1238,7 +1238,7 @@ void QWizardPrivate::updateLayout()
Q_ASSERT(page);
headerWidget->setup(info, page->title(), page->subTitle(),
page->pixmap(QWizard::LogoPixmap), page->pixmap(QWizard::BannerPixmap),
- titleFmt, subTitleFmt, bannerSizePolicy);
+ titleFmt, subTitleFmt, bannerStretchPolicy);
}
if (info.watermark || info.sideWidget) {
@@ -2097,7 +2097,7 @@ void QWizardAntiFlickerWidget::paintEvent(QPaintEvent *)
*/
/*!
- \enum QWizard::BannerSizePolicy
+ \enum QWizard::BannerStretchPolicy
This enum specifies the banner size policy when there is a banner.
@@ -2800,25 +2800,25 @@ Qt::TextFormat QWizard::subTitleFormat() const
}
/*!
- \property QWizard::bannerSizePolicy
+ \property QWizard::bannerStretchPolicy
\brief the banner size policy
The default policy is \l{QWizard::}{NoStretch}
*/
-void QWizard::setBannerSizePolicy(QWizard::BannerSizePolicy bannerSizePolicy)
+void QWizard::setBannerStretchPolicy(QWizard::BannerStretchPolicy bannerStretchPolicy)
{
Q_D(QWizard);
- if (d->bannerSizePolicy == bannerSizePolicy)
+ if (d->bannerStretchPolicy == bannerStretchPolicy)
return;
- d->bannerSizePolicy = bannerSizePolicy;
+ d->bannerStretchPolicy = bannerStretchPolicy;
d->updateLayout();
}
-QWizard::BannerSizePolicy QWizard::bannerSizePolicy() const
+QWizard::BannerStretchPolicy QWizard::bannerStretchPolicy() const
{
Q_D(const QWizard);
- return d->bannerSizePolicy;
+ return d->bannerStretchPolicy;
}
/*!
diff --git a/src/widgets/dialogs/qwizard.h b/src/widgets/dialogs/qwizard.h
index 801fd7f4ef4..a421b3ecb40 100644
--- a/src/widgets/dialogs/qwizard.h
+++ b/src/widgets/dialogs/qwizard.h
@@ -25,7 +25,7 @@ class Q_WIDGETS_EXPORT QWizard : public QDialog
Q_PROPERTY(Qt::TextFormat subTitleFormat READ subTitleFormat WRITE setSubTitleFormat)
Q_PROPERTY(int startId READ startId WRITE setStartId)
Q_PROPERTY(int currentId READ currentId WRITE setCurrentId NOTIFY currentIdChanged)
- Q_PROPERTY(BannerSizePolicy bannerSizePolicy READ bannerSizePolicy WRITE setBannerSizePolicy REVISION(6, 11))
+ Q_PROPERTY(BannerStretchPolicy bannerStretchPolicy READ bannerStretchPolicy WRITE setBannerStretchPolicy REVISION(6, 11))
public:
enum WizardButton {
@@ -62,11 +62,11 @@ public:
};
Q_ENUM(WizardStyle)
- enum class BannerSizePolicy {
+ enum class BannerStretchPolicy {
NoStretch,
Stretch,
};
- Q_ENUM(BannerSizePolicy)
+ Q_ENUM(BannerStretchPolicy)
enum WizardOption {
IndependentPages = 0x00000001,
@@ -131,8 +131,8 @@ public:
Qt::TextFormat titleFormat() const;
void setSubTitleFormat(Qt::TextFormat format);
Qt::TextFormat subTitleFormat() const;
- void setBannerSizePolicy(BannerSizePolicy bannerSizePolicy);
- QWizard::BannerSizePolicy bannerSizePolicy() const;
+ void setBannerStretchPolicy(BannerStretchPolicy bannerStretchPolicy);
+ QWizard::BannerStretchPolicy bannerStretchPolicy() const;
void setPixmap(WizardPixmap which, const QPixmap &pixmap);
QPixmap pixmap(WizardPixmap which) const;
diff --git a/src/widgets/widgets/qlcdnumber.cpp b/src/widgets/widgets/qlcdnumber.cpp
index 2c4b4e334d5..ac8e00af95e 100644
--- a/src/widgets/widgets/qlcdnumber.cpp
+++ b/src/widgets/widgets/qlcdnumber.cpp
@@ -5,6 +5,7 @@
#include "qlcdnumber.h"
#include "qbitarray.h"
+#include "qnumeric.h"
#include "qpainter.h"
#include "private/qframe_p.h"
@@ -110,22 +111,17 @@ public:
*/
-static QString int2string(int num, int base, int ndigits, bool *oflow)
+static QString int2string(int number, int base, int ndigits, bool *oflow)
{
QString s;
- bool negative;
- if (num < 0) {
- negative = true;
- num = -num;
- } else {
- negative = false;
- }
+ const bool negative = number < 0;
+ const uint num = QtPrivate::qUnsignedAbs(number);
switch(base) {
case QLCDNumber::Hex:
s = QString::asprintf("%*x", ndigits, num);
break;
case QLCDNumber::Dec:
- s = QString::asprintf("%*i", ndigits, num);
+ s = QString::asprintf("%*u", ndigits, num);
break;
case QLCDNumber::Oct:
s = QString::asprintf("%*o", ndigits, num);
diff --git a/src/widgets/widgets/qtabbar.cpp b/src/widgets/widgets/qtabbar.cpp
index 0f0abb6e1d5..44218d41ded 100644
--- a/src/widgets/widgets/qtabbar.cpp
+++ b/src/widgets/widgets/qtabbar.cpp
@@ -52,6 +52,14 @@ public:
void enterEvent(QEnterEvent *event) override;
void leaveEvent(QEvent *event) override;
void paintEvent(QPaintEvent *event) override;
+
+ void setParentClipRect(const QRect &clipRect)
+ {
+ m_parentClipRect = clipRect;
+ }
+
+protected:
+ QRect m_parentClipRect;
};
}
@@ -598,10 +606,11 @@ QRect QTabBarPrivate::normalizedScrollRect(int index)
q->initStyleOption(&opt, currentIndex);
opt.rect = q->rect();
- QRect scrollButtonLeftRect = q->style()->subElementRect(QStyle::SE_TabBarScrollLeftButton, &opt, q);
- QRect scrollButtonRightRect = q->style()->subElementRect(QStyle::SE_TabBarScrollRightButton, &opt, q);
- QRect tearLeftRect = q->style()->subElementRect(QStyle::SE_TabBarTearIndicatorLeft, &opt, q);
- QRect tearRightRect = q->style()->subElementRect(QStyle::SE_TabBarTearIndicatorRight, &opt, q);
+ const auto style = q->style();
+ QRect scrollButtonLeftRect = style->subElementRect(QStyle::SE_TabBarScrollLeftButton, &opt, q);
+ QRect scrollButtonRightRect = style->subElementRect(QStyle::SE_TabBarScrollRightButton, &opt, q);
+ QRect tearLeftRect = style->subElementRect(QStyle::SE_TabBarTearIndicatorLeft, &opt, q);
+ QRect tearRightRect = style->subElementRect(QStyle::SE_TabBarTearIndicatorRight, &opt, q);
if (verticalTabs(shape)) {
int topEdge, bottomEdge;
@@ -739,7 +748,7 @@ void QTabBarPrivate::layoutTab(int index)
if (tab->leftWidget) {
QRect rect = q->style()->subElementRect(QStyle::SE_TabBarTabLeftButton, &opt, q);
QPoint p = rect.topLeft();
- if ((index == pressedIndex) || paintWithOffsets) {
+ if (index == pressedIndex) {
if (vertical)
p.setY(p.y() + tab->dragOffset);
else
@@ -750,7 +759,7 @@ void QTabBarPrivate::layoutTab(int index)
if (tab->rightWidget) {
QRect rect = q->style()->subElementRect(QStyle::SE_TabBarTabRightButton, &opt, q);
QPoint p = rect.topLeft();
- if ((index == pressedIndex) || paintWithOffsets) {
+ if (index == pressedIndex) {
if (vertical)
p.setY(p.y() + tab->dragOffset);
else
@@ -1004,8 +1013,13 @@ int QTabBar::insertTab(int index, const QIcon& icon, const QString &text)
}
if (isVisible() && tabAt(d->mousePosition) == index) {
- d->hoverIndex = index;
- d->hoverRect = tabRect(index);
+ if (d->normalizedScrollRect(index).contains(d->mousePosition)) {
+ d->hoverIndex = index;
+ d->hoverRect = tabRect(index);
+ } else {
+ d->hoverIndex = -1;
+ d->hoverRect = QRect();
+ }
}
tabInserted(index);
@@ -1096,11 +1110,13 @@ void QTabBar::removeTab(int index)
if (d->hoverRect.isValid()) {
update(d->hoverRect);
d->hoverIndex = tabAt(d->mousePosition);
- if (d->validIndex(d->hoverIndex)) {
+ if (d->validIndex(d->hoverIndex)
+ && d->normalizedScrollRect(d->hoverIndex).contains(d->mousePosition)) {
d->hoverRect = tabRect(d->hoverIndex);
update(d->hoverRect);
} else {
d->hoverRect = QRect();
+ d->hoverIndex = -1;
}
}
tabRemoved(index);
@@ -1692,15 +1708,18 @@ bool QTabBar::event(QEvent *event)
case QEvent::HoverEnter: {
QHoverEvent *he = static_cast<QHoverEvent *>(event);
d->mousePosition = he->position().toPoint();
- if (!d->hoverRect.contains(d->mousePosition)) {
+ const auto sr = d->normalizedScrollRect();
+ const auto oldHoverRect = d->hoverRect & sr;
+ if (!oldHoverRect.contains(d->mousePosition)) {
if (d->hoverRect.isValid())
update(d->hoverRect);
d->hoverIndex = tabAt(d->mousePosition);
- if (d->validIndex(d->hoverIndex)) {
+ if (d->validIndex(d->hoverIndex) && sr.contains(d->mousePosition)) {
d->hoverRect = tabRect(d->hoverIndex);
update(d->hoverRect);
} else {
d->hoverRect = QRect();
+ d->hoverIndex = -1;
}
}
return true;
@@ -1845,10 +1864,14 @@ void QTabBar::paintEvent(QPaintEvent *)
QStyleOption opt;
opt.initFrom(this);
QRegion buttonRegion;
- if (d->leftB->isVisible())
- buttonRegion |= style()->subElementRect(QStyle::SE_TabBarScrollLeftButton, &opt, this);
- if (d->rightB->isVisible())
- buttonRegion |= style()->subElementRect(QStyle::SE_TabBarScrollRightButton, &opt, this);
+ if (d->leftB->isVisible()) {
+ const auto r = style()->subElementRect(QStyle::SE_TabBarScrollLeftButton, &opt, this);
+ buttonRegion |= r;
+ }
+ if (d->rightB->isVisible()) {
+ const auto r = style()->subElementRect(QStyle::SE_TabBarScrollRightButton, &opt, this);
+ buttonRegion |= r;
+ }
if (!buttonRegion.isEmpty())
p.setClipRegion(QRegion(rect()) - buttonRegion);
}
@@ -1857,9 +1880,13 @@ void QTabBar::paintEvent(QPaintEvent *)
const auto tab = d->tabList.at(i);
if (!tab->visible)
continue;
+ for (const auto side : { QTabBar::LeftSide, QTabBar::RightSide }) {
+ if (auto closeButton = qobject_cast<CloseButton *>(tabButton(i, side)))
+ closeButton->setParentClipRect(scrollRect);
+ }
QStyleOptionTab tabOption;
initStyleOption(&tabOption, i);
- if (d->paintWithOffsets && tab->dragOffset != 0) {
+ if (tab->dragOffset != 0) {
if (vertical) {
tabOption.rect.moveTop(tabOption.rect.y() + tab->dragOffset);
} else {
@@ -1901,7 +1928,7 @@ void QTabBar::paintEvent(QPaintEvent *)
const auto tab = d->tabList.at(selected);
initStyleOption(&tabOption, selected);
- if (d->paintWithOffsets && tab->dragOffset != 0) {
+ if (tab->dragOffset != 0) {
// if the drag offset is != 0, a move is in progress (drag or animation)
// => set the tab position to Moving to preserve the rect
tabOption.position = QStyleOptionTab::TabPosition::Moving;
@@ -2934,6 +2961,11 @@ void CloseButton::paintEvent(QPaintEvent *)
opt.state |= QStyle::State_Selected;
}
+ if (m_parentClipRect.isValid()) {
+ auto tl = mapFromParent(m_parentClipRect.topLeft());
+ auto br = mapFromParent(m_parentClipRect.bottomRight());
+ p.setClipRect(QRect(tl, br));
+ }
style()->drawPrimitive(QStyle::PE_IndicatorTabClose, &opt, &p, this);
}
diff --git a/src/widgets/widgets/qtabbar_p.h b/src/widgets/widgets/qtabbar_p.h
index 38fbde76470..5b31926253f 100644
--- a/src/widgets/widgets/qtabbar_p.h
+++ b/src/widgets/widgets/qtabbar_p.h
@@ -56,7 +56,7 @@ public:
QTabBarPrivate()
: layoutDirty(false), drawBase(true), elideModeSetByUser(false), useScrollButtons(false),
useScrollButtonsSetByUser(false), expanding(true), closeButtonOnTabs(false),
- paintWithOffsets(true), movable(false), dragInProgress(false), documentMode(false),
+ movable(false), dragInProgress(false), documentMode(false),
autoHide(false), changeCurrentOnDrag(false)
{}
~QTabBarPrivate()
@@ -95,7 +95,6 @@ public:
bool useScrollButtonsSetByUser : 1;
bool expanding : 1;
bool closeButtonOnTabs : 1;
- bool paintWithOffsets : 1;
bool movable : 1;
bool dragInProgress : 1;
bool documentMode : 1;