Skip to content

Commit cbe1bf9

Browse files
committed
[commontk] Revert part of r91 preventing QFlags from being wrapped
By checking if an enum member has already been cached it is not required anymore to skip it if is a QFlags. Additionally, the wrapping of QFlags can now be done by using only Q_FLAGS without having a corresponding Q_ENUMS.
1 parent 630e376 commit cbe1bf9

File tree

3 files changed

+66
-6
lines changed

3 files changed

+66
-6
lines changed

src/PythonQtClassInfo.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -283,9 +283,12 @@ bool PythonQtClassInfo::lookForEnumAndCache(const QMetaObject* meta, const char*
283283
int enumCount = meta->enumeratorCount();
284284
for (int i=0;i<enumCount; i++) {
285285
QMetaEnum e = meta->enumerator(i);
286-
// we do not want flags, they will cause our values to appear two times
287-
if (e.isFlag()) continue;
288-
286+
if (_cachedMembers.contains(memberName)) {
287+
#ifdef PYTHONQT_DEBUG
288+
std::cout << "cached enum " << memberName << " on " << meta->className() << std::endl;
289+
#endif
290+
continue;
291+
}
289292
for (int j=0; j < e.keyCount(); j++) {
290293
if (escapeReservedNames(e.key(j)) == memberName) {
291294
PyObject* enumType = findEnumWrapper(e.name());
@@ -545,9 +548,6 @@ QStringList PythonQtClassInfo::memberList()
545548
for (int i = 0; i<meta->enumeratorCount(); i++) {
546549
QMetaEnum e = meta->enumerator(i);
547550
l << e.name();
548-
// we do not want flags, they will cause our values to appear two times
549-
if (e.isFlag()) continue;
550-
551551
for (int j=0; j < e.keyCount(); j++) {
552552
l << QString(e.key(j));
553553
}

tests/PythonQtTests.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,16 @@ void PythonQtTestSlotCalling::testCppFactory()
347347
// with int overload to check overloading
348348
QVERIFY(_helper->runScript("obj.testNoArg()\nfrom PythonQt.private import PQCppObject2\na = PQCppObject2()\nif a.testEnumFlag3(PQCppObject2.TestEnumValue2)==PQCppObject2.TestEnumValue2: obj.setPassed();\n"));
349349

350+
PythonQt::self()->registerCPPClass("PQCppObjectQFlagOnly",NULL,NULL, PythonQtCreateObject<PQCppObjectQFlagOnlyDecorator>);
351+
352+
353+
// local enum (decorated)
354+
QVERIFY(_helper->runScript("obj.testNoArg()\nfrom PythonQt.private import PQCppObjectQFlagOnly\na = PQCppObjectQFlagOnly()\nprint (a.testEnumFlag1)\nif a.testEnumFlag1(PQCppObjectQFlagOnly.TestEnumValue2)==PQCppObjectQFlagOnly.TestEnumValue2: obj.setPassed();\n"));
355+
356+
// enum with namespace (decorated)
357+
QVERIFY(_helper->runScript("obj.testNoArg()\nfrom PythonQt.private import PQCppObjectQFlagOnly\na = PQCppObjectQFlagOnly()\nif a.testEnumFlag2(PQCppObjectQFlagOnly.TestEnumValue2)==PQCppObjectQFlagOnly.TestEnumValue2: obj.setPassed();\n"));
358+
// with int overload to check overloading
359+
QVERIFY(_helper->runScript("obj.testNoArg()\nfrom PythonQt.private import PQCppObjectQFlagOnly\na = PQCppObjectQFlagOnly()\nif a.testEnumFlag3(PQCppObjectQFlagOnly.TestEnumValue2)==PQCppObjectQFlagOnly.TestEnumValue2: obj.setPassed();\n"));
350360
}
351361

352362
PQCppObject2Decorator::TestEnumFlag PQCppObject2Decorator::testEnumFlag1(PQCppObject2* /*obj*/, PQCppObject2Decorator::TestEnumFlag flag) {
@@ -365,6 +375,26 @@ PQCppObject2Decorator::TestEnumFlag PQCppObject2Decorator::testEnumFlag3(PQCppOb
365375
return flag;
366376
}
367377

378+
// PQCppObjectQFlagOnlyDecorator
379+
380+
PQCppObjectQFlagOnlyDecorator::TestEnumFlag PQCppObjectQFlagOnlyDecorator::testEnumFlag1(PQCppObjectQFlagOnly* obj, PQCppObjectQFlagOnlyDecorator::TestEnumFlag flag) {
381+
return flag;
382+
}
383+
384+
PQCppObjectQFlagOnly::TestEnumFlag PQCppObjectQFlagOnlyDecorator::testEnumFlag2(PQCppObjectQFlagOnly* obj, PQCppObjectQFlagOnly::TestEnumFlag flag) {
385+
return flag;
386+
}
387+
388+
// with int overload
389+
PQCppObjectQFlagOnlyDecorator::TestEnumFlag PQCppObjectQFlagOnlyDecorator::testEnumFlag3(PQCppObjectQFlagOnly* obj, int flag) {
390+
return (TestEnumFlag)-1;
391+
}
392+
PQCppObjectQFlagOnlyDecorator::TestEnumFlag PQCppObjectQFlagOnlyDecorator::testEnumFlag3(PQCppObjectQFlagOnly* obj, PQCppObjectQFlagOnlyDecorator::TestEnumFlag flag) {
393+
return flag;
394+
}
395+
396+
// PythonQtTestSlotCalling
397+
368398
void PythonQtTestSlotCalling::testMultiArgsSlotCall()
369399
{
370400
QVERIFY(_helper->runScript("if obj.getMultiArgs(12,47.11,'test')==(12,47.11,'test'): obj.setPassed();\n"));

tests/PythonQtTests.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,36 @@ class PQCppObject2Decorator : public QObject {
307307

308308
};
309309

310+
typedef PQCppObject2 PQCppObjectQFlagOnly;
311+
312+
class PQCppObjectQFlagOnlyDecorator : public QObject {
313+
Q_OBJECT
314+
315+
public:
316+
Q_FLAGS(TestEnumFlag)
317+
318+
enum TestEnumFlag {
319+
TestEnumValue1 = 0,
320+
TestEnumValue2 = 1
321+
};
322+
323+
Q_DECLARE_FLAGS(TestEnum, TestEnumFlag)
324+
325+
public slots:
326+
PQCppObjectQFlagOnly* new_PQCppObjectQFlagOnly() {
327+
return new PQCppObjectQFlagOnly();
328+
}
329+
330+
TestEnumFlag testEnumFlag1(PQCppObjectQFlagOnly* obj, TestEnumFlag flag);
331+
332+
PQCppObjectQFlagOnly::TestEnumFlag testEnumFlag2(PQCppObjectQFlagOnly* obj, PQCppObjectQFlagOnly::TestEnumFlag flag);
333+
334+
// with int overload
335+
TestEnumFlag testEnumFlag3(PQCppObjectQFlagOnly* obj, int flag);
336+
TestEnumFlag testEnumFlag3(PQCppObjectQFlagOnly* obj, TestEnumFlag flag);
337+
338+
};
339+
310340
class PQUnknownValueObject
311341
{
312342
public:

0 commit comments

Comments
 (0)