Skip to content

Commit 3515deb

Browse files
Qt Designer: Write out forms with unqualified enums for older Qt versions
This partially reverts 67c7d6e which was not covering the Line orientation and implements it for all properties. Modify the code introduced by a52c1be to depend on the Qt version. Move the SerializationMode enumeration to the base class MetaEnum and add a mode for compatibility forms. Remove the unused NameOnly flag. Pick-to: 6.7 6.7.3 Task-number: PYSIDE-2492 Task-number: QTBUG-118473 Task-number: QTBUG-127179 Task-number: QTBUG-128365 Change-Id: I4e7efc1545bf35cac5e54c7d385fc1eaf0b484ef Reviewed-by: Jarek Kobus <[email protected]> (cherry picked from commit 1a655fd)
1 parent fbe1010 commit 3515deb

File tree

6 files changed

+52
-61
lines changed

6 files changed

+52
-61
lines changed

src/designer/src/components/formeditor/qdesigner_resource.cpp

Lines changed: 11 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,10 @@ static inline QString messageBoxTitle()
500500

501501
void QDesignerResource::save(QIODevice *dev, QWidget *widget)
502502
{
503+
// Do not write fully qualified enumerations for spacer/line orientations
504+
// and other enum/flag properties for older Qt versions since that breaks
505+
// older uic.
506+
d->m_fullyQualifiedEnums = supportsQualifiedEnums(qtVersion(m_formWindow->core()));
503507
QAbstractFormBuilder::save(dev, widget);
504508
}
505509

@@ -1245,36 +1249,6 @@ DomLayout *QDesignerResource::createDom(QLayout *layout, DomLayout *ui_parentLay
12451249
return l;
12461250
}
12471251

1248-
// Do not write fully qualified enumerations for spacer orientation
1249-
// for older Qt versions since that breaks older uic
1250-
1251-
static void inline fixSpacerPropertyQt5(DomProperty *p)
1252-
{
1253-
if (p->attributeName() == "orientation"_L1) {
1254-
// "Qt::Orientation::Horizontal" -> "Qt::Horizontal"
1255-
QString enumValue = p->elementEnum();
1256-
if (enumValue.startsWith("Qt::Orientation::"_L1)) {
1257-
enumValue.remove(4, 13);
1258-
p->setElementEnum(enumValue);
1259-
}
1260-
} else if (p->attributeName() == "sizeType"_L1) {
1261-
// "QSizePolicy::Policy::Expanding" -> "QSizePolicy::Expanding"
1262-
QString enumValue = p->elementEnum();
1263-
if (enumValue.startsWith("QSizePolicy::Policy::"_L1)) {
1264-
enumValue.remove(13, 8);
1265-
p->setElementEnum(enumValue);
1266-
}
1267-
}
1268-
}
1269-
1270-
static void fixSpacerPropertiesQt5(DomPropertyList *properties)
1271-
{
1272-
for (auto *p : *properties) {
1273-
if (p->kind() == DomProperty::Enum)
1274-
fixSpacerPropertyQt5(p);
1275-
}
1276-
}
1277-
12781252
DomLayoutItem *QDesignerResource::createDom(QLayoutItem *item, DomLayout *ui_layout, DomWidget *ui_parentWidget)
12791253
{
12801254
DomLayoutItem *ui_item = nullptr;
@@ -1288,10 +1262,7 @@ DomLayoutItem *QDesignerResource::createDom(QLayoutItem *item, DomLayout *ui_lay
12881262
if (!objectName.isEmpty())
12891263
spacer->setAttributeName(objectName);
12901264
// ### filter the properties
1291-
auto properties = computeProperties(item->widget());
1292-
if (!supportsQualifiedEnums(qtVersion(core())))
1293-
fixSpacerPropertiesQt5(&properties);
1294-
spacer->setElementProperty(properties);
1265+
spacer->setElementProperty(computeProperties(item->widget()));
12951266

12961267
ui_item = new DomLayoutItem();
12971268
ui_item->setElementSpacer(spacer);
@@ -2029,7 +2000,9 @@ DomProperty *QDesignerResource::createProperty(QObject *object, const QString &p
20292000

20302001
if (value.canConvert<PropertySheetFlagValue>()) {
20312002
const PropertySheetFlagValue f = qvariant_cast<PropertySheetFlagValue>(value);
2032-
const QString flagString = f.metaFlags.toString(f.value, DesignerMetaFlags::FullyQualified);
2003+
const auto mode = d->m_fullyQualifiedEnums
2004+
? DesignerMetaFlags::FullyQualified : DesignerMetaFlags::Qualified;
2005+
const QString flagString = f.metaFlags.toString(f.value, mode);
20332006
if (flagString.isEmpty())
20342007
return nullptr;
20352008

@@ -2043,8 +2016,10 @@ DomProperty *QDesignerResource::createProperty(QObject *object, const QString &p
20432016
}
20442017
if (value.canConvert<PropertySheetEnumValue>()) {
20452018
const PropertySheetEnumValue e = qvariant_cast<PropertySheetEnumValue>(value);
2019+
const auto mode = d->m_fullyQualifiedEnums
2020+
? DesignerMetaEnum::FullyQualified : DesignerMetaEnum::Qualified;
20462021
bool ok;
2047-
const QString id = e.metaEnum.toString(e.value, DesignerMetaEnum::FullyQualified, &ok);
2022+
const QString id = e.metaEnum.toString(e.value, mode, &ok);
20482023
if (!ok)
20492024
designerWarning(e.metaEnum.messageToStringFailed(e.value));
20502025
if (id.isEmpty())

src/designer/src/lib/shared/qdesigner_utils.cpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -146,11 +146,11 @@ namespace qdesigner_internal
146146
if (ok)
147147
*ok = valueOk;
148148

149-
if (!valueOk || sm == NameOnly)
149+
if (!valueOk)
150150
return item;
151151

152152
QString qualifiedItem;
153-
appendQualifiedName(item, qualifiedItem);
153+
appendQualifiedName(item, sm, qualifiedItem);
154154
return qualifiedItem;
155155
}
156156

@@ -205,10 +205,7 @@ namespace qdesigner_internal
205205
for (const auto &id : flagIds) {
206206
if (!rc.isEmpty())
207207
rc += u'|';
208-
if (sm == FullyQualified)
209-
appendQualifiedName(id, rc);
210-
else
211-
rc += id;
208+
appendQualifiedName(id, sm, rc);
212209
}
213210
return rc;
214211
}

src/designer/src/lib/shared/qdesigner_utils_p.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ template <class IntType>
6363
class MetaEnum
6464
{
6565
public:
66+
enum SerializationMode { FullyQualified,
67+
Qualified }; // Qt pre 6.7 without enum name
68+
6669
using KeyToValueMap = std::map<QString, IntType, std::less<>>;
6770

6871
MetaEnum(const QString &enumName, const QString &scope, const QString &separator);
@@ -81,7 +84,7 @@ class MetaEnum
8184
const KeyToValueMap &keyToValueMap() const { return m_keyToValueMap; }
8285

8386
protected:
84-
void appendQualifiedName(const QString &key, QString &target) const;
87+
void appendQualifiedName(const QString &key, SerializationMode sm, QString &target) const;
8588

8689
private:
8790
QString m_enumName;
@@ -135,13 +138,16 @@ IntType MetaEnum<IntType>::keyToValue(QStringView key, bool *ok) const
135138
}
136139

137140
template <class IntType>
138-
void MetaEnum<IntType>::appendQualifiedName(const QString &key, QString &target) const
141+
void MetaEnum<IntType>::appendQualifiedName(const QString &key, SerializationMode sm,
142+
QString &target) const
139143
{
140144
if (!m_scope.isEmpty()) {
141145
target += m_scope;
142146
target += m_separator;
143147
}
144-
target += m_enumName + m_separator + key;
148+
if (sm == FullyQualified)
149+
target += m_enumName + m_separator;
150+
target += key;
145151
}
146152

147153
// -------------- DesignerMetaEnum: Meta type for enumerations
@@ -152,7 +158,6 @@ class QDESIGNER_SHARED_EXPORT DesignerMetaEnum : public MetaEnum<int>
152158
DesignerMetaEnum(const QString &name, const QString &scope, const QString &separator);
153159
DesignerMetaEnum() = default;
154160

155-
enum SerializationMode { FullyQualified, NameOnly };
156161
QString toString(int value, SerializationMode sm, bool *ok = nullptr) const;
157162

158163
QString messageToStringFailed(int value) const;
@@ -173,7 +178,6 @@ class QDESIGNER_SHARED_EXPORT DesignerMetaFlags : public MetaEnum<uint>
173178
const QString &separator);
174179
DesignerMetaFlags() = default;
175180

176-
enum SerializationMode { FullyQualified, NameOnly };
177181
QString toString(int value, SerializationMode sm) const;
178182
QStringList flags(int value) const;
179183

src/designer/src/lib/uilib/abstractformbuilder.cpp

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -690,37 +690,48 @@ static inline QFormLayout::ItemRole formLayoutRole(int column, int colspan)
690690
}
691691
#endif
692692

693-
static inline QString alignmentValue(Qt::Alignment a)
693+
static inline QString alignmentPrefix(bool fullyQualifiedEnums)
694+
{
695+
return fullyQualifiedEnums ? "Qt::AlignmentFlag::"_L1 : "Qt::"_L1;
696+
}
697+
698+
static inline QString alignmentValue(Qt::Alignment a, bool fullyQualifiedEnums)
694699
{
695700
QLatin1StringView h;
696701
QLatin1StringView v;
697702
switch (a & Qt::AlignHorizontal_Mask) {
698703
case Qt::AlignLeft:
699-
h = "Qt::AlignmentFlag::AlignLeft"_L1;
704+
h = "AlignLeft"_L1;
700705
break;
701706
case Qt::AlignRight:
702-
h = "Qt::AlignmentFlag::AlignRight"_L1;
707+
h = "AlignRight"_L1;
703708
break;
704709
case Qt::AlignHCenter:
705-
h = "Qt::AlignmentFlag::AlignHCenter"_L1;
710+
h = "AlignHCenter"_L1;
706711
break;
707712
case Qt::AlignJustify:
708-
h = "Qt::AlignmentFlag::AlignJustify"_L1;
713+
h = "AlignJustify"_L1;
709714
break;
710715
}
711716
switch (a & Qt::AlignVertical_Mask) {
712717
case Qt::AlignTop:
713-
v = "Qt::AlignmentFlag::AlignTop"_L1;
718+
v = "AlignTop"_L1;
714719
break;
715720
case Qt::AlignBottom:
716-
v = "Qt::AlignmentFlag::AlignBottom"_L1;
721+
v = "AlignBottom"_L1;
717722
break;
718723
case Qt::AlignVCenter:
719-
v = "Qt::AlignmentFlag::AlignVCenter"_L1;
724+
v = "AlignVCenter"_L1;
720725
break;
721726
}
722-
723-
return h + (v.isEmpty() || h.isEmpty() ? ""_L1 : "|"_L1) + v;
727+
QString result;
728+
if (h.isEmpty())
729+
result += alignmentPrefix(fullyQualifiedEnums) + h;
730+
if (!h.isEmpty() && !v.isEmpty())
731+
result += u'|';
732+
if (!v.isEmpty())
733+
result += alignmentPrefix(fullyQualifiedEnums) + v;
734+
return result;
724735
}
725736

726737
static inline Qt::Alignment alignmentFromDom(const QString &in)
@@ -1296,7 +1307,8 @@ DomLayout *QAbstractFormBuilder::createDom(QLayout *layout, DomLayout *ui_layout
12961307
if (item.columnSpan > 1)
12971308
ui_item->setAttributeColSpan(item.columnSpan);
12981309
if (item.alignment)
1299-
ui_item->setAttributeAlignment(alignmentValue(item.alignment));
1310+
ui_item->setAttributeAlignment(alignmentValue(item.alignment,
1311+
d->m_fullyQualifiedEnums));
13001312
ui_items.append(ui_item);
13011313
}
13021314
}
@@ -1348,8 +1360,10 @@ DomSpacer *QAbstractFormBuilder::createDom(QSpacerItem *spacer, DomLayout *ui_la
13481360
// orientation property
13491361
prop = new DomProperty(); // ### we don't implemented the case where expandingDirections() is both Vertical and Horizontal
13501362
prop->setAttributeName("orientation"_L1);
1351-
prop->setElementEnum((spacer->expandingDirections() & Qt::Horizontal) != 0 ?
1352-
"Qt:::Orientation::Horizontal"_L1 : "Qt:::Orientation::Vertical"_L1);
1363+
QString value = d->m_fullyQualifiedEnums ? "Qt::Orientation::"_L1 : "Qt::"_L1;
1364+
value += spacer->expandingDirections().testFlag(Qt::Horizontal)
1365+
? "Horizontal"_L1 : "Vertical"_L1;
1366+
prop->setElementEnum(value);
13531367
properties.append(prop);
13541368

13551369
ui_spacer->setElementProperty(properties);
@@ -2421,6 +2435,7 @@ void QAbstractFormBuilder::reset()
24212435
d->m_actionGroups.clear();
24222436
d->m_defaultMargin = INT_MIN;
24232437
d->m_defaultSpacing = INT_MIN;
2438+
d->m_fullyQualifiedEnums = true;
24242439
}
24252440

24262441
/*!

src/designer/src/lib/uilib/formbuilderextra.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ void uiLibWarning(const QString &message) {
3333
qWarning("Designer: %s", qPrintable(message));
3434
}
3535

36-
3736
QFormBuilderExtra::CustomWidgetData::CustomWidgetData() = default;
3837

3938
QFormBuilderExtra::CustomWidgetData::CustomWidgetData(const DomCustomWidget *dcw) :

src/designer/src/lib/uilib/formbuilderextra_p.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ class QDESIGNER_UILIB_EXPORT QFormBuilderExtra
157157
QHash<QObject*, bool> m_laidout;
158158
QHash<QString, QAction*> m_actions;
159159
QHash<QString, QActionGroup*> m_actionGroups;
160+
bool m_fullyQualifiedEnums = true;
160161
int m_defaultMargin;
161162
int m_defaultSpacing;
162163
QDir m_workingDirectory;

0 commit comments

Comments
 (0)