Merge remote-tracking branch 'origin/4.14'

Change-Id: I8543d87779c0da6a876caa046f6852737c9ae680
This commit is contained in:
Eike Ziller
2020-11-26 10:53:34 +01:00
29 changed files with 186 additions and 167 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 388 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 277 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 376 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 300 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 46 KiB

View File

@@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2019 The Qt Company Ltd. ** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the Qt Design Studio documentation. ** This file is part of the Qt Design Studio documentation.
@@ -30,20 +30,19 @@
\QDS provides a set of Qt Quick Studio effects that inherit the types in the \QDS provides a set of Qt Quick Studio effects that inherit the types in the
\l {Qt Graphical Effects} module. To apply a visual effect to a component, \l {Qt Graphical Effects} module. To apply a visual effect to a component,
you must place the component inside the effect. First drag-and-drop an drag-and-drop it from \uicontrol Library > \uicontrol Effects to the
effect from \uicontrol Library > \uicontrol Effects to the the component in \uicontrol Navigator.
\uicontrol {Form Editor} or the \uicontrol Navigator, and then drag-and-drop
the component to the effect. For some effects, you need two source
components.
The following table summarizes the available effects and contains links to The following table summarizes the available effects and contains links to
the documentation of the inherited QML type. the documentation of the inherited QML type.
\table \table
\header \header
\li Icon
\li Qt Quick Studio Effect \li Qt Quick Studio Effect
\li Description \li Description
\row \row
\li \inlineimage icons/blend-mode-16px.png
\li \l [QML] {Blend} \li \l [QML] {Blend}
\li Merges two source components by using a blend mode. \li Merges two source components by using a blend mode.
@@ -54,34 +53,44 @@
For a list of possible values and examples of their use, see For a list of possible values and examples of their use, see
\l{Blend::mode}{Blend.mode}. \l{Blend::mode}{Blend.mode}.
\row \row
\li \inlineimage icons/fast-blur-16px.png
\li \l {FastBlur}{Blur} \li \l {FastBlur}{Blur}
\li Applies a fast blur effect to one or more source components. \li Applies a fast blur effect to one or more source components.
\row \row
\li \inlineimage icons/brightness-contrast-16px.png
\li \l {BrightnessContrast}{Brightness Contrast} \li \l {BrightnessContrast}{Brightness Contrast}
\li Adjusts brightness and contrast. \li Adjusts brightness and contrast.
\row \row
\li \inlineimage icons/colourize-16px.png
\li \l {ColorOverlay}{Color Overlay} \li \l {ColorOverlay}{Color Overlay}
\li Alters the colors of the source component by applying an overlay \li Alters the colors of the source component by applying an overlay
color. color.
\row \row
\li \inlineimage icons/colourize-16px.png
\li \l Colorize \li \l Colorize
\li Sets the color in the HSL color space. \li Sets the color in the HSL color space.
\row \row
\li \inlineimage icons/directional-blur-16px.png
\li \l {DirectionalBlur}{Directional Blur} \li \l {DirectionalBlur}{Directional Blur}
\li Applies blur effect to the specified direction. \li Applies blur effect to the specified direction.
\row \row
\li \inlineimage icons/drop-shadow-16px.png
\li \l {DropShadow}{Drop Shadow} \li \l {DropShadow}{Drop Shadow}
\li Generates a soft shadow behind the source component. \li Generates a soft shadow behind the source component.
\row \row
\li \inlineimage icons/glow-16px.png
\li \l [QML] {Glow} \li \l [QML] {Glow}
\li Generates a halo-like glow around the source component. \li Generates a halo-like glow around the source component.
\row \row
\li \inlineimage icons/hue-saturation-16px.png
\li \l {HueSaturation}{Hue Saturation} \li \l {HueSaturation}{Hue Saturation}
\li Alters the source component colors in the HSL color space. \li Alters the source component colors in the HSL color space.
\row \row
\li \inlineimage icons/opacity-mask-16px.png
\li \l {OpacityMask}{Mask} \li \l {OpacityMask}{Mask}
\li Masks the source component with another component. \li Masks the source component with another component.
\row \row
\li \inlineimage icons/mask-blur-16px.png
\li \l {MaskedBlur}{Masked Blur} \li \l {MaskedBlur}{Masked Blur}
\li Applies a blur effect with a varying intesity. \li Applies a blur effect with a varying intesity.
The \l GradientStop type is used to specify the color used at a The \l GradientStop type is used to specify the color used at a
@@ -89,13 +98,16 @@
The default positions for the stops are 0.20, 0.50, 0.80, and 1.00. The default positions for the stops are 0.20, 0.50, 0.80, and 1.00.
The default color is black. The default color is black.
\row \row
\li \inlineimage icons/radial-blur-16px.png
\li \l {RadialBlur}{Radial Blur} \li \l {RadialBlur}{Radial Blur}
\li Applies directional blur in a circular direction around the \li Applies directional blur in a circular direction around the
component's center point. component's center point.
\row \row
\li \inlineimage icons/desaturation-16px.png
\li \l {Desaturate}{Saturation} \li \l {Desaturate}{Saturation}
\li Reduces the saturation of the colors. \li Reduces the saturation of the colors.
\row \row
\li \inlineimage icons/zoom-blur-16px.png
\li \l {ZoomBlur}{Zoom Blur} \li \l {ZoomBlur}{Zoom Blur}
\li Applies directional blur effect towards source component's center \li Applies directional blur effect towards source component's center
point. point.

View File

