1 /* 2 * DQt - D bindings for the Qt Toolkit 3 * 4 * GNU Lesser General Public License Usage 5 * This file may be used under the terms of the GNU Lesser 6 * General Public License version 3 as published by the Free Software 7 * Foundation and appearing in the file LICENSE.LGPL3 included in the 8 * packaging of this file. Please review the following information to 9 * ensure the GNU Lesser General Public License version 3 requirements 10 * will be met: https://www.gnu.org/licenses/lgpl-3.0.html. 11 */ 12 module qt.core.metamacros; 13 extern(C++): 14 15 import qt.config; 16 import qt.core.bytearray; 17 import qt.core.object; 18 import qt.core.objectdefs; 19 import qt.core.point; 20 import qt.core.string; 21 import qt.helpers; 22 import std.traits; 23 import std.meta; 24 25 static if(!defined!"Q_MOC_OUTPUT_REVISION") 26 { 27 /+ #define Q_MOC_OUTPUT_REVISION 68 +/ 28 } 29 static if(false) 30 { 31 /+ # define QT_ANNOTATE_CLASS(type, ...) 32 # define QT_ANNOTATE_CLASS2(type, a1, a2) 33 # define QT_ANNOTATE_FUNCTION(x) 34 # define QT_ANNOTATE_ACCESS_SPECIFIER(x) 35 # define QT_NO_EMIT +/ 36 } 37 /+ # define slots Q_SLOTS 38 # define signals Q_SIGNALS 39 # define Q_SLOTS QT_ANNOTATE_ACCESS_SPECIFIER(qt_slot) 40 # define Q_SIGNALS public QT_ANNOTATE_ACCESS_SPECIFIER(qt_signal) 41 # define Q_PRIVATE_SLOT(d, signature) QT_ANNOTATE_CLASS2(qt_private_slot, d, signature) 42 # define Q_EMIT 43 # define emit +/ 44 static if(!defined!"Q_CLASSINFO") 45 { 46 /+ # define Q_CLASSINFO(name, value) +/ 47 } 48 /+ #define Q_PLUGIN_METADATA(x) QT_ANNOTATE_CLASS(qt_plugin_metadata, x) 49 #define Q_INTERFACES(x) QT_ANNOTATE_CLASS(qt_interfaces, x) 50 #define Q_PROPERTY(...) QT_ANNOTATE_CLASS(qt_property, __VA_ARGS__) 51 #define Q_PRIVATE_PROPERTY(d, text) QT_ANNOTATE_CLASS2(qt_private_property, d, text) +/ 52 static if(!defined!"Q_REVISION") 53 { 54 /+ # define Q_REVISION(...) +/ 55 } 56 /+ #define Q_OVERRIDE(text) QT_ANNOTATE_CLASS(qt_override, text) 57 #define QDOC_PROPERTY(text) QT_ANNOTATE_CLASS(qt_qdoc_property, text) 58 #define Q_ENUMS(x) QT_ANNOTATE_CLASS(qt_enums, x) 59 #define Q_FLAGS(x) QT_ANNOTATE_CLASS(qt_enums, x) 60 #define Q_ENUM_IMPL(ENUM) \ 61 friend constexpr const QMetaObject *qt_getEnumMetaObject(ENUM) noexcept { return &staticMetaObject; } \ 62 friend constexpr const char *qt_getEnumName(ENUM) noexcept { return #ENUM; } 63 #define Q_ENUM(x) Q_ENUMS(x) Q_ENUM_IMPL(x) 64 #define Q_FLAG(x) Q_FLAGS(x) Q_ENUM_IMPL(x) 65 #define Q_ENUM_NS_IMPL(ENUM) \ 66 inline constexpr const QMetaObject *qt_getEnumMetaObject(ENUM) noexcept { return &staticMetaObject; } \ 67 inline constexpr const char *qt_getEnumName(ENUM) noexcept { return #ENUM; } 68 #define Q_ENUM_NS(x) Q_ENUMS(x) Q_ENUM_NS_IMPL(x) 69 #define Q_FLAG_NS(x) Q_FLAGS(x) Q_ENUM_NS_IMPL(x) 70 #define Q_SCRIPTABLE QT_ANNOTATE_FUNCTION(qt_scriptable) 71 #define Q_INVOKABLE QT_ANNOTATE_FUNCTION(qt_invokable) 72 #define Q_SIGNAL QT_ANNOTATE_FUNCTION(qt_signal) 73 #define Q_SLOT QT_ANNOTATE_FUNCTION(qt_slot) 74 #define Q_MOC_INCLUDE(...) QT_ANNOTATE_CLASS(qt_moc_include, __VA_ARGS__) +/ 75 version(QT_NO_TRANSLATION){}else 76 { 77 /+ # define QT_TR_FUNCTIONS \ 78 static inline QString tr(const char *s, const char *c = nullptr, int n = -1) \ 79 { return staticMetaObject.tr(s, c, n); } +/ 80 enum QT_TR_FUNCTIONS = 81 q{pragma(inline, true) static dqtimported!"qt.core.string".QString tr(const(char)* s, const(char)* c = null, int n = -1) 82 { return staticMetaObject.tr(s, c, n); }}; 83 } 84 version(QT_NO_TRANSLATION) 85 { 86 /+ # define QT_TR_FUNCTIONS +/ 87 } 88 static if(false) 89 { 90 /+ #define QT_TR_FUNCTIONS 91 # define Q_DECL_HIDDEN_STATIC_METACALL +/ 92 } 93 /+ # define Q_DECL_HIDDEN_STATIC_METACALL Q_DECL_HIDDEN +/ 94 static if(false) 95 { 96 /+ # define Q_OBJECT_NO_OVERRIDE_WARNING QT_WARNING_DISABLE_CLANG("-Winconsistent-missing-override") +/ 97 } 98 /+ # define Q_OBJECT_NO_OVERRIDE_WARNING QT_WARNING_DISABLE_GCC("-Wsuggest-override") +/ 99 static if(false) 100 { 101 /+ # define Q_OBJECT_NO_OVERRIDE_WARNING +/ 102 } 103 /+ # define Q_OBJECT_NO_ATTRIBUTES_WARNING QT_WARNING_DISABLE_GCC("-Wattributes") +/ 104 static if(false) 105 { 106 /+ # define Q_OBJECT_NO_ATTRIBUTES_WARNING +/ 107 } 108 /+ #define Q_OBJECT \ 109 public: \ 110 QT_WARNING_PUSH \ 111 Q_OBJECT_NO_OVERRIDE_WARNING \ 112 static const QMetaObject staticMetaObject; \ 113 virtual const QMetaObject *metaObject() const; \ 114 virtual void *qt_metacast(const char *); \ 115 virtual int qt_metacall(QMetaObject::Call, int, void **); \ 116 QT_TR_FUNCTIONS \ 117 private: \ 118 Q_OBJECT_NO_ATTRIBUTES_WARNING \ 119 Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \ 120 QT_WARNING_POP \ 121 struct QPrivateSignal {}; \ 122 QT_ANNOTATE_CLASS(qt_qobject, "") +/ 123 enum Q_OBJECT = 124 q{ public: 125 /+ QT_WARNING_PUSH 126 Q_OBJECT_NO_OVERRIDE_WARNING +/ 127 static import qt.core.objectdefs; 128 extern(C++) extern } ~ exportOnWindows ~ q{static __gshared const(qt.core.objectdefs.QMetaObject) staticMetaObject; 129 extern(C++) override /+ virtual +/ const(qt.core.objectdefs.QMetaObject)* metaObject() const; 130 extern(C++) override /+ virtual +/ void* qt_metacast(const(char)* ); 131 extern(C++) override /+ virtual +/ int qt_metacall(qt.core.objectdefs.QMetaObject.Call, int, void** ); 132 } ~ QT_TR_FUNCTIONS ~ q{ 133 private: 134 /+ Q_OBJECT_NO_ATTRIBUTES_WARNING +/ 135 /+ Q_DECL_HIDDEN_STATIC_METACALL +/ static void qt_static_metacall(dqtimported!"qt.core.object".QObject , qt.core.objectdefs.QMetaObject.Call, int, void** ); 136 /+ QT_WARNING_POP +/ 137 extern(C++) struct QPrivateSignal {}}; 138 /+ QT_ANNOTATE_CLASS(qt_qobject, "") +/ 139 140 141 struct CPPMemberFunctionPointer(T) 142 { 143 void *ptr; 144 uint adj; 145 } 146 147 template memberFunctionExternDeclaration(alias F) 148 { 149 version(Windows) 150 mixin((){ 151 string code; 152 version(Windows) 153 static if(IsInQtPackage!(F)) 154 code ~= "export "; 155 code ~= "extern(" ~ functionLinkage!F ~ ")"; 156 code ~= q{pragma(mangle, F.mangleof) ReturnType!F memberFunctionExternDeclaration(__traits(parent, F), Parameters!F);}; 157 return code; 158 }()); 159 else 160 alias memberFunctionExternDeclaration = F; 161 } 162 163 enum NotIsConstructor(alias F) = __traits(identifier, F) != "__ctor"; 164 165 template MetaObjectImpl(T) 166 { 167 import qt.core.refcount; 168 import qt.core.metatype; 169 extern(D): 170 171 alias Overloads(string name) = __traits(getOverloads, T, name); 172 //pragma(msg, staticMap!(Overloads, __traits(derivedMembers, T))); 173 alias allFunctions = Filter!(NotIsConstructor, staticMap!(Overloads, __traits(derivedMembers, T))); 174 alias allSignals = Filter!(IsQSignal, allFunctions); 175 alias allSlots = Filter!(IsQSlot, allFunctions); 176 alias allInvokables = Filter!(IsQInvokable, allFunctions); 177 alias allMethods = std.meta.AliasSeq!(allSignals, allSlots, allInvokables); 178 179 /*pragma(msg, allSignals); 180 pragma(msg, allSlots); 181 pragma(msg, allInvokables);*/ 182 183 template signalIndex(alias F) 184 { 185 enum signalIndex = staticIndexOf!(F, allSignals); 186 } 187 188 enum CODE = (){ 189 import std.conv; 190 191 string concatenatedStrings; 192 string stringLiteralsCode; 193 size_t numStrings; 194 size_t[string] stringCache; 195 196 size_t addString(string s) 197 { 198 if(s in stringCache) 199 return stringCache[s]; 200 stringLiteralsCode ~= text("cast(uint)(stringdata_t.stringdata0.offsetof + ", concatenatedStrings.length, "), ", s.length, ",\n"); 201 concatenatedStrings ~= s; 202 concatenatedStrings ~= "\0"; 203 stringCache[s] = numStrings; 204 return numStrings++; 205 } 206 207 addString(__traits(identifier, T)); 208 209 size_t currentOutputIndex = 0; 210 size_t initialMetatypeOffsets = 0; 211 string metaTypes; 212 213 currentOutputIndex += 14; 214 215 size_t methodsStartIndex = currentOutputIndex; 216 217 string metaDataCode = mixin(interpolateMixin(q{ 218 // content: 219 9, // revision 220 0, // classname 221 0, 0, // classinfo 222 $(text(allMethods.length)), $(text(methodsStartIndex)), // methods 223 0, 0, // properties 224 0, 0, // enums/sets 225 0, 0, // constructors 226 0, // flags 227 $(text(allSignals.length)), // signalCount 228 229 })); 230 231 assert(methodsStartIndex == currentOutputIndex); 232 currentOutputIndex += 6 * allMethods.length; 233 234 string typeToMeta(T2)() 235 { 236 import qt.core.list: QList; 237 import qt.core.vector: QVector; 238 static if(is(T2 == int)) 239 return "QMetaType.Type.Int"; 240 else static if(is(T2 == uint)) 241 return "QMetaType.Type.UInt"; 242 else static if(is(T2 == bool)) 243 return "QMetaType.Type.Bool"; 244 else static if(is(T2 == double)) 245 return "QMetaType.Type.Double"; 246 else static if(is(const(T2) == const(QString))) 247 return "QMetaType.Type.QString"; 248 else static if(is(const(T2) == const(QList!int))) 249 return text("0x80000000 | ", addString("QList<int>")); 250 else static if(is(const(T2) == const(QVector!int))) 251 return text("0x80000000 | ", addString("QVector<int>")); 252 else static if(is(const(T2) == const(QPoint))) 253 return "QMetaType.Type.QPoint"; 254 else static if(is(T2 == int*)) 255 return text("0x80000000 | ", addString("int*")); 256 else static if(is(T2 == class) && __traits(getLinkage, T2) == "C++") 257 return text("0x80000000 | ", addString(__traits(identifier, T2) ~ "*")); 258 else 259 static assert("TODO: Type not yet supported ", T2.stringof); 260 } 261 262 void addMethods(M...)(string typename, uint type) 263 { 264 if(M.length) 265 metaDataCode ~= " // " ~ typename ~ ": name, argc, parameters, tag, flags, initial metatype offsets\n"; 266 static foreach(i; 0..M.length) 267 {{ 268 size_t nameId = addString(__traits(identifier, M[i])); 269 size_t parameterCount = Parameters!(M[i]).length; 270 uint flags; 271 flags |= 2; // Public // TODO 272 if(typename == "signals") 273 flags |= 4; 274 if(typename == "slots") 275 flags |= 8; 276 metaDataCode ~= mixin(interpolateMixin(q{ 277 $(text(nameId)), $(text(parameterCount)), $(text(currentOutputIndex)), 2, $(text(flags)), $(text(initialMetatypeOffsets)), $("// " ~ __traits(identifier, M[i])) 278 })); 279 currentOutputIndex += 1 + 2 * parameterCount; 280 initialMetatypeOffsets += 1 + parameterCount; 281 foreach(j; 0 .. 1 + parameterCount) 282 metaTypes ~= ", null"; 283 }} 284 } 285 addMethods!(allSignals)("signals", 4); 286 addMethods!(allSlots)("slots", 8); 287 addMethods!(allInvokables)("methods", 0); 288 void addMethodParameters(M...)(string typename) 289 { 290 if(M.length) 291 metaDataCode ~= " // " ~ typename ~ ": parameters\n"; 292 static foreach(i; 0..M.length) 293 { 294 metaDataCode ~= " QMetaType.Type.Void, "; // TODO: correct return type 295 foreach(P; Parameters!(M[i])) 296 metaDataCode ~= typeToMeta!(P) ~ ", "; 297 foreach(j, P; Parameters!(M[i])) 298 metaDataCode ~= text(addString(ParameterIdentifierTuple!(M[i])[j]), ", "); 299 metaDataCode ~= "// " ~ __traits(identifier, M[i]) ~ "\n"; 300 } 301 } 302 addMethodParameters!(allSignals)("signals"); 303 addMethodParameters!(allSlots)("slots"); 304 addMethodParameters!(allInvokables)("methods"); 305 306 addString(""); 307 308 string concatenatedStringsCode = "\""; 309 foreach(char c; concatenatedStrings) 310 { 311 if(c == '\0') 312 concatenatedStringsCode ~= "\\0"; 313 else if(c == '\\') 314 concatenatedStringsCode ~= "\\\\"; 315 else if(c == '\n') 316 concatenatedStringsCode ~= "\\n"; 317 else if(c == '\r') 318 concatenatedStringsCode ~= "\\r"; 319 else if(c == '\"') 320 concatenatedStringsCode ~= "\\\""; 321 else if(c == '\'') 322 concatenatedStringsCode ~= "\\\'"; 323 else 324 concatenatedStringsCode ~= c; 325 } 326 concatenatedStringsCode ~= "\""; 327 328 return mixin(interpolateMixin(q{ 329 extern(C++) struct stringdata_t { 330 uint[$(text(numStrings*2))] offsetsAndSize; 331 char[$(text(concatenatedStrings.length))] stringdata0; 332 }; 333 334 extern(C++) static __gshared const stringdata_t stringdata = { 335 [ 336 $(stringLiteralsCode) 337 ], 338 $(concatenatedStringsCode) 339 }; 340 341 extern(C++) static __gshared const uint[$(text(currentOutputIndex + 1))] meta_data = [ 342 $(metaDataCode) 343 0 // eod 344 ]; 345 346 version(Windows) 347 { 348 pragma(mangle, T.staticMetaObject.mangleof) 349 extern(C++) static __gshared const(QMetaObject) staticMetaObject = { { 350 null, 351 &stringdata, 352 meta_data.ptr, 353 &T.qt_static_metacall, 354 null, 355 qt_incomplete_metaTypeArray!(stringdata_t$(metaTypes)).ptr, 356 null 357 } }; 358 shared static this() 359 { 360 // Necessary for Windows, because staticMetaObject from a DLL can't be used directly. 361 (cast(QMetaObject*)&staticMetaObject).d.superdata.direct = &BaseClassesTuple!(T)[0].staticMetaObject; 362 } 363 } 364 else 365 { 366 pragma(mangle, T.staticMetaObject.mangleof) 367 extern(C++) static __gshared const(QMetaObject) staticMetaObject = { { 368 QMetaObject.SuperData.link!(BaseClassesTuple!(T)[0].staticMetaObject)(), 369 &stringdata, 370 meta_data.ptr, 371 &T.qt_static_metacall, 372 null, 373 qt_incomplete_metaTypeArray!(stringdata_t$(metaTypes)).ptr, 374 null 375 } }; 376 } 377 })); 378 }(); 379 mixin(CODE); 380 } 381 382 enum Q_OBJECT_D = q{ 383 public: 384 static import qt.core.objectdefs; 385 extern(C++) extern static __gshared const(qt.core.objectdefs.QMetaObject) staticMetaObject; 386 extern(C++) override const(qt.core.objectdefs.QMetaObject)* metaObject() const 387 { 388 import qt.core.object; 389 return qt.core.object.QObject.d_ptr.metaObject ? qt.core.object.QObject.d_ptr.dynamicMetaObject() : &staticMetaObject; 390 } 391 extern(C++) override void * qt_metacast(const(char)* _clname) 392 { 393 import qt.core.metamacros; 394 import qt.core.objectdefs; 395 if (!_clname) return null; 396 import core.stdc.string; 397 if (!core.stdc..string.strcmp(_clname, qt.core.metamacros.MetaObjectImpl!(typeof(this)).stringdata.stringdata0.ptr)) 398 return static_cast!(void*)(this); 399 return super.qt_metacast(_clname); 400 } 401 extern(C++) override int qt_metacall(qt.core.objectdefs.QMetaObject.Call _c, int _id, void **_a) 402 { 403 import qt.core.metamacros; 404 import qt.core.objectdefs; 405 _id = super.qt_metacall(_c, _id, _a); 406 if (_id < 0) 407 return _id; 408 alias allMethods = qt.core.metamacros.MetaObjectImpl!(typeof(this)).allMethods; 409 if (_c == qt.core.objectdefs.QMetaObject.Call.InvokeMetaMethod) { 410 if (_id < allMethods.length) 411 qt_static_metacall(this, _c, _id, _a); 412 _id -= allMethods.length; 413 } else if (_c == qt.core.objectdefs.QMetaObject.Call.RegisterMethodArgumentMetaType) { 414 if (_id < allMethods.length) 415 *reinterpret_cast!(int*)(_a[0]) = -1; 416 _id -= allMethods.length; 417 } 418 return _id; 419 } 420 extern(C++) static void qt_static_metacall(dqtimported!"qt.core.object".QObject _o, qt.core.objectdefs.QMetaObject.Call _c, int _id, void **_a) 421 { 422 import qt.core.metamacros; 423 import qt.core.objectdefs; 424 if (_c == qt.core.objectdefs.QMetaObject.Call.InvokeMetaMethod) { 425 alias allMethods = qt.core.metamacros.MetaObjectImpl!(typeof(this)).allMethods; 426 import std.conv, std.traits; 427 auto _t = static_cast!(typeof(this))(_o); 428 //Q_UNUSED(_t) 429 switch (_id) { 430 mixin((){ 431 string methodCallCases; 432 static foreach(i; 0..allMethods.length) 433 {{ 434 methodCallCases ~= text("\n case ", i, ": _t.", __traits(identifier, allMethods[i]), "("); 435 static foreach(j, P; Parameters!(allMethods[i])) 436 { 437 methodCallCases ~= text("*cast(Parameters!(allMethods[", i, "])[", j, "]*)(_a[", j + 1, "]), "); 438 } 439 methodCallCases ~= "); break;"; 440 }} 441 return methodCallCases; 442 }()); 443 default: {} 444 } 445 } else if (_c == qt.core.objectdefs.QMetaObject.Call.RegisterMethodArgumentMetaType) { 446 // TODO 447 } else if (_c == qt.core.objectdefs.QMetaObject.Call.IndexOfMethod) { 448 alias allSignals = qt.core.metamacros.MetaObjectImpl!(typeof(this)).allSignals; 449 int *result = reinterpret_cast!(int *)(_a[0]); 450 static foreach(i; 0..allSignals.length) 451 {{ 452 alias _t = qt.core.metamacros.CPPMemberFunctionPointer!(typeof(this)); 453 454 auto fp = &memberFunctionExternDeclaration!(allSignals[i]); 455 qt.core.metamacros.CPPMemberFunctionPointer!(typeof(this)) memberFunction = qt.core.metamacros.CPPMemberFunctionPointer!(typeof(this))(fp); 456 457 if (*reinterpret_cast!(_t *)(_a[1]) == memberFunction) { 458 *result = i; 459 return; 460 } 461 }} 462 } 463 //Q_UNUSED(_a); 464 } 465 } ~ QT_TR_FUNCTIONS ~ q{ 466 private: 467 struct QPrivateSignal {} 468 }; 469 470 enum Q_SIGNAL_IMPL_D = q{ 471 struct Dummy{} 472 import std.traits; 473 static import qt.core.objectdefs; 474 void*[std.traits.Parameters!(__traits(parent, Dummy)).length + 1] _a = mixin((){ 475 string r = "[null"; 476 static foreach(i; 0..std.traits.Parameters!(__traits(parent, Dummy)).length) 477 r ~= " , cast(void*)&" ~ std.traits.ParameterIdentifierTuple!(__traits(parent, Dummy))[i]; 478 r ~= "]"; 479 return r; 480 }()); 481 qt.core.objectdefs.QMetaObject.activate(this, &staticMetaObject, dqtimported!q{qt.core.metamacros}.MetaObjectImpl!(typeof(this)).signalIndex!(__traits(parent, Dummy)), _a.ptr); 482 }; 483 484 /+ #define Q_OBJECT_FAKE Q_OBJECT QT_ANNOTATE_CLASS(qt_fake, "") +/ 485 /+ #define Q_GADGET \ 486 public: \ 487 static const QMetaObject staticMetaObject; \ 488 void qt_check_for_QGADGET_macro(); \ 489 typedef void QtGadgetHelper; \ 490 private: \ 491 QT_WARNING_PUSH \ 492 Q_OBJECT_NO_ATTRIBUTES_WARNING \ 493 Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \ 494 QT_WARNING_POP \ 495 QT_ANNOTATE_CLASS(qt_qgadget, "") \ 496 /*end*/ +/ 497 enum Q_GADGET = 498 q{ public: 499 static import qt.core.objectdefs; 500 extern(C++) extern } ~ exportOnWindows ~ q{static __gshared const(qt.core.objectdefs.QMetaObject) staticMetaObject; 501 /+ void qt_check_for_QGADGET_macro(); +/ 502 alias QtGadgetHelper = void; 503 private: 504 /+ QT_WARNING_PUSH 505 Q_OBJECT_NO_ATTRIBUTES_WARNING +/ 506 /+ Q_DECL_HIDDEN_STATIC_METACALL +/ static void qt_static_metacall(dqtimported!q{qt.core.object}.QObject , qt.core.objectdefs.QMetaObject.Call, int, void** );}; 507 /+ QT_WARNING_POP 508 QT_ANNOTATE_CLASS(qt_qgadget, "") +/ 509 /*end*/ 510 /+ #define Q_NAMESPACE_EXPORT(...) \ 511 extern __VA_ARGS__ const QMetaObject staticMetaObject; \ 512 QT_ANNOTATE_CLASS(qt_qnamespace, "") \ 513 /*end*/ 514 #define Q_NAMESPACE Q_NAMESPACE_EXPORT() \ 515 /*end*/ +/ 516 static if(false) 517 { 518 /+ #define slots slots 519 #define signals signals 520 #define Q_SLOTS Q_SLOTS 521 #define Q_SIGNALS Q_SIGNALS 522 #define Q_CLASSINFO(name, value) Q_CLASSINFO(name, value) 523 #define Q_INTERFACES(x) Q_INTERFACES(x) 524 #define Q_PROPERTY(text) Q_PROPERTY(text) 525 #define Q_PRIVATE_PROPERTY(d, text) Q_PRIVATE_PROPERTY(d, text) 526 #define Q_PRIVATE_QPROPERTY(accessor, type, name, setter, ...) Q_PRIVATE_QPROPERTY(accessor, type, name, setter, __VA_ARGS__) 527 #define Q_PRIVATE_QPROPERTIES_BEGIN 528 #define Q_PRIVATE_QPROPERTY_IMPL(name) 529 #define Q_PRIVATE_QPROPERTIES_END 530 #define Q_REVISION(...) Q_REVISION(__VA_ARGS__) 531 #define Q_OVERRIDE(text) Q_OVERRIDE(text) 532 #define Q_ENUMS(x) Q_ENUMS(x) 533 #define Q_FLAGS(x) Q_FLAGS(x) 534 #define Q_ENUM(x) Q_ENUM(x) 535 #define Q_FLAGS(x) Q_FLAGS(x) 536 #define Q_OBJECT Q_OBJECT 537 #define Q_OBJECT_FAKE Q_OBJECT_FAKE 538 #define Q_GADGET Q_GADGET 539 #define Q_SCRIPTABLE Q_SCRIPTABLE 540 #define Q_INVOKABLE Q_INVOKABLE 541 #define Q_SIGNAL Q_SIGNAL 542 #define Q_SLOT Q_SLOT +/ 543 } 544