Skip to content

Commit bfe9fa7

Browse files
jcfrjamesobutler
authored andcommitted
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 2c3eedc commit bfe9fa7

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
@@ -280,9 +280,12 @@ bool PythonQtClassInfo::lookForEnumAndCache(const QMetaObject* meta, const char*
280280
int enumCount = meta->enumeratorCount();
281281
for (int i=0;i<enumCount; i++) {
282282
QMetaEnum e = meta->enumerator(i);
283-
// we do not want flags, they will cause our values to appear two times
284-
if (e.isFlag()) continue;
285-
283+
if (_cachedMembers.contains(memberName)) {
284+
#ifdef PYTHONQT_DEBUG
285+
std::cout << "cached enum " << memberName << " on " << meta->className() << std::endl;
286+
#endif
287+
continue;
288+
}
286289
for (int j=0; j < e.keyCount(); j++) {
287290
if (escapeReservedNames(e.key(j)) == memberName) {
288291
PyObject* enumType = findEnumWrapper(e.name());
@@ -542,9 +545,6 @@ QStringList PythonQtClassInfo::memberList()
542545
for (int i = 0; i<meta->enumeratorCount(); i++) {
543546
QMetaEnum e = meta->enumerator(i);
544547
l << e.name();
545-
// we do not want flags, they will cause our values to appear two times
546-
if (e.isFlag()) continue;
547-
548548
for (int j=0; j < e.keyCount(); j++) {
549549
l << QString(e.key(j));
550550
}

tests/PythonQtTests.cpp

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

309+
PythonQt::self()->registerCPPClass("PQCppObjectQFlagOnly",NULL,NULL, PythonQtCreateObject<PQCppObjectQFlagOnlyDecorator>);
310+
311+
312+
// local enum (decorated)
313+
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"));
314+
315+
// enum with namespace (decorated)
316+
QVERIFY(_helper->runScript("obj.testNoArg()\nfrom PythonQt.private import PQCppObjectQFlagOnly\na = PQCppObjectQFlagOnly()\nif a.testEnumFlag2(PQCppObjectQFlagOnly.TestEnumValue2)==PQCppObjectQFlagOnly.TestEnumValue2: obj.setPassed();\n"));
317+
// with int overload to check overloading
318+
QVERIFY(_helper->runScript("obj.testNoArg()\nfrom PythonQt.private import PQCppObjectQFlagOnly\na = PQCppObjectQFlagOnly()\nif a.testEnumFlag3(PQCppObjectQFlagOnly.TestEnumValue2)==PQCppObjectQFlagOnly.TestEnumValue2: obj.setPassed();\n"));
309319
}
310320

311321
PQCppObject2Decorator::TestEnumFlag PQCppObject2Decorator::testEnumFlag1(PQCppObject2* /*obj*/, PQCppObject2Decorator::TestEnumFlag flag) {
@@ -324,6 +334,26 @@ PQCppObject2Decorator::TestEnumFlag PQCppObject2Decorator::testEnumFlag3(PQCppOb
324334
return flag;
325335
}
326336

337+
// PQCppObjectQFlagOnlyDecorator
338+
339+
PQCppObjectQFlagOnlyDecorator::TestEnumFlag PQCppObjectQFlagOnlyDecorator::testEnumFlag1(PQCppObjectQFlagOnly* obj, PQCppObjectQFlagOnlyDecorator::TestEnumFlag flag) {
340+
return flag;
341+
}
342+
343+
PQCppObjectQFlagOnly::TestEnumFlag PQCppObjectQFlagOnlyDecorator::testEnumFlag2(PQCppObjectQFlagOnly* obj, PQCppObjectQFlagOnly::TestEnumFlag flag) {
344+
return flag;
345+
}
346+
347+
// with int overload
348+
PQCppObjectQFlagOnlyDecorator::TestEnumFlag PQCppObjectQFlagOnlyDecorator::testEnumFlag3(PQCppObjectQFlagOnly* obj, int flag) {
349+
return (TestEnumFlag)-1;
350+
}
351+
PQCppObjectQFlagOnlyDecorator::TestEnumFlag PQCppObjectQFlagOnlyDecorator::testEnumFlag3(PQCppObjectQFlagOnly* obj, PQCppObjectQFlagOnlyDecorator::TestEnumFlag flag) {
352+
return flag;
353+
}
354+
355+
// PythonQtTestSlotCalling
356+
327357
void PythonQtTestSlotCalling::testMultiArgsSlotCall()
328358
{
329359
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
@@ -295,6 +295,36 @@ class PQCppObject2Decorator : public QObject {
295295

296296
};
297297

298+
typedef PQCppObject2 PQCppObjectQFlagOnly;
299+
300+
class PQCppObjectQFlagOnlyDecorator : public QObject {
301+
Q_OBJECT
302+
303+
public:
304+
Q_FLAGS(TestEnumFlag)
305+
306+
enum TestEnumFlag {
307+
TestEnumValue1 = 0,
308+
TestEnumValue2 = 1
309+
};
310+
311+
Q_DECLARE_FLAGS(TestEnum, TestEnumFlag)
312+
313+
public slots:
314+
PQCppObjectQFlagOnly* new_PQCppObjectQFlagOnly() {
315+
return new PQCppObjectQFlagOnly();
316+
}
317+
318+
TestEnumFlag testEnumFlag1(PQCppObjectQFlagOnly* obj, TestEnumFlag flag);
319+
320+
PQCppObjectQFlagOnly::TestEnumFlag testEnumFlag2(PQCppObjectQFlagOnly* obj, PQCppObjectQFlagOnly::TestEnumFlag flag);
321+
322+
// with int overload
323+
TestEnumFlag testEnumFlag3(PQCppObjectQFlagOnly* obj, int flag);
324+
TestEnumFlag testEnumFlag3(PQCppObjectQFlagOnly* obj, TestEnumFlag flag);
325+
326+
};
327+
298328
class PQUnknownValueObject
299329
{
300330
public:

0 commit comments

Comments
 (0)