@@ -41,14 +41,15 @@
scene, specify properties for them, and view them in a tree structure, scene, specify properties for them, and view them in a tree structure,
as well as to create connections and browse projects and files. as well as to create connections and browse projects and files.
\image studio-editing-3d-scenes.png "3D assets in Design mode" \image studio-editing-3d-scenes.png "Views for editing 3D assets in Design mode"
To open the following views, select \uicontrol View > \uicontrol Views: To open the following views, select \uicontrol View > \uicontrol Views:
\list \list
\li \uicontrol {3D Editor} (1) is the working area where you create the \li \uicontrol {3D Editor} (1) is the working area where you create the
scene, position the model, light and camera, as well as move and scene, position the model, light and camera, as well as move, rotate
scale items. For more information, see \l {Working in 3D Editor}. and scale items. For more information, see
\l {Working in 3D Editor}.
\li \uicontrol {Form Editor} (2) is where you see the scene projected by \li \uicontrol {Form Editor} (2) is where you see the scene projected by
the camera. the camera.
\li \uicontrol {Library} (3) displays the building blocks that you \li \uicontrol {Library} (3) displays the building blocks that you
@@ -60,14 +61,19 @@
file as a tree structure. For more information, see file as a tree structure. For more information, see
\l {Managing Item Hierarchy}. \l {Managing Item Hierarchy}.
\li \uicontrol {Properties} (5) organizes the properties of the \li \uicontrol {Properties} (5) organizes the properties of the
selected item. You can change the properties also in the selected item. You can change the properties also in \uicontrol
\uicontrol {Text Editor}. For more information, see {Text Editor}. For more information, see
\l {Specifying Item Properties}. \l {Specifying Item Properties}.
\li \uicontrol Connections (6) enables you to create connections \li \uicontrol Connections (6) enables you to create connections
between objects, signals, and object properties. For more between objects, signals, and object properties. For more
information, see \l{Adding Connections}. information, see \l{Adding Connections}.
\li \uicontrol Timeline (7) provides a timeline and keyframe based \li \uicontrol States displays the different states of the item. QML
states typically describe user interface configurations, such as the
UI controls, their properties and behavior and the available
actions. For more information, see \l {Adding States}.
\li \uicontrol Timeline provides a timeline and keyframe based
editor that enables you to animate the properties of components. editor that enables you to animate the properties of components.
For more information, see \l {Creating Animations}.
\endlist \endlist
For more information on other views, see For more information on other views, see

View File

@@ -298,7 +298,7 @@ def qdump__CPlusPlus__Token(d, value):
def qdump__CPlusPlus__Internal__PPToken(d, value): def qdump__CPlusPlus__Internal__PPToken(d, value):
data, size, alloc = d.byteArrayData(value["m_src"]) data, size, alloc = d.qArrayData(value["m_src"])
length = value["f"]["utf16chars"].integer() length = value["f"]["utf16chars"].integer()
offset = value["utf16charOffset"].integer() offset = value["utf16charOffset"].integer()
#DumperBase.warn("size: %s, alloc: %s, offset: %s, length: %s, data: %s" #DumperBase.warn("size: %s, alloc: %s, offset: %s, length: %s, data: %s"

View File

