Skip to content

Commit b840d2a

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. Cherry-picked from commontk/PythonQt@86068fd
1 parent 5cd9b58 commit b840d2a

3 files changed

Lines changed: 76 additions & 6 deletions

File tree

src/PythonQtClassInfo.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -289,10 +289,12 @@ bool PythonQtClassInfo::lookForEnumAndCache(const QMetaObject* meta, const char*
289289
int enumCount = meta->enumeratorCount();
290290
for (int i = 0; i < enumCount; i++) {
291291
QMetaEnum e = meta->enumerator(i);
292-
// we do not want flags, they will cause our values to appear two times
293-
if (e.isFlag())
292+
if (_cachedMembers.contains(memberName)) {
293+
#ifdef PYTHONQT_DEBUG
294+
std::cout << "cached enum " << memberName << " on " << meta->className() << std::endl;
295+
#endif
294296
continue;
295-
297+
}
296298
for (int j = 0; j < e.keyCount(); j++) {
297299
if (escapeReservedNames(e.key(j)) == memberName) {
298300
PyObject* enumType = findEnumWrapper(e.name());
@@ -558,9 +560,6 @@ QStringList PythonQtClassInfo::memberList()
558560
for (int i = 0; i < meta->enumeratorCount(); i++) {
559561
QMetaEnum e = meta->enumerator(i);
560562
l << e.name();
561-
// we do not want flags, they will cause our values to appear two times
562-
if (e.isFlag())
563-
continue;
564563

565564
for (int j = 0; j < e.keyCount(); j++) {
566565
l << QString(e.key(j));

tests/PythonQtTests.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,24 @@ void PythonQtTestSlotCalling::testCppFactory()
393393
QVERIFY(_helper->runScript(
394394
"obj.testNoArg()\nfrom PythonQt.private import PQCppObject2\na = PQCppObject2()\nif "
395395
"a.testEnumFlag3(PQCppObject2.TestEnumValue2)==PQCppObject2.TestEnumValue2: obj.setPassed();\n"));
396+
397+
PythonQt::self()->registerCPPClass("PQCppObjectQFlagOnly", NULL, NULL,
398+
PythonQtCreateObject<PQCppObjectQFlagOnlyDecorator>);
399+
400+
// local enum (decorated)
401+
QVERIFY(_helper->runScript(
402+
"obj.testNoArg()\nfrom PythonQt.private import PQCppObjectQFlagOnly\na = PQCppObjectQFlagOnly()\nprint "
403+
"(a.testEnumFlag1)\nif a.testEnumFlag1(PQCppObjectQFlagOnly.TestEnumValue2)==PQCppObjectQFlagOnly.TestEnumValue2: "
404+
"obj.setPassed();\n"));
405+
406+
// enum with namespace (decorated)
407+
QVERIFY(_helper->runScript(
408+
"obj.testNoArg()\nfrom PythonQt.private import PQCppObjectQFlagOnly\na = PQCppObjectQFlagOnly()\nif "
409+
"a.testEnumFlag2(PQCppObjectQFlagOnly.TestEnumValue2)==PQCppObjectQFlagOnly.TestEnumValue2: obj.setPassed();\n"));
410+
// with int overload to check overloading
411+
QVERIFY(_helper->runScript(
412+
"obj.testNoArg()\nfrom PythonQt.private import PQCppObjectQFlagOnly\na = PQCppObjectQFlagOnly()\nif "
413+
"a.testEnumFlag3(PQCppObjectQFlagOnly.TestEnumValue2)==PQCppObjectQFlagOnly.TestEnumValue2: obj.setPassed();\n"));
396414
}
397415

398416
PQCppObject2Decorator::TestEnumFlag PQCppObject2Decorator::testEnumFlag1(PQCppObject2* /*obj*/,
@@ -417,6 +435,34 @@ PQCppObject2Decorator::TestEnumFlag PQCppObject2Decorator::testEnumFlag3(PQCppOb
417435
return flag;
418436
}
419437

438+
// PQCppObjectQFlagOnlyDecorator
439+
440+
PQCppObjectQFlagOnlyDecorator::TestEnumFlag PQCppObjectQFlagOnlyDecorator::testEnumFlag1(PQCppObjectQFlagOnly* obj,
441+
PQCppObjectQFlagOnlyDecorator::TestEnumFlag flag)
442+
{
443+
return flag;
444+
}
445+
446+
PQCppObjectQFlagOnly::TestEnumFlag PQCppObjectQFlagOnlyDecorator::testEnumFlag2(PQCppObjectQFlagOnly* obj,
447+
PQCppObjectQFlagOnly::TestEnumFlag flag)
448+
{
449+
return flag;
450+
}
451+
452+
// with int overload
453+
PQCppObjectQFlagOnlyDecorator::TestEnumFlag PQCppObjectQFlagOnlyDecorator::testEnumFlag3(PQCppObjectQFlagOnly* obj,
454+
int flag)
455+
{
456+
return (TestEnumFlag)-1;
457+
}
458+
PQCppObjectQFlagOnlyDecorator::TestEnumFlag PQCppObjectQFlagOnlyDecorator::testEnumFlag3(PQCppObjectQFlagOnly* obj,
459+
PQCppObjectQFlagOnlyDecorator::TestEnumFlag flag)
460+
{
461+
return flag;
462+
}
463+
464+
// PythonQtTestSlotCalling
465+
420466
void PythonQtTestSlotCalling::testMultiArgsSlotCall()
421467
{
422468
QVERIFY(_helper->runScript("if obj.getMultiArgs(12,47.11,'test')==(12,47.11,'test'): obj.setPassed();\n"));

tests/PythonQtTests.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,31 @@ public Q_SLOTS:
298298
TestEnumFlag testEnumFlag3(PQCppObject2* obj, TestEnumFlag flag);
299299
};
300300

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

0 commit comments

Comments
 (0)