Skip to content

Commit dbf0900

Browse files
committed
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 90ef60f commit dbf0900

File tree

4 files changed

+71
-6
lines changed

4 files changed

+71
-6
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ This repository contains three branches:
5050
* Based on patched-3 + [r245](http://sourceforge.net/p/pythonqt/code/245/)
5151
* List of features:
5252
* Add BUILD_TESTING option disabled by default to keep behavior consistent with previous version.
53+
* Do not exclude enums from wrapping if they are QFlags.
54+
* Ensure enums added using only Q_FLAGS without corresponding Q_ENUMS are wrapped.
5355

5456
### patched-3
5557
* Backported:

src/PythonQtClassInfo.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -264,9 +264,12 @@ bool PythonQtClassInfo::lookForEnumAndCache(const QMetaObject* meta, const char*
264264
int enumCount = meta->enumeratorCount();
265265
for (int i=0;i<enumCount; i++) {
266266
QMetaEnum e = meta->enumerator(i);
267-
// we do not want flags, they will cause our values to appear two times
268-
if (e.isFlag()) continue;
269-
267+
if (_cachedMembers.contains(memberName)) {
268+
#ifdef PYTHONQT_DEBUG
269+
std::cout << "cached enum " << memberName << " on " << meta->className() << std::endl;
270+
#endif
271+
continue;
272+
}
270273
for (int j=0; j < e.keyCount(); j++) {
271274
if (qstrcmp(e.key(j), memberName)==0) {
272275
PyObject* enumType = findEnumWrapper(e.name());
@@ -527,9 +530,6 @@ QStringList PythonQtClassInfo::memberList()
527530
for (int i = 0; i<meta->enumeratorCount(); i++) {
528531
QMetaEnum e = meta->enumerator(i);
529532
l << e.name();
530-
// we do not want flags, they will cause our values to appear two times
531-
if (e.isFlag()) continue;
532-
533533
for (int j=0; j < e.keyCount(); j++) {
534534
l << QString(e.key(j));
535535
}

tests/PythonQtTests.cpp

+33
Original file line numberDiff line numberDiff line change
@@ -298,8 +298,21 @@ void PythonQtTestSlotCalling::testCppFactory()
298298
// with int overload to check overloading
299299
QVERIFY(_helper->runScript("obj.testNoArg()\nfrom PythonQt.private import PQCppObject2\na = PQCppObject2()\nif a.testEnumFlag3(PQCppObject2.TestEnumValue2)==PQCppObject2.TestEnumValue2: obj.setPassed();\n"));
300300

301+
PythonQt::self()->registerCPPClass("PQCppObjectQFlagOnly",NULL,NULL, PythonQtCreateObject<PQCppObjectQFlagOnlyDecorator>);
302+
303+
304+
// local enum (decorated)
305+
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"));
306+
307+
// enum with namespace (decorated)
308+
QVERIFY(_helper->runScript("obj.testNoArg()\nfrom PythonQt.private import PQCppObjectQFlagOnly\na = PQCppObjectQFlagOnly()\nif a.testEnumFlag2(PQCppObjectQFlagOnly.TestEnumValue2)==PQCppObjectQFlagOnly.TestEnumValue2: obj.setPassed();\n"));
309+
// with int overload to check overloading
310+
QVERIFY(_helper->runScript("obj.testNoArg()\nfrom PythonQt.private import PQCppObjectQFlagOnly\na = PQCppObjectQFlagOnly()\nif a.testEnumFlag3(PQCppObjectQFlagOnly.TestEnumValue2)==PQCppObjectQFlagOnly.TestEnumValue2: obj.setPassed();\n"));
311+
301312
}
302313

314+
// PQCppObject2Decorator
315+
303316
PQCppObject2Decorator::TestEnumFlag PQCppObject2Decorator::testEnumFlag1(PQCppObject2* obj, PQCppObject2Decorator::TestEnumFlag flag) {
304317
return flag;
305318
}
@@ -316,6 +329,26 @@ PQCppObject2Decorator::TestEnumFlag PQCppObject2Decorator::testEnumFlag3(PQCppOb
316329
return flag;
317330
}
318331

332+
// PQCppObjectQFlagOnlyDecorator
333+
334+
PQCppObjectQFlagOnlyDecorator::TestEnumFlag PQCppObjectQFlagOnlyDecorator::testEnumFlag1(PQCppObjectQFlagOnly* obj, PQCppObjectQFlagOnlyDecorator::TestEnumFlag flag) {
335+
return flag;
336+
}
337+
338+
PQCppObjectQFlagOnly::TestEnumFlag PQCppObjectQFlagOnlyDecorator::testEnumFlag2(PQCppObjectQFlagOnly* obj, PQCppObjectQFlagOnly::TestEnumFlag flag) {
339+
return flag;
340+
}
341+
342+
// with int overload
343+
PQCppObjectQFlagOnlyDecorator::TestEnumFlag PQCppObjectQFlagOnlyDecorator::testEnumFlag3(PQCppObjectQFlagOnly* obj, int flag) {
344+
return (TestEnumFlag)-1;
345+
}
346+
PQCppObjectQFlagOnlyDecorator::TestEnumFlag PQCppObjectQFlagOnlyDecorator::testEnumFlag3(PQCppObjectQFlagOnly* obj, PQCppObjectQFlagOnlyDecorator::TestEnumFlag flag) {
347+
return flag;
348+
}
349+
350+
// PythonQtTestSlotCalling
351+
319352
void PythonQtTestSlotCalling::testMultiArgsSlotCall()
320353
{
321354
QVERIFY(_helper->runScript("if obj.getMultiArgs(12,47.11,'test')==(12,47.11,'test'): obj.setPassed();\n"));

tests/PythonQtTests.h

+30
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,36 @@ class PQCppObject2Decorator : public QObject {
293293

294294
};
295295

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

0 commit comments

Comments
 (0)