@@ -570,17 +570,17 @@ class DumperBase():
self.check(0 <= size and size <= alloc and alloc <= 1000 * 1000 * 1000) self.check(0 <= size and size <= alloc and alloc <= 1000 * 1000 * 1000)
return data, size, alloc return data, size, alloc
def byteArrayDataHelper(self, bytearray_data_ptr): def qArrayDataHelper(self, array_data_ptr):
# bytearray_data_ptr is what is e.g. stored in a QByteArray's d_ptr. # array_data_ptr is what is e.g. stored in a QByteArray's d_ptr.
if self.qtVersion() >= 0x050000: if self.qtVersion() >= 0x050000:
# QTypedArray: # QTypedArray:
# - QtPrivate::RefCount ref # - QtPrivate::RefCount ref
# - int size # - int size
# - uint alloc : 31, capacityReserved : 1 # - uint alloc : 31, capacityReserved : 1
# - qptrdiff offset # - qptrdiff offset
(ref, size, alloc, offset) = self.split('IIpp', bytearray_data_ptr) (ref, size, alloc, offset) = self.split('IIpp', array_data_ptr)
alloc = alloc & 0x7ffffff alloc = alloc & 0x7ffffff
data = bytearray_data_ptr + offset data = array_data_ptr + offset
if self.ptrSize() == 4: if self.ptrSize() == 4:
data = data & 0xffffffff data = data & 0xffffffff
else: else:
@@ -592,35 +592,37 @@ class DumperBase():
# - [padding] # - [padding]
# - char *data; # - char *data;
if self.ptrSize() == 4: if self.ptrSize() == 4:
(ref, alloc, size, data) = self.split('IIIp', bytearray_data_ptr) (ref, alloc, size, data) = self.split('IIIp', array_data_ptr)
else: else:
(ref, alloc, size, pad, data) = self.split('IIIIp', bytearray_data_ptr) (ref, alloc, size, pad, data) = self.split('IIIIp', array_data_ptr)
else: else:
# Data: # Data:
# - QShared count; # - QShared count;
# - QChar *unicode # - QChar *unicode
# - char *ascii # - char *ascii
# - uint len: 30 # - uint len: 30
(dummy, dummy, dummy, size) = self.split('IIIp', bytearray_data_ptr) (dummy, dummy, dummy, size) = self.split('IIIp', array_data_ptr)
size = self.extractInt(bytearray_data_ptr + 3 * self.ptrSize()) & 0x3ffffff size = self.extractInt(array_data_ptr + 3 * self.ptrSize()) & 0x3ffffff
alloc = size # pretend. alloc = size # pretend.
data = self.extractPointer(bytearray_data_ptr + self.ptrSize()) data = self.extractPointer(array_data_ptr + self.ptrSize())
return data, size, alloc return data, size, alloc
# addr is the begin of a QByteArrayData structure # addr is the begin of a QByteArrayData structure
def encodeStringHelper(self, addr, limit): def encodeStringHelper(self, value, limit):
addr = self.extractPointer(value)
# Should not happen, but we get it with LLDB as result # Should not happen, but we get it with LLDB as result
# of inferior calls # of inferior calls
if addr == 0: if addr == 0:
return 0, '' return 0, ''
data, size, alloc = self.byteArrayDataHelper(addr) data, size, alloc = self.qArrayDataHelper(addr)
if alloc != 0: if alloc != 0:
self.check(0 <= size and size <= alloc and alloc <= 100 * 1000 * 1000) self.check(0 <= size and size <= alloc and alloc <= 100 * 1000 * 1000)
elided, shown = self.computeLimit(size, limit) elided, shown = self.computeLimit(size, limit)
return elided, self.readMemory(data, 2 * shown) return elided, self.readMemory(data, 2 * shown)
def encodeByteArrayHelper(self, addr, limit): def encodeByteArrayHelper(self, value, limit):
data, size, alloc = self.byteArrayDataHelper(addr) addr = self.extractPointer(value)
data, size, alloc = self.qArrayDataHelper(addr)
if alloc != 0: if alloc != 0:
self.check(0 <= size and size <= alloc and alloc <= 100 * 1000 * 1000) self.check(0 <= size and size <= alloc and alloc <= 100 * 1000 * 1000)
elided, shown = self.computeLimit(size, limit) elided, shown = self.computeLimit(size, limit)
@@ -670,15 +672,14 @@ class DumperBase():
return self.hexencode(bytes(self.readRawMemory(addr, size))) return self.hexencode(bytes(self.readRawMemory(addr, size)))
def encodeByteArray(self, value, limit=0): def encodeByteArray(self, value, limit=0):
elided, data = self.encodeByteArrayHelper(self.extractPointer(value), limit) elided, data = self.encodeByteArrayHelper(value, limit)
return data return data
def byteArrayData(self, value): def qArrayData(self, value):
return self.byteArrayDataHelper(self.extractPointer(value)) return self.qArrayDataHelper(self.extractPointer(value))
def putByteArrayValue(self, value): def putByteArrayValue(self, value):
elided, data = self.encodeByteArrayHelper( elided, data = self.encodeByteArrayHelper(value, self.displayStringLimit)
self.extractPointer(value), self.displayStringLimit)
self.putValue(data, 'latin1', elided=elided) self.putValue(data, 'latin1', elided=elided)
def encodeString(self, value, limit=0): def encodeString(self, value, limit=0):
@@ -690,7 +691,7 @@ class DumperBase():
data = self.readMemory(ptr, shown) data = self.readMemory(ptr, shown)
return data return data
else: else:
elided, data = self.encodeStringHelper(self.extractPointer(value), limit) elided, data = self.encodeStringHelper(value, limit)
return data return data
def encodedUtf16ToUtf8(self, s): def encodedUtf16ToUtf8(self, s):
@@ -708,7 +709,7 @@ class DumperBase():
alloc = size alloc = size
return data, size, alloc return data, size, alloc
else: else:
return self.byteArrayDataHelper(self.extractPointer(value)) return self.qArrayData(value)
def extractTemplateArgument(self, typename, position): def extractTemplateArgument(self, typename, position):
level = 0 level = 0
@@ -750,8 +751,7 @@ class DumperBase():
data = self.readMemory(ptr, shown) data = self.readMemory(ptr, shown)
self.putValue(data, 'utf16', elided=elided) self.putValue(data, 'utf16', elided=elided)
else: else:
addr = self.extractPointer(value) elided, data = self.encodeStringHelper(value, self.displayStringLimit)
elided, data = self.encodeStringHelper(addr, self.displayStringLimit)
self.putValue(data, 'utf16', elided=elided) self.putValue(data, 'utf16', elided=elided)
def putPtrItem(self, name, value): def putPtrItem(self, name, value):
@@ -1479,7 +1479,7 @@ class DumperBase():
# - QString objectName # - QString objectName
objectName = self.extractPointer(extra + 5 * ptrSize) objectName = self.extractPointer(extra + 5 * ptrSize)
data, size, alloc = self.byteArrayDataHelper(objectName) data, size, alloc = self.qArrayDataHelper(objectName)
# Object names are short, and GDB can crash on to big chunks. # Object names are short, and GDB can crash on to big chunks.
# Since this here is a convenience feature only, limit it. # Since this here is a convenience feature only, limit it.
@@ -1769,7 +1769,7 @@ class DumperBase():
if revision >= 7: # Qt 5. if revision >= 7: # Qt 5.
byteArrayDataSize = 24 if ptrSize == 8 else 16 byteArrayDataSize = 24 if ptrSize == 8 else 16
literal = stringdata + toInteger(index) * byteArrayDataSize literal = stringdata + toInteger(index) * byteArrayDataSize
ldata, lsize, lalloc = self.byteArrayDataHelper(literal) ldata, lsize, lalloc = self.qArrayDataHelper(literal)
try: try:
s = struct.unpack_from('%ds' % lsize, self.readRawMemory(ldata, lsize))[0] s = struct.unpack_from('%ds' % lsize, self.readRawMemory(ldata, lsize))[0]
return s if sys.version_info[0] == 2 else s.decode('utf8') return s if sys.version_info[0] == 2 else s.decode('utf8')
@@ -3816,40 +3816,8 @@ class DumperBase():
#typish.check() #typish.check()
return typish return typish
if isinstance(typish, str): if isinstance(typish, str):
def knownSize(tn):
if tn[0] == 'Q':
if tn in ('QByteArray', 'QString', 'QList', 'QStringList',
'QStringDataPtr'):
return self.ptrSize()
if tn == 'QStandardItemData':
return 8 + 2 * self.ptrSize()
if tn in ('QImage', 'QObject'):
return 2 * self.ptrSize()
if tn == 'QVariant':
return 8 + self.ptrSize()
if typish in ('QPointF', 'QDateTime', 'QRect'):
return 16
if typish == 'QPoint':
return 8
if typish == 'Qt::ItemDataRole':
return 4
if typish == 'QChar':
return 2
if typish in ('quint32', 'qint32'):
return 4
return None
ns = self.qtNamespace() ns = self.qtNamespace()
typish = typish.replace('@', ns) typish = typish.replace('@', ns)
if typish.startswith(ns):
if size is None:
size = knownSize(typish[len(ns):])
else:
if size is None:
size = knownSize(typish)
if size is not None:
typish = ns + typish
tdata = self.typeData.get(typish, None) tdata = self.typeData.get(typish, None)
if tdata is not None: if tdata is not None:
return self.Type(self, typish) return self.Type(self, typish)

View File

