12#include <QtDesigner/abstractformeditor.h>
13#include <QtDesigner/abstractintegration.h>
14#include <QtDesigner/abstractformwindow.h>
15#include <QtDesigner/abstractformwindowcursor.h>
16#include <QtDesigner/dynamicpropertysheet.h>
17#include <QtDesigner/propertysheet.h>
18#include <QtDesigner/abstractpropertyeditor.h>
19#include <QtDesigner/abstractobjectinspector.h>
20#include <QtDesigner/abstractintegration.h>
21#include <QtDesigner/abstractwidgetdatabase.h>
22#include <QtDesigner/qextensionmanager.h>
24#include <QtWidgets/qwidget.h>
25#include <QtWidgets/qapplication.h>
26#include <QtWidgets/qdialog.h>
27#include <QtWidgets/qpushbutton.h>
28#include <QtWidgets/qlayout.h>
30#include <QtGui/qaction.h>
32#include <QtCore/qdebug.h>
33#include <QtCore/qsize.h>
34#include <QtCore/qtextstream.h>
38using namespace Qt::StringLiterals;
41enum { debugPropertyCommands = 0 };
43const unsigned QFontFamiliesResolved = (QFont::FamilyResolved | QFont::FamiliesResolved);
46QString fontMask(
unsigned m)
49 if (m & QFontFamiliesResolved)
51 if (m & QFont::SizeResolved)
53 if (m & QFont::WeightResolved)
55 if (m & QFont::StyleResolved)
57 if (m & QFont::UnderlineResolved)
58 rc +=
"Underline "_L1;
59 if (m & QFont::StrikeOutResolved)
60 rc +=
"StrikeOut "_L1;
61 if (m & QFont::KerningResolved)
63 if (m & QFont::StyleStrategyResolved)
64 rc +=
"StyleStrategy"_L1;
69QString fontString(
const QFont &f)
73 str <<
"QFont(\"" << f.family() <<
',' << f.pointSize();
77 str <<
',' <<
"italic";
79 str <<
',' <<
"underline";
81 str <<
',' <<
"strikeOut";
83 str <<
',' <<
"kerning";
84 str <<
',' << f.styleStrategy() <<
" resolve: "
85 << fontMask(f.resolveMask()) <<
')';
89QSize checkSize(
const QSize &size)
91 return size.boundedTo(QSize(0xFFFFFF, 0xFFFFFF));
94QSize diffSize(QDesignerFormWindowInterface *fw)
96 const QWidget *container = fw->core()->integration()->containerWindow(fw);
100 const QSize diff = container->size() - fw->size();
104void checkSizes(QDesignerFormWindowInterface *fw,
const QSize &size, QSize *formSize, QSize *containerSize)
106 const QWidget *container = fw->core()->integration()->containerWindow(fw);
110 const QSize diff = diffSize(fw);
112 QSize newFormSize = checkSize(size).expandedTo(fw->mainContainer()->minimumSizeHint());
113 QSize newContainerSize = newFormSize + diff;
115 newContainerSize = newContainerSize.expandedTo(container->minimumSizeHint());
116 newContainerSize = newContainerSize.expandedTo(container->minimumSize());
118 newFormSize = newContainerSize - diff;
120 newContainerSize = checkSize(newContainerSize);
123 *formSize = newFormSize;
125 *containerSize = newContainerSize;
129
130
131
132
133
134
136enum RectSubPropertyMask { SubPropertyX=1, SubPropertyY = 2, SubPropertyWidth = 4, SubPropertyHeight = 8 };
137enum SizePolicySubPropertyMask { SubPropertyHSizePolicy = 1, SubPropertyHStretch = 2, SubPropertyVSizePolicy = 4, SubPropertyVStretch = 8 };
138enum AlignmentSubPropertyMask { SubPropertyHorizontalAlignment = 1, SubPropertyVerticalAlignment = 2 };
139enum StringSubPropertyMask { SubPropertyStringValue = 1, SubPropertyStringComment = 2,
140 SubPropertyStringTranslatable = 4, SubPropertyStringDisambiguation = 8,
141 SubPropertyStringId = 16 };
142enum StringListSubPropertyMask { SubPropertyStringListValue = 1, SubPropertyStringListComment = 2,
143 SubPropertyStringListTranslatable = 4, SubPropertyStringListDisambiguation = 8,
144 SubPropertyStringListId = 16 };
145enum KeySequenceSubPropertyMask { SubPropertyKeySequenceValue = 1, SubPropertyKeySequenceComment = 2,
146 SubPropertyKeySequenceTranslatable = 4, SubPropertyKeySequenceDisambiguation = 8,
147 SubPropertyKeySequenceId = 16 };
149enum CommonSubPropertyMask : quint64 { SubPropertyAll = quint64(-1) };
152#define COMPARE_SUBPROPERTY(object1, object2, getter, mask, maskFlag)
153 if (object1.getter() != object2.getter()) (mask) |= (maskFlag);
156quint64 compareSubProperties(
const QRect & r1,
const QRect & r2)
167quint64 compareSubProperties(
const QSize & r1,
const QSize & r2)
175quint64 compareSubProperties(
const QSizePolicy & sp1,
const QSizePolicy & sp2)
185quint64 compareSubProperties(
const qdesigner_internal::PropertySheetStringValue & str1,
const qdesigner_internal::PropertySheetStringValue & str2)
196quint64 compareSubProperties(
const qdesigner_internal::PropertySheetStringListValue & str1,
const qdesigner_internal::PropertySheetStringListValue & str2)
207quint64 compareSubProperties(
const qdesigner_internal::PropertySheetKeySequenceValue & str1,
const qdesigner_internal::PropertySheetKeySequenceValue & str2)
220template <
class Property>
221void compareFontSubProperty(
const QFont & f1,
223 Property (QFont::*getter) ()
const,
227 const bool f1Changed = f1.resolveMask() & maskBit;
228 const bool f2Changed = f2.resolveMask() & maskBit;
230 if (f1Changed != f2Changed) {
234 if (f1Changed && f2Changed && (f1.*getter)() != (f2.*getter)())
239quint64 compareSubProperties(
const QFont & f1,
const QFont & f2)
242 compareFontSubProperty(f1, f2, &QFont::family, QFontFamiliesResolved, rc);
243 compareFontSubProperty(f1, f2, &QFont::pointSize, QFont::SizeResolved, rc);
244 compareFontSubProperty(f1, f2, &QFont::weight, QFont::WeightResolved, rc);
245 compareFontSubProperty(f1, f2, &QFont::italic, QFont::StyleResolved, rc);
246 compareFontSubProperty(f1, f2, &QFont::underline, QFont::UnderlineResolved, rc);
247 compareFontSubProperty(f1, f2, &QFont::strikeOut, QFont::StrikeOutResolved, rc);
248 compareFontSubProperty(f1, f2, &QFont::kerning, QFont::KerningResolved, rc);
249 compareFontSubProperty(f1, f2, &QFont::styleStrategy, QFont::StyleStrategyResolved, rc);
250 compareFontSubProperty(f1, f2, &QFont::hintingPreference, QFont::HintingPreferenceResolved, rc);
251 if (debugPropertyCommands)
252 qDebug() <<
"compareSubProperties " << fontString(f1) << fontString(f2) <<
"\n\treturns " << fontMask(rc);
257quint64 compareSubProperties(
const QPalette & p1,
const QPalette & p2)
261 const auto p1Changed = p1.resolveMask();
262 const auto p2Changed = p2.resolveMask();
264 for (
int r = 0; r <
static_cast<
int>(QPalette::NColorRoles); ++r) {
265 for (
int g = 0; g <
static_cast<
int>(QPalette::NColorGroups); ++g) {
266 const auto role =
static_cast<QPalette::ColorRole>(r);
267 const auto group =
static_cast<QPalette::ColorGroup>(g);
268 const auto maskBit = qdesigner_internal::paletteResolveMask(group, role);
269 const bool p1RoleChanged = p1Changed & maskBit;
270 const bool p2RoleChanged = p2Changed & maskBit;
271 if (p1RoleChanged != p2RoleChanged
273 || (p1RoleChanged && p2RoleChanged
274 && p1.brush(group, role).color() != p2.brush(group, role).color())) {
285quint64 compareSubProperties(Qt::Alignment a1, Qt::Alignment a2)
288 if ((a1 & Qt::AlignHorizontal_Mask) != (a2 & Qt::AlignHorizontal_Mask))
289 rc |= SubPropertyHorizontalAlignment;
290 if ((a1 & Qt::AlignVertical_Mask) != (a2 & Qt::AlignVertical_Mask))
291 rc |= SubPropertyVerticalAlignment;
295Qt::Alignment variantToAlignment(
const QVariant & q)
297 return Qt::Alignment(qdesigner_internal::Utils::valueOf(q));
304 const int t1 = q1.metaType().id();
305 const int t2 = q2.metaType().id();
307 return SubPropertyAll;
309 case QMetaType::QRect:
310 return compareSubProperties(q1.toRect(), q2.toRect());
311 case QMetaType::QSize:
312 return compareSubProperties(q1.toSize(), q2.toSize());
313 case QMetaType::QSizePolicy:
314 return compareSubProperties(qvariant_cast<QSizePolicy>(q1), qvariant_cast<QSizePolicy>(q2));
315 case QMetaType::QFont:
316 return compareSubProperties(qvariant_cast<QFont>(q1), qvariant_cast<QFont>(q2));
317 case QMetaType::QPalette:
318 return compareSubProperties(qvariant_cast<QPalette>(q1), qvariant_cast<QPalette>(q2));
320 if (q1.userType() == qMetaTypeId<qdesigner_internal::PropertySheetIconValue>())
321 return qvariant_cast<qdesigner_internal::PropertySheetIconValue>(q1).compare(qvariant_cast<qdesigner_internal::PropertySheetIconValue>(q2));
322 else if (q1.userType() == qMetaTypeId<qdesigner_internal::PropertySheetStringValue>())
323 return compareSubProperties(qvariant_cast<qdesigner_internal::PropertySheetStringValue>(q1), qvariant_cast<qdesigner_internal::PropertySheetStringValue>(q2));
324 else if (q1.userType() == qMetaTypeId<qdesigner_internal::PropertySheetStringListValue>())
325 return compareSubProperties(qvariant_cast<qdesigner_internal::PropertySheetStringListValue>(q1), qvariant_cast<qdesigner_internal::PropertySheetStringListValue>(q2));
326 else if (q1.userType() == qMetaTypeId<qdesigner_internal::PropertySheetKeySequenceValue>())
327 return compareSubProperties(qvariant_cast<qdesigner_internal::PropertySheetKeySequenceValue>(q1), qvariant_cast<qdesigner_internal::PropertySheetKeySequenceValue>(q2));
329 switch (specialProperty) {
330 case qdesigner_internal::SP_Alignment:
331 return compareSubProperties(variantToAlignment(q1), variantToAlignment(q2));
337 return SubPropertyAll;
341#define SET_SUBPROPERTY(rc, newValue, getter, setter, mask, maskFlag)
342 if ((mask) & (maskFlag)) rc.setter((newValue).getter());
345QRect applyRectSubProperty(
const QRect &oldValue,
const QRect &newValue,
unsigned mask)
351 SET_SUBPROPERTY(rc, newValue, height, setHeight, mask, SubPropertyHeight)
357QSize applySizeSubProperty(
const QSize &oldValue,
const QSize &newValue,
unsigned mask)
361 SET_SUBPROPERTY(rc, newValue, height, setHeight, mask, SubPropertyHeight)
367QSizePolicy applySizePolicySubProperty(
const QSizePolicy &oldValue,
const QSizePolicy &newValue,
unsigned mask)
369 QSizePolicy rc = oldValue;
370 SET_SUBPROPERTY(rc, newValue, horizontalPolicy, setHorizontalPolicy, mask, SubPropertyHSizePolicy)
371 SET_SUBPROPERTY(rc, newValue, horizontalStretch, setHorizontalStretch, mask, SubPropertyHStretch)
372 SET_SUBPROPERTY(rc, newValue, verticalPolicy, setVerticalPolicy, mask, SubPropertyVSizePolicy)
373 SET_SUBPROPERTY(rc, newValue, verticalStretch, setVerticalStretch, mask, SubPropertyVStretch)
378qdesigner_internal::PropertySheetStringValue applyStringSubProperty(
const qdesigner_internal::PropertySheetStringValue &oldValue,
379 const qdesigner_internal::PropertySheetStringValue &newValue,
unsigned mask)
381 qdesigner_internal::PropertySheetStringValue rc = oldValue;
382 SET_SUBPROPERTY(rc, newValue, value, setValue, mask, SubPropertyStringValue)
383 SET_SUBPROPERTY(rc, newValue, comment, setComment, mask, SubPropertyStringComment)
384 SET_SUBPROPERTY(rc, newValue, translatable, setTranslatable, mask, SubPropertyStringTranslatable)
385 SET_SUBPROPERTY(rc, newValue, disambiguation, setDisambiguation, mask, SubPropertyStringDisambiguation)
391qdesigner_internal::PropertySheetStringListValue applyStringListSubProperty(
const qdesigner_internal::PropertySheetStringListValue &oldValue,
392 const qdesigner_internal::PropertySheetStringListValue &newValue,
unsigned mask)
394 qdesigner_internal::PropertySheetStringListValue rc = oldValue;
395 SET_SUBPROPERTY(rc, newValue, value, setValue, mask, SubPropertyStringListValue)
396 SET_SUBPROPERTY(rc, newValue, comment, setComment, mask, SubPropertyStringListComment)
397 SET_SUBPROPERTY(rc, newValue, translatable, setTranslatable, mask, SubPropertyStringListTranslatable)
398 SET_SUBPROPERTY(rc, newValue, disambiguation, setDisambiguation, mask, SubPropertyStringListDisambiguation)
399 SET_SUBPROPERTY(rc, newValue, id, setId, mask, SubPropertyStringListId)
404qdesigner_internal::PropertySheetKeySequenceValue applyKeySequenceSubProperty(
const qdesigner_internal::PropertySheetKeySequenceValue &oldValue,
405 const qdesigner_internal::PropertySheetKeySequenceValue &newValue,
unsigned mask)
407 qdesigner_internal::PropertySheetKeySequenceValue rc = oldValue;
408 SET_SUBPROPERTY(rc, newValue, value, setValue, mask, SubPropertyKeySequenceValue)
409 SET_SUBPROPERTY(rc, newValue, comment, setComment, mask, SubPropertyKeySequenceComment)
410 SET_SUBPROPERTY(rc, newValue, translatable, setTranslatable, mask, SubPropertyKeySequenceTranslatable)
411 SET_SUBPROPERTY(rc, newValue, disambiguation, setDisambiguation, mask, SubPropertyKeySequenceDisambiguation)
412 SET_SUBPROPERTY(rc, newValue, id, setId, mask, SubPropertyKeySequenceId)
418template <
class PropertyReturnType,
class PropertySetterType>
419inline void setFontSubProperty(
unsigned mask,
420 const QFont &newValue,
422 PropertyReturnType (QFont::*getter) ()
const,
423 void (QFont::*setter) (PropertySetterType),
426 if (mask & maskBit) {
427 (value.*setter)((newValue.*getter)());
429 uint r = value.resolveMask();
430 const bool origFlag = newValue.resolveMask() & maskBit;
435 value.setResolveMask(r);
436 if (debugPropertyCommands)
437 qDebug() <<
"setFontSubProperty " << fontMask(maskBit) <<
" resolve=" << origFlag;
441QFont applyFontSubProperty(
const QFont &oldValue,
const QFont &newValue,
unsigned mask)
444 setFontSubProperty(mask, newValue, QFontFamiliesResolved, &QFont::family, &QFont::setFamily, rc);
445 setFontSubProperty(mask, newValue, QFont::SizeResolved, &QFont::pointSize, &QFont::setPointSize, rc);
446 setFontSubProperty(mask, newValue, QFont::WeightResolved, &QFont::weight, &QFont::setWeight, rc);
447 setFontSubProperty(mask, newValue, QFont::StyleResolved, &QFont::italic, &QFont::setItalic, rc);
448 setFontSubProperty(mask, newValue, QFont::UnderlineResolved, &QFont::underline, &QFont::setUnderline, rc);
449 setFontSubProperty(mask, newValue, QFont::StrikeOutResolved, &QFont::strikeOut, &QFont::setStrikeOut, rc);
450 setFontSubProperty(mask, newValue, QFont::KerningResolved, &QFont::kerning, &QFont::setKerning, rc);
451 setFontSubProperty(mask, newValue, QFont::StyleStrategyResolved, &QFont::styleStrategy, &QFont::setStyleStrategy, rc);
452 setFontSubProperty(mask, newValue, QFont::HintingPreferenceResolved, &QFont::hintingPreference, &QFont::setHintingPreference, rc);
453 if (debugPropertyCommands)
454 qDebug() <<
"applyFontSubProperty old " << fontMask(oldValue.resolveMask()) <<
" new " << fontMask(newValue.resolveMask()) <<
" return: " << fontMask(rc.resolveMask());
459QPalette applyPaletteSubProperty(
const QPalette &oldValue,
const QPalette &newValue,
462 QPalette rc = oldValue;
464 for (
int r = 0; r <
static_cast<
int>(QPalette::NColorRoles); ++r) {
465 for (
int g = 0; g <
static_cast<
int>(QPalette::NColorGroups); ++g) {
466 const auto role =
static_cast<QPalette::ColorRole>(r);
467 const auto group =
static_cast<QPalette::ColorGroup>(g);
468 const auto maskBit = qdesigner_internal::paletteResolveMask(group, role);
469 if (mask & maskBit) {
470 rc.setColor(group, role, newValue.color(group, role));
472 auto resolveMask = rc.resolveMask();
473 const bool origFlag = newValue.resolveMask() & maskBit;
475 resolveMask |= maskBit;
477 resolveMask &= ~maskBit;
478 rc.setResolveMask(resolveMask);
486Qt::Alignment applyAlignmentSubProperty(Qt::Alignment oldValue, Qt::Alignment newValue,
unsigned mask)
489 if (mask == (SubPropertyHorizontalAlignment|SubPropertyVerticalAlignment))
492 const Qt::Alignment changeMask = (mask & SubPropertyHorizontalAlignment) ? Qt::AlignHorizontal_Mask : Qt::AlignVertical_Mask;
493 const Qt::Alignment takeOverMask = (mask & SubPropertyHorizontalAlignment) ? Qt::AlignVertical_Mask : Qt::AlignHorizontal_Mask;
494 return (oldValue & takeOverMask) | (newValue & changeMask);
504 quint64 mask,
bool changed)
506 if (mask == SubPropertyAll)
507 return PropertyHelper::Value(newValue, changed);
509 switch (oldValue.metaType().id()) {
510 case QMetaType::QRect:
511 return PropertyHelper::Value(applyRectSubProperty(oldValue.toRect(), newValue.toRect(), mask), changed);
512 case QMetaType::QSize:
513 return PropertyHelper::Value(applySizeSubProperty(oldValue.toSize(), newValue.toSize(), mask), changed);
514 case QMetaType::QSizePolicy:
515 return PropertyHelper::Value(QVariant::fromValue(applySizePolicySubProperty(qvariant_cast<QSizePolicy>(oldValue), qvariant_cast<QSizePolicy>(newValue), mask)), changed);
516 case QMetaType::QFont: {
533 QFont font = applyFontSubProperty(qvariant_cast<QFont>(oldValue), qvariant_cast<QFont>(newValue), mask);
534 return PropertyHelper::Value(QVariant::fromValue(font), font.resolveMask());
536 case QMetaType::QPalette: {
537 QPalette palette = applyPaletteSubProperty(qvariant_cast<QPalette>(oldValue), qvariant_cast<QPalette>(newValue), mask);
538 return PropertyHelper::Value(QVariant::fromValue(palette), palette.resolveMask());
541 if (oldValue.userType() == qMetaTypeId<qdesigner_internal::PropertySheetIconValue>()) {
543 icon.assign(qvariant_cast<qdesigner_internal::PropertySheetIconValue>(newValue), mask);
544 return PropertyHelper::Value(QVariant::fromValue(icon), icon.mask());
545 }
else if (oldValue.userType() == qMetaTypeId<qdesigner_internal::PropertySheetStringValue>()) {
546 qdesigner_internal::PropertySheetStringValue str = applyStringSubProperty(
547 qvariant_cast<qdesigner_internal::PropertySheetStringValue>(oldValue),
548 qvariant_cast<qdesigner_internal::PropertySheetStringValue>(newValue), mask);
549 return PropertyHelper::Value(QVariant::fromValue(str), changed);
550 }
else if (oldValue.userType() == qMetaTypeId<qdesigner_internal::PropertySheetStringListValue>()) {
551 qdesigner_internal::PropertySheetStringListValue str = applyStringListSubProperty(
552 qvariant_cast<qdesigner_internal::PropertySheetStringListValue>(oldValue),
553 qvariant_cast<qdesigner_internal::PropertySheetStringListValue>(newValue), mask);
554 return PropertyHelper::Value(QVariant::fromValue(str), changed);
555 }
else if (oldValue.userType() == qMetaTypeId<qdesigner_internal::PropertySheetKeySequenceValue>()) {
556 qdesigner_internal::PropertySheetKeySequenceValue key = applyKeySequenceSubProperty(
557 qvariant_cast<qdesigner_internal::PropertySheetKeySequenceValue>(oldValue),
558 qvariant_cast<qdesigner_internal::PropertySheetKeySequenceValue>(newValue), mask);
559 return PropertyHelper::Value(QVariant::fromValue(key), changed);
562 switch (specialProperty) {
564 qdesigner_internal::PropertySheetFlagValue f = qvariant_cast<qdesigner_internal::PropertySheetFlagValue>(oldValue);
565 f.value = applyAlignmentSubProperty(variantToAlignment(oldValue), variantToAlignment(newValue), mask);
568 return PropertyHelper::Value(v, changed);
575 return PropertyHelper::Value(newValue, changed);
581 if (propertyName ==
"objectName"_L1)
583 if (propertyName ==
"layoutName"_L1)
585 if (propertyName ==
"spacerName"_L1)
587 if (propertyName ==
"icon"_L1)
589 if (propertyName ==
"currentTabName"_L1)
591 if (propertyName ==
"currentItemName"_L1)
593 if (propertyName ==
"currentPageName"_L1)
595 if (propertyName ==
"geometry"_L1)
597 if (propertyName ==
"windowTitle"_L1)
599 if (propertyName ==
"minimumSize"_L1)
601 if (propertyName ==
"maximumSize"_L1)
603 if (propertyName ==
"alignment"_L1)
605 if (propertyName ==
"autoDefault"_L1)
607 if (propertyName ==
"shortcut"_L1)
609 if (propertyName ==
"orientation"_L1)
1034 SetValueFunction(QDesignerFormWindowInterface *formWindow,
const PropertyHelper::Value &newValue,
1035 quint64 subPropertyMask);
1039 QDesignerFormWindowInterface *m_formWindow;
1041 const quint64 m_subPropertyMask;
1046 const PropertyHelper::Value &newValue,
1047 quint64 subPropertyMask) :
1048 m_formWindow(formWindow),
1055 return ph.setValue(m_formWindow, m_newValue.first, m_newValue.second, m_subPropertyMask);
1080template <
class PropertyListIterator,
class Function>
1082 const QString &propertyName,
1083 PropertyListIterator begin,
1084 PropertyListIterator end,
1087 unsigned updateMask = 0;
1088 QDesignerPropertyEditorInterface *propertyEditor = core->propertyEditor();
1089 bool updatedPropertyEditor =
false;
1091 for (
auto it = begin; it != end; ++it) {
1092 PropertyHelper *ph = it->get();
1093 if (QObject* object = ph->object()) {
1094 const PropertyHelper::Value newValue = function( *ph );
1095 updateMask |= ph->updateMask();
1097 if (!updatedPropertyEditor && propertyEditor && object == propertyEditor->object()) {
1098 propertyEditor->setPropertyValue(propertyName, newValue.first, newValue.second);
1099 updatedPropertyEditor =
true;
1103 if (!updatedPropertyEditor) updateMask |= PropertyHelper::UpdatePropertyEditor;
1112 qDebug() <<
"PropertyListCommand::setValue(" <<
value
1124 qDebug() <<
"PropertyListCommand::restoreOldValue()";
1134 qDebug() <<
"PropertyListCommand::restoreDefaultValue()";
1516 "Remove dynamic property '%1' from '%2'")
1521 "Remove dynamic property '%1' from %n objects",
"",
count)
RestoreDefaultFunction(QDesignerFormWindowInterface *formWindow)
SetValueFunction(QDesignerFormWindowInterface *formWindow, const PropertyHelper::Value &newValue, quint64 subPropertyMask)
UndoSetValueFunction(QDesignerFormWindowInterface *formWindow)
Auxiliary methods to store/retrieve settings.
PropertyHelper::Value applySubProperty(const QVariant &oldValue, const QVariant &newValue, qdesigner_internal::SpecialProperty specialProperty, quint64 mask, bool changed)
enum SpecialProperty getSpecialProperty(const QString &propertyName)
unsigned changePropertyList(QDesignerFormEditorInterface *core, const QString &propertyName, PropertyListIterator begin, PropertyListIterator end, Function function)
#define SET_SUBPROPERTY(rc, newValue, getter, setter, mask, maskFlag)
#define COMPARE_SUBPROPERTY(object1, object2, getter, mask, maskFlag)