Skip to content

Commit 67c7d6e

Browse files
FriedemannKleintQt Cherry-pick Bot
authored andcommitted
Qt Designer: Enable writing forms compatible to older versions when integrated
Retrieve the Qt version from a dynamic property "qtVersion" set on QDesignerIntegrationInterface. Fix the spacer enumerations for the older versions when writing out forms. Task-number: PYSIDE-2492 Task-number: QTBUG-118473 Task-number: QTBUG-127179 Pick-to: 6.7 Change-Id: I3a07b1f843fc91f76266a03949408330eb3809cf Reviewed-by: Jarek Kobus <[email protected]> (cherry picked from commit 903c011) Reviewed-by: Qt Cherry-pick Bot <[email protected]>
1 parent d014c5d commit 67c7d6e

File tree

1 file changed

+72
-1
lines changed

1 file changed

+72
-1
lines changed

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

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
#include "qwizard_container.h"
1919
#include "layout_propertysheet.h"
2020

21+
#include <QtDesigner/abstractformeditor.h>
22+
#include <QtDesigner/abstractintegration.h>
2123
#include <QtDesigner/private/ui4_p.h>
2224
#include <QtDesigner/private/formbuilderextra_p.h>
2325
#include <QtDesigner/private/resourcebuilder_p.h>
@@ -73,8 +75,10 @@
7375

7476
#include <QtCore/qbuffer.h>
7577
#include <QtCore/qdir.h>
78+
#include <QtCore/qlibraryinfo.h>
7679
#include <QtCore/qmetaobject.h>
7780
#include <QtCore/qdebug.h>
81+
#include <QtCore/qversionnumber.h>
7882
#include <QtCore/qxmlstream.h>
7983

8084
#include <algorithm>
@@ -99,6 +103,40 @@ static constexpr auto clipboardObjectName = "__qt_fake_top_level"_L1;
99103

100104
namespace qdesigner_internal {
101105

106+
static QVersionNumber qtVersion(const QDesignerFormEditorInterface *core)
107+
{
108+
const QVariant v = core->integration()->property("qtVersion");
109+
return v.isValid() && v.canConvert<QVersionNumber>()
110+
? v.value<QVersionNumber>() : QLibraryInfo::version();
111+
}
112+
113+
static bool supportsQualifiedEnums(const QVersionNumber &qtVersion)
114+
{
115+
if (qtVersion >= QVersionNumber{6, 6, 2})
116+
return true;
117+
118+
switch (qtVersion.majorVersion()) {
119+
case 6: // Qt 6
120+
switch (qtVersion.minorVersion()) {
121+
case 5: // 6.5 LTS
122+
if (qtVersion.microVersion() >= 4)
123+
return true;
124+
break;
125+
case 2: // 6.2 LTS
126+
if (qtVersion.microVersion() >= 13)
127+
return true;
128+
break;
129+
}
130+
break;
131+
132+
case 5: // Qt 5 LTS
133+
if (qtVersion >= QVersionNumber{5, 15, 18})
134+
return true;
135+
break;
136+
}
137+
return false;
138+
}
139+
102140
// -------------------- QDesignerResourceBuilder: A resource builder that works on the property sheet icon types.
103141
class QDesignerResourceBuilder : public QResourceBuilder
104142
{
@@ -1207,6 +1245,36 @@ DomLayout *QDesignerResource::createDom(QLayout *layout, DomLayout *ui_parentLay
12071245
return l;
12081246
}
12091247

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+
12101278
DomLayoutItem *QDesignerResource::createDom(QLayoutItem *item, DomLayout *ui_layout, DomWidget *ui_parentWidget)
12111279
{
12121280
DomLayoutItem *ui_item = nullptr;
@@ -1220,7 +1288,10 @@ DomLayoutItem *QDesignerResource::createDom(QLayoutItem *item, DomLayout *ui_lay
12201288
if (!objectName.isEmpty())
12211289
spacer->setAttributeName(objectName);
12221290
// ### filter the properties
1223-
spacer->setElementProperty(computeProperties(item->widget()));
1291+
auto properties = computeProperties(item->widget());
1292+
if (!supportsQualifiedEnums(qtVersion(core())))
1293+
fixSpacerPropertiesQt5(&properties);
1294+
spacer->setElementProperty(properties);
12241295

12251296
ui_item = new DomLayoutItem();
12261297
ui_item->setElementSpacer(spacer);

0 commit comments

Comments
 (0)