@@ -62,7 +62,7 @@ def qdump__QByteArray(d, value):
else: # fromRawData else: # fromRawData
alloc = size alloc = size
else: else:
data, size, alloc = d.byteArrayData(value) data, size, alloc = d.qArrayData(value)
d.check(alloc == 0 or (0 <= size and size <= alloc and alloc <= 100000000)) d.check(alloc == 0 or (0 <= size and size <= alloc and alloc <= 100000000))
if size > 0: if size > 0:
@@ -72,7 +72,7 @@ def qdump__QByteArray(d, value):
elided, shown = d.computeLimit(size, d.displayStringLimit) elided, shown = d.computeLimit(size, d.displayStringLimit)
p = d.readMemory(data, shown) p = d.readMemory(data, shown)
else: else:
elided, p = d.encodeByteArrayHelper(d.extractPointer(value), d.displayStringLimit) elided, p = d.encodeByteArrayHelper(value, d.displayStringLimit)
displayFormat = d.currentItemFormat() displayFormat = d.currentItemFormat()
if displayFormat == DisplayFormat.Automatic or displayFormat == DisplayFormat.Latin1String: if displayFormat == DisplayFormat.Automatic or displayFormat == DisplayFormat.Latin1String:
@@ -89,22 +89,22 @@ def qdump__QByteArray(d, value):
d.putArrayData(data, size, d.charType()) d.putArrayData(data, size, d.charType())
def qdump__QArrayData(d, value): #def qdump__QArrayData(d, value):
data, size, alloc = d.byteArrayDataHelper(value.address()) # data, size, alloc = d.qArrayDataHelper(value.address())
d.check(alloc == 0 or (0 <= size and size <= alloc and alloc <= 100000000)) # d.check(alloc == 0 or (0 <= size and size <= alloc and alloc <= 100000000))
d.putValue(d.readMemory(data, size), 'latin1') # d.putValue(d.readMemory(data, size), 'latin1')
d.putPlainChildren(value) # d.putPlainChildren(value)
def qdump__QByteArrayData(d, value): #def qdump__QByteArrayData(d, value):
qdump__QArrayData(d, value) # qdump__QArrayData(d, value)
def qdump__QBitArray(d, value): def qdump__QBitArray(d, value):
if d.qtVersion() >= 0x60000: if d.qtVersion() >= 0x60000:
_, data, basize = value.split('ppi') _, data, basize = value.split('ppi')
else: else:
data, basize, _ = d.byteArrayDataHelper(d.extractPointer(value['d'])) data, basize, _ = d.qArrayData(value['d'])
unused = d.extractByte(data) if data else 0 unused = d.extractByte(data) if data else 0
size = basize * 8 - unused size = basize * 8 - unused
d.putItemCount(size) d.putItemCount(size)
@@ -270,23 +270,24 @@ def qdump__QStandardItem(d, value):
def qdump__QDate(d, value): def qdump__QDate(d, value):
jd = value.pointer() jd = value.pointer()
if jd: if not jd:
d.putValue(jd, 'juliandate') d.putValue('(invalid)')
d.putExpandable() return
if d.isExpanded(): d.putValue(jd, 'juliandate')
with Children(d): d.putExpandable()
if d.canCallLocale(): if d.isExpanded():
d.putCallItem('toString', '@QString', value, 'toString', with Children(d):
d.enumExpression('DateFormat', 'TextDate')) if d.canCallLocale():
d.putCallItem('(ISO)', '@QString', value, 'toString', d.putCallItem('toString', '@QString', value, 'toString',
d.enumExpression('DateFormat', 'ISODate')) d.enumExpression('DateFormat', 'TextDate'))
d.putCallItem('(ISO)', '@QString', value, 'toString',
d.enumExpression('DateFormat', 'ISODate'))
if d.qtVersion() < 0x060000:
d.putCallItem('(SystemLocale)', '@QString', value, 'toString', d.putCallItem('(SystemLocale)', '@QString', value, 'toString',
d.enumExpression('DateFormat', 'SystemLocaleDate')) d.enumExpression('DateFormat', 'SystemLocaleDate'))
d.putCallItem('(Locale)', '@QString', value, 'toString', d.putCallItem('(Locale)', '@QString', value, 'toString',
d.enumExpression('DateFormat', 'LocaleDate')) d.enumExpression('DateFormat', 'LocaleDate'))
d.putFields(value) d.putFields(value)
else:
d.putValue('(invalid)')
def qdump__QTime(d, value): def qdump__QTime(d, value):
@@ -301,7 +302,7 @@ def qdump__QTime(d, value):
d.enumExpression('DateFormat', 'TextDate')) d.enumExpression('DateFormat', 'TextDate'))
d.putCallItem('(ISO)', '@QString', value, 'toString', d.putCallItem('(ISO)', '@QString', value, 'toString',
d.enumExpression('DateFormat', 'ISODate')) d.enumExpression('DateFormat', 'ISODate'))
if d.canCallLocale(): if d.canCallLocale() and d.qtVersion() < 0x060000:
d.putCallItem('(SystemLocale)', '@QString', value, 'toString', d.putCallItem('(SystemLocale)', '@QString', value, 'toString',
d.enumExpression('DateFormat', 'SystemLocaleDate')) d.enumExpression('DateFormat', 'SystemLocaleDate'))
d.putCallItem('(Locale)', '@QString', value, 'toString', d.putCallItem('(Locale)', '@QString', value, 'toString',
@@ -380,7 +381,7 @@ def qdump__QDateTime(d, value):
tz = '' tz = ''
else: else:
idBase = tzp + 2 * d.ptrSize() # [QSharedData] + [vptr] idBase = tzp + 2 * d.ptrSize() # [QSharedData] + [vptr]
elided, tz = d.encodeByteArrayHelper(d.extractPointer(idBase), limit=100) elided, tz = d.encodeByteArray(idBase, limit=100)
d.putValue('%s/%s/%s/%s/%s/%s' % (msecs, spec, offset, tz, status, 0), d.putValue('%s/%s/%s/%s/%s/%s' % (msecs, spec, offset, tz, status, 0),
'datetimeinternal') 'datetimeinternal')
else: else:
@@ -419,10 +420,11 @@ def qdump__QDateTime(d, value):
d.enumExpression('DateFormat', 'ISODate')) d.enumExpression('DateFormat', 'ISODate'))
d.putCallItem('toUTC', '@QDateTime', value, 'toTimeSpec', d.putCallItem('toUTC', '@QDateTime', value, 'toTimeSpec',
d.enumExpression('TimeSpec', 'UTC')) d.enumExpression('TimeSpec', 'UTC'))
d.putCallItem('(SystemLocale)', '@QString', value, 'toString', if d.qtVersion() < 0x060000:
d.enumExpression('DateFormat', 'SystemLocaleDate')) d.putCallItem('(SystemLocale)', '@QString', value, 'toString',
d.putCallItem('(Locale)', '@QString', value, 'toString', d.enumExpression('DateFormat', 'SystemLocaleDate'))
d.enumExpression('DateFormat', 'LocaleDate')) d.putCallItem('(Locale)', '@QString', value, 'toString',
d.enumExpression('DateFormat', 'LocaleDate'))
d.putCallItem('toLocalTime', '@QDateTime', value, 'toTimeSpec', d.putCallItem('toLocalTime', '@QDateTime', value, 'toTimeSpec',
d.enumExpression('TimeSpec', 'LocalTime')) d.enumExpression('TimeSpec', 'LocalTime'))
d.putFields(value) d.putFields(value)
@@ -468,10 +470,12 @@ def qdump__QDir(d, value):
# + 2 byte padding # + 2 byte padding
fileSystemEntrySize = 2 * d.ptrSize() + 8 fileSystemEntrySize = 2 * d.ptrSize() + 8
if d.qtVersion() < 0x050200: if d.qtVersion() >= 0x060000:
case = 0 case = 2
elif d.qtVersion() >= 0x050300: elif d.qtVersion() >= 0x050300:
case = 1 case = 1
elif d.qtVersion() < 0x050200:
case = 0
else: else:
# Try to distinguish bool vs QStringList at the first item # Try to distinguish bool vs QStringList at the first item
# after the (padded) refcount. If it looks like a bool assume # after the (padded) refcount. If it looks like a bool assume
@@ -479,17 +483,28 @@ def qdump__QDir(d, value):
firstValue = d.extractInt(privAddress + d.ptrSize()) firstValue = d.extractInt(privAddress + d.ptrSize())
case = 1 if firstValue == 0 or firstValue == 1 else 0 case = 1 if firstValue == 0 or firstValue == 1 else 0
if case == 1: if case == 2:
if bit32:
filesOffset = 4
fileInfosOffset = 16
dirEntryOffset = 40
absoluteDirEntryOffset = 72
else:
filesOffset = 8
fileInfosOffset = 32
dirEntryOffset = 96
absoluteDirEntryOffset = 152
elif case == 1:
if bit32: if bit32:
filesOffset = 4 filesOffset = 4
fileInfosOffset = 8 fileInfosOffset = 8
dirEntryOffset = 0x20 dirEntryOffset = 32
absoluteDirEntryOffset = 0x30 absoluteDirEntryOffset = 48
else: else:
filesOffset = 0x08 filesOffset = 8
fileInfosOffset = 0x10 fileInfosOffset = 16
dirEntryOffset = 0x30 dirEntryOffset = 48
absoluteDirEntryOffset = 0x48 absoluteDirEntryOffset = 72
else: else:
# Assume this is before 9fc0965. # Assume this is before 9fc0965.
qt3support = d.isQt3Support() qt3support = d.isQt3Support()
@@ -1037,7 +1052,7 @@ def qdump__QVariantList(d, value):
def qdumpHelper_QList(d, value, innerType): def qdumpHelper_QList(d, value, innerType):
if d.qtVersion() >= 0x60000: if d.qtVersion() >= 0x60000:
dd, data, size = value.split('ppi') dd, data, size = d.split('ppi', value)
d.putItemCount(size) d.putItemCount(size)
d.putPlotData(data, size, innerType) d.putPlotData(data, size, innerType)
return return
@@ -1662,8 +1677,8 @@ def qdump__QStaticStringData(d, value):
def qdump__QTypedArrayData(d, value): def qdump__QTypedArrayData(d, value):
if value.type[0].name == 'unsigned short': if value.type[0].name == 'unsigned short':
qdump__QStringData(d, value) qdump__QStringData(d, value)
else: # else:
qdump__QArrayData(d, value) # qdump__QArrayData(d, value)
def qdump__QStringData(d, value): def qdump__QStringData(d, value):
@@ -2187,10 +2202,11 @@ def qdump__QXmlAttributes__Attribute(d, value):
def qdump__QXmlAttributes(d, value): def qdump__QXmlAttributes(d, value):
(vptr, atts) = value.split('pP') vptr, atts = value.split('p{QList<QXmlAttributes::Attribute>}')
innerType = d.createType(d.qtNamespace() + 'QXmlAttributes::Attribute', 4 * d.ptrSize()) _, att_size, _ = d.describeStruct('{QString}' * 4)
val = d.createListItem(atts, innerType) innerType = d.createType(d.qtNamespace() + 'QXmlAttributes::Attribute',
qdumpHelper_QList(d, val, innerType) att_size)
qdumpHelper_QList(d, atts, innerType)
def qdump__QXmlStreamStringRef(d, value): def qdump__QXmlStreamStringRef(d, value):
@@ -3052,7 +3068,8 @@ def qdump__QJsonValue(d, value):
return return
if t == 3: if t == 3:
d.putType('QJsonValue (String)') d.putType('QJsonValue (String)')
elided, base = d.encodeStringHelper(data, d.displayStringLimit) string = value.split('{QString}')[0]
elided, base = d.encodeString(string, d.displayStringLimit)
d.putValue(base, 'utf16', elided=elided) d.putValue(base, 'utf16', elided=elided)
return return
if t == 4: if t == 4:
@@ -3158,7 +3175,7 @@ def qdumpHelper_QCbor_string(d, container_ptr, element_index, is_bytes):
element_at_n_addr = elements_data_ptr + element_index * 16 # sizeof(QtCbor::Element) == 15 element_at_n_addr = elements_data_ptr + element_index * 16 # sizeof(QtCbor::Element) == 15
element_value, _, element_flags = d.split('qII', element_at_n_addr) element_value, _, element_flags = d.split('qII', element_at_n_addr)
enc = 'latin1' if is_bytes or (element_flags & 8) else 'utf16' enc = 'latin1' if is_bytes or (element_flags & 8) else 'utf16'
bytedata, _, _ = d.byteArrayDataHelper(data_d_ptr) bytedata, _, _ = d.qArrayDataHelper(data_d_ptr)
bytedata += element_value bytedata += element_value
if d.qtVersion() >= 0x060000: if d.qtVersion() >= 0x060000:
bytedata_len = d.extractInt64(bytedata) bytedata_len = d.extractInt64(bytedata)
@@ -3193,7 +3210,7 @@ def qdumpHelper_QCbor_array(d, container_ptr, is_cbor):
elements_data_ptr, elements_size, _ = d.vectorDataHelper(elements_d_ptr) elements_data_ptr, elements_size, _ = d.vectorDataHelper(elements_d_ptr)
d.putItemCount(elements_size) d.putItemCount(elements_size)
if d.isExpanded(): if d.isExpanded():
bytedata, _, _ = d.byteArrayDataHelper(data_d_ptr) bytedata, _, _ = d.qArrayDataHelper(data_d_ptr)
with Children(d, maxNumChild=1000): with Children(d, maxNumChild=1000):
for i in range(elements_size): for i in range(elements_size):
d.putSubItem(i, qdumpHelper_QCborArray_valueAt(d, container_ptr, elements_data_ptr, i, bytedata, is_cbor)) d.putSubItem(i, qdumpHelper_QCborArray_valueAt(d, container_ptr, elements_data_ptr, i, bytedata, is_cbor))
@@ -3215,7 +3232,7 @@ def qdumpHelper_QCbor_map(d, container_ptr, is_cbor):
elements_size = int(elements_size / 2) elements_size = int(elements_size / 2)
d.putItemCount(elements_size) d.putItemCount(elements_size)
if d.isExpanded(): if d.isExpanded():
bytedata, _, _ = d.byteArrayDataHelper(data_d_ptr) bytedata, _, _ = d.qArrayDataHelper(data_d_ptr)
with Children(d, maxNumChild=1000): with Children(d, maxNumChild=1000):
for i in range(elements_size): for i in range(elements_size):
key = qdumpHelper_QCborArray_valueAt(d, container_ptr, elements_data_ptr, 2 * i, bytedata, is_cbor) key = qdumpHelper_QCborArray_valueAt(d, container_ptr, elements_data_ptr, 2 * i, bytedata, is_cbor)

View File

@@ -105,15 +105,21 @@ Diagnostics DocumentClangToolRunner::diagnosticsAtLine(int lineNumber) const
return diagnostics; return diagnostics;
} }
static void removeClangToolRefactorMarkers(TextEditor::TextEditorWidget *editor)
{
if (!editor)
return;
editor->setRefactorMarkers(
TextEditor::RefactorMarker::filterOutType(editor->refactorMarkers(),
Constants::CLANG_TOOL_FIXIT_AVAILABLE_MARKER_ID));
}
void DocumentClangToolRunner::scheduleRun() void DocumentClangToolRunner::scheduleRun()
{ {
for (DiagnosticMark *mark : m_marks) for (DiagnosticMark *mark : m_marks)
mark->disable(); mark->disable();
for (TextEditor::TextEditorWidget *editor : m_editorsWithMarkers) { for (TextEditor::TextEditorWidget *editor : m_editorsWithMarkers)
editor->setRefactorMarkers( removeClangToolRefactorMarkers(editor);
TextEditor::RefactorMarker::filterOutType(editor->refactorMarkers(),
Constants::CLANG_TOOL_FIXIT_AVAILABLE_MARKER_ID));
}
m_runTimer.start(); m_runTimer.start();
} }
@@ -144,22 +150,17 @@ static FileInfo getFileInfo(const Utils::FilePath &file, ProjectExplorer::Projec
QTC_ASSERT(projectFile.kind != CppTools::ProjectFile::Unsupported, continue); QTC_ASSERT(projectFile.kind != CppTools::ProjectFile::Unsupported, continue);
if (projectFile.path == CppTools::CppModelManager::configurationFileName()) if (projectFile.path == CppTools::CppModelManager::configurationFileName())
continue; continue;
if (file.toString() != projectFile.path) const auto projectFilePath = Utils::FilePath::fromString(projectFile.path);
if (file != projectFilePath)
continue; continue;
if (!projectFile.active) if (!projectFile.active)
continue; continue;
if (projectPart->buildTargetType != ProjectExplorer::BuildTargetType::Unknown) { // found the best candidate, early return
// found the best candidate, early return if (projectPart->buildTargetType != ProjectExplorer::BuildTargetType::Unknown)
return FileInfo(Utils::FilePath::fromString(projectFile.path), return FileInfo(projectFilePath, projectFile.kind, projectPart);
projectFile.kind, // found something but keep looking for better candidates
projectPart); if (candidate.projectPart.isNull())
} candidate = FileInfo(projectFilePath, projectFile.kind, projectPart);
if (candidate.projectPart.isNull()) {
// found at least something but keep looking for better candidates
candidate = FileInfo(Utils::FilePath::fromString(projectFile.path),
projectFile.kind,
projectPart);
}
} }
} }
@@ -325,7 +326,8 @@ void DocumentClangToolRunner::onSuccess()
for (auto editor : TextEditor::BaseTextEditor::textEditorsForDocument(doc)) { for (auto editor : TextEditor::BaseTextEditor::textEditorsForDocument(doc)) {
if (TextEditor::TextEditorWidget *widget = editor->editorWidget()) { if (TextEditor::TextEditorWidget *widget = editor->editorWidget()) {
widget->setRefactorMarkers(markers + widget->refactorMarkers()); widget->setRefactorMarkers(markers + widget->refactorMarkers());
m_editorsWithMarkers << widget; if (!m_editorsWithMarkers.contains(widget))
m_editorsWithMarkers << widget;
} }
} }

View File

@@ -83,7 +83,7 @@ private:
QList<DiagnosticMark *> m_marks; QList<DiagnosticMark *> m_marks;
FileInfo m_fileInfo; FileInfo m_fileInfo;
QMetaObject::Connection m_projectSettingsUpdate; QMetaObject::Connection m_projectSettingsUpdate;
QSet<TextEditor::TextEditorWidget *> m_editorsWithMarkers; QList<QPointer<TextEditor::TextEditorWidget>> m_editorsWithMarkers;
SuppressedDiagnosticsList m_suppressed; SuppressedDiagnosticsList m_suppressed;
Utils::FilePath m_lastProjectDirectory; Utils::FilePath m_lastProjectDirectory;
}; };

View File

@@ -111,7 +111,7 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(Target *target, Utils::Id id)
if (oldDir.isEmpty()) if (oldDir.isEmpty())
return newDir; return newDir;
if (QDir(oldDir).exists("CMakeCache.txt")) { if (QDir(oldDir).exists("CMakeCache.txt") && !QDir(newDir).exists("CMakeCache.txt")) {
if (QMessageBox::information(nullptr, if (QMessageBox::information(nullptr,
tr("Changing Build Directory"), tr("Changing Build Directory"),
tr("Change the build directory and start with a " tr("Change the build directory and start with a "

View File

@@ -796,14 +796,23 @@ void CMakeBuildSystem::wireUpConnections()
setParametersAndRequestParse(BuildDirParameters(cmakeBuildConfiguration()), setParametersAndRequestParse(BuildDirParameters(cmakeBuildConfiguration()),
CMakeBuildSystem::REPARSE_FORCE_CMAKE_RUN); CMakeBuildSystem::REPARSE_FORCE_CMAKE_RUN);
}); });
connect(cmakeBuildConfiguration(), &CMakeBuildConfiguration::buildDirectoryChanged, this, [this]() { connect(cmakeBuildConfiguration(),
// The build directory of our BC has changed: &CMakeBuildConfiguration::buildDirectoryChanged,
// Run with initial arguments! this,
qCDebug(cmakeBuildSystemLog) << "Requesting parse due to build directory change"; [this]() {
setParametersAndRequestParse(BuildDirParameters(cmakeBuildConfiguration()), // The build directory of our BC has changed:
CMakeBuildSystem::REPARSE_FORCE_INITIAL_CONFIGURATION // Does the directory contain a CMakeCache ? Existing build, just parse
| CMakeBuildSystem::REPARSE_FORCE_CMAKE_RUN); // No CMakeCache? Run with initial arguments!
}); qCDebug(cmakeBuildSystemLog) << "Requesting parse due to build directory change";
const BuildDirParameters parameters(cmakeBuildConfiguration());
const bool hasCMakeCache = QFile::exists(
(parameters.buildDirectory / "CMakeCache.txt").toString());
const auto options = ReparseParameters(
hasCMakeCache
? REPARSE_DEFAULT
: (REPARSE_FORCE_INITIAL_CONFIGURATION | REPARSE_FORCE_CMAKE_RUN));
setParametersAndRequestParse(BuildDirParameters(cmakeBuildConfiguration()), options);
});
connect(project(), &Project::projectFileIsDirty, this, [this]() { connect(project(), &Project::projectFileIsDirty, this, [this]() {
if (cmakeBuildConfiguration()->isActive() && !isParsing()) { if (cmakeBuildConfiguration()->isActive() && !isParsing()) {
@@ -811,7 +820,7 @@ void CMakeBuildSystem::wireUpConnections()
if (cmake && cmake->isAutoRun()) { if (cmake && cmake->isAutoRun()) {
qCDebug(cmakeBuildSystemLog) << "Requesting parse due to dirty project file"; qCDebug(cmakeBuildSystemLog) << "Requesting parse due to dirty project file";
setParametersAndRequestParse(BuildDirParameters(cmakeBuildConfiguration()), setParametersAndRequestParse(BuildDirParameters(cmakeBuildConfiguration()),
CMakeBuildSystem::REPARSE_DEFAULT); CMakeBuildSystem::REPARSE_FORCE_CMAKE_RUN);
} }
} }
}); });

View File

@@ -431,7 +431,7 @@ static void drawPrimitiveTweakedForDarkTheme(QStyle::PrimitiveElement element,
break; break;
} }
case QStyle::PE_FrameLineEdit: { case QStyle::PE_FrameLineEdit: {
const bool isComboBox = widget->inherits("QComboBox"); const bool isComboBox = widget && widget->inherits("QComboBox");
const QRectF frameRectF = const QRectF frameRectF =
QRectF(option->rect).adjusted(0.5, 0.5, isComboBox ? -8.5 : -0.5, -0.5); QRectF(option->rect).adjusted(0.5, 0.5, isComboBox ? -8.5 : -0.5, -0.5);
painter->setPen(framePen); painter->setPen(framePen);
@@ -447,7 +447,8 @@ static void drawPrimitiveTweakedForDarkTheme(QStyle::PrimitiveElement element,
// Shrinking the topMargin if Not checkable AND title is empty // Shrinking the topMargin if Not checkable AND title is empty
topMargin = groupBoxTopMargin; topMargin = groupBoxTopMargin;
} else { } else {
topMargin = qMax(widget->style()->pixelMetric(QStyle::PM_ExclusiveIndicatorHeight), const int exclusiveIndicatorHeight = widget ? widget->style()->pixelMetric(QStyle::PM_ExclusiveIndicatorHeight) : 0;
topMargin = qMax(exclusiveIndicatorHeight,
option->fontMetrics.height()) + groupBoxTopMargin; option->fontMetrics.height()) + groupBoxTopMargin;
} }
// Snippet from QFusionStyle::drawPrimitive - END // Snippet from QFusionStyle::drawPrimitive - END
@@ -505,15 +506,16 @@ static void drawPrimitiveTweakedForDarkTheme(QStyle::PrimitiveElement element,
break; break;
} }
case QStyle::PE_IndicatorTabClose: { case QStyle::PE_IndicatorTabClose: {
QWindow *window = widget->window()->windowHandle(); QWindow *window = widget ? widget->window()->windowHandle() : nullptr;
QRect iconRect = QRect(0, 0, 16, 16); QRect iconRect = QRect(0, 0, 16, 16);
iconRect.moveCenter(option->rect.center()); iconRect.moveCenter(option->rect.center());
const QIcon::Mode mode = !isEnabled ? QIcon::Disabled : QIcon::Normal; const QIcon::Mode mode = !isEnabled ? QIcon::Disabled : QIcon::Normal;
const static QIcon closeIcon = Utils::Icons::CLOSE_FOREGROUND.icon(); const static QIcon closeIcon = Utils::Icons::CLOSE_FOREGROUND.icon();
if (option->state & QStyle::State_MouseOver) if (option->state & QStyle::State_MouseOver && widget)
widget->style()->drawPrimitive(QStyle::PE_PanelButtonCommand, option, painter, widget); widget->style()->drawPrimitive(QStyle::PE_PanelButtonCommand, option, painter, widget);
const int devicePixelRatio = widget ? widget->devicePixelRatio() : 1;
const QPixmap iconPx = const QPixmap iconPx =
closeIcon.pixmap(window, iconRect.size() * widget->devicePixelRatio(), mode); closeIcon.pixmap(window, iconRect.size() * devicePixelRatio, mode);
painter->drawPixmap(iconRect, iconPx); painter->drawPixmap(iconRect, iconPx);
break; break;
} }

View File

@@ -96,12 +96,8 @@ void ItemLibraryView::modelAttached(Model *model)
auto target = QmlDesignerPlugin::instance()->currentDesignDocument()->currentTarget(); auto target = QmlDesignerPlugin::instance()->currentDesignDocument()->currentTarget();
m_imageCacheData->cache.clean(); m_imageCacheData->cache.clean();
if (target) { if (target)
auto clonedTarget = std::make_unique<ProjectExplorer::Target>( m_imageCacheData->collector.setTarget(target);
target->project(), target->kit()->clone(), ProjectExplorer::Target::_constructor_tag{});
m_imageCacheData->collector.setTarget(std::move(clonedTarget));
}
m_widget->clearSearchFilter(); m_widget->clearSearchFilter();
m_widget->setModel(model); m_widget->setModel(model);

View File

@@ -99,7 +99,7 @@ void ImageCacheCollector::start(Utils::SmallStringView name,
m_connectionManager.setCallback(std::move(captureCallback)); m_connectionManager.setCallback(std::move(captureCallback));
nodeInstanceView.setTarget(m_target.get()); nodeInstanceView.setTarget(m_target.data());
nodeInstanceView.setCrashCallback(abortCallback); nodeInstanceView.setCrashCallback(abortCallback);
model->setNodeInstanceView(&nodeInstanceView); model->setNodeInstanceView(&nodeInstanceView);
@@ -115,9 +115,9 @@ void ImageCacheCollector::start(Utils::SmallStringView name,
abortCallback(); abortCallback();
} }
void ImageCacheCollector::setTarget(std::unique_ptr<ProjectExplorer::Target> target) void ImageCacheCollector::setTarget(ProjectExplorer::Target *target)
{ {
m_target = std::move(target); m_target = target;
} }
} // namespace QmlDesigner } // namespace QmlDesigner

View File

@@ -27,7 +27,7 @@
#include "imagecachecollectorinterface.h" #include "imagecachecollectorinterface.h"
#include <memory> #include <QPointer>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QTextDocument; class QTextDocument;
@@ -57,11 +57,11 @@ public:
CaptureCallback captureCallback, CaptureCallback captureCallback,
AbortCallback abortCallback) override; AbortCallback abortCallback) override;
void setTarget(std::unique_ptr<ProjectExplorer::Target> target); void setTarget(ProjectExplorer::Target *target);
private: private:
ImageCacheConnectionManager &m_connectionManager; ImageCacheConnectionManager &m_connectionManager;
std::unique_ptr<ProjectExplorer::Target> m_target; QPointer<ProjectExplorer::Target> m_target;
}; };
} // namespace QmlDesigner } // namespace QmlDesigner

View File

@@ -169,7 +169,7 @@ isEmpty(LLVM_VERSION) {
LLVM_VERSION = LLVM_VERSION =
} else { } else {
# CLANG-UPGRADE-CHECK: Remove suppression if this warning is resolved. # CLANG-UPGRADE-CHECK: Remove suppression if this warning is resolved.
gcc { gcc:!clang: {
# GCC6 shows full version (6.4.0), while GCC7 and up show only major version (8) # GCC6 shows full version (6.4.0), while GCC7 and up show only major version (8)
GCC_VERSION = $$system("$$QMAKE_CXX -dumpversion") GCC_VERSION = $$system("$$QMAKE_CXX -dumpversion")
GCC_MAJOR_VERSION = $$section(GCC_VERSION, ., 0, 0) GCC_MAJOR_VERSION = $$section(GCC_VERSION, ., 0, 0)

View File

@@ -1050,7 +1050,8 @@ public:
{ {
this->operator+(CoreProfile()); this->operator+(CoreProfile());
profileExtra += profileExtra +=
" QT += xml\n"; "greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat\n"
"else: QT += xml\n";
cmakelistsExtra += cmakelistsExtra +=
"find_package(Qt5 COMPONENTS Core Xml REQUIRED)\n" "find_package(Qt5 COMPONENTS Core Xml REQUIRED)\n"
@@ -2276,14 +2277,18 @@ void tst_Dumpers::dumper_data()
+ Check("d1.(ISO)", "\"1980-01-01\"", "@QString") % NeedsInferiorCall + Check("d1.(ISO)", "\"1980-01-01\"", "@QString") % NeedsInferiorCall
+ Check("d1.toString", "\"Tue Jan 1 1980\"", "@QString") % NeedsInferiorCall + Check("d1.toString", "\"Tue Jan 1 1980\"", "@QString") % NeedsInferiorCall
+ CheckType("d1.(Locale)", "@QString") % NeedsInferiorCall + CheckType("d1.(Locale)", "@QString") % NeedsInferiorCall
% QtVersion(0, 0x5ffff) // Gone in Qt6
+ CheckType("d1.(SystemLocale)", "@QString") % NeedsInferiorCall + CheckType("d1.(SystemLocale)", "@QString") % NeedsInferiorCall
% QtVersion(0, 0x5ffff) // Gone in Qt6
+ Check("t0", "(invalid)", "@QTime") + Check("t0", "(invalid)", "@QTime")
+ Check("t1", "13:15:32", "@QTime") + Check("t1", "13:15:32", "@QTime")
+ Check("t1.(ISO)", "\"13:15:32\"", "@QString") % NeedsInferiorCall + Check("t1.(ISO)", "\"13:15:32\"", "@QString") % NeedsInferiorCall
+ Check("t1.toString", "\"13:15:32\"", "@QString") % NeedsInferiorCall + Check("t1.toString", "\"13:15:32\"", "@QString") % NeedsInferiorCall
+ CheckType("t1.(Locale)", "@QString") % NeedsInferiorCall + CheckType("t1.(Locale)", "@QString") % NeedsInferiorCall
% QtVersion(0, 0x5ffff) // Gone in Qt6
+ CheckType("t1.(SystemLocale)", "@QString") % NeedsInferiorCall + CheckType("t1.(SystemLocale)", "@QString") % NeedsInferiorCall
% QtVersion(0, 0x5ffff) // Gone in Qt6
+ Check("dt0", "(invalid)", "@QDateTime") + Check("dt0", "(invalid)", "@QDateTime")
+ Check("dt1", Value4("Tue Jan 1 13:15:32 1980"), "@QDateTime") + Check("dt1", Value4("Tue Jan 1 13:15:32 1980"), "@QDateTime")
@@ -2291,7 +2296,9 @@ void tst_Dumpers::dumper_data()
+ Check("dt1.(ISO)", + Check("dt1.(ISO)",
"\"1980-01-01T13:15:32Z\"", "@QString") % NeedsInferiorCall "\"1980-01-01T13:15:32Z\"", "@QString") % NeedsInferiorCall
+ CheckType("dt1.(Locale)", "@QString") % NeedsInferiorCall + CheckType("dt1.(Locale)", "@QString") % NeedsInferiorCall
% QtVersion(0, 0x5ffff) // Gone in Qt6
+ CheckType("dt1.(SystemLocale)", "@QString") % NeedsInferiorCall + CheckType("dt1.(SystemLocale)", "@QString") % NeedsInferiorCall
% QtVersion(0, 0x5ffff) // Gone in Qt6
+ Check("dt1.toString", + Check("dt1.toString",
Value4("\"Tue Jan 1 13:15:32 1980\""), "@QString") % NeedsInferiorCall Value4("\"Tue Jan 1 13:15:32 1980\""), "@QString") % NeedsInferiorCall
+ Check("dt1.toString", + Check("dt1.toString",