@@ -2060,6 +2060,73 @@ void PythonQtPrivate::registerCPPClass(const char* typeName, const char* parentT
20602060 }
20612061}
20622062
2063+ namespace {
2064+
2065+ void addObjectToPackage (PyObject* obj, const char * name, const char * packageName, PyObject* package)
2066+ {
2067+ if (PyModule_AddObject (package, name, obj) < 0 ) {
2068+ Py_DECREF (obj);
2069+ std::cerr << " failed to add " << name << " to " << packageName << " \n " ;
2070+ }
2071+ }
2072+
2073+ };
2074+
2075+ void PythonQtPrivate::registerGlobalNamespace (const char * typeName, const char * packageName, PythonQtQObjectCreatorFunctionCB* wrapperCreator, const QMetaObject& metaObject, PyObject* module )
2076+ {
2077+ registerCPPClass (typeName, " " , packageName, wrapperCreator, nullptr , module , 0 );
2078+
2079+ PyObject* package = module ? module : PythonQt::priv ()->packageByName (packageName);
2080+ PythonQtClassInfo* classInfo = PythonQt::priv ()->getClassInfo (typeName);
2081+ PyObject* globalNamespace = classInfo->pythonQtClassWrapper ();
2082+
2083+ // Collect the names of global methods
2084+ QSet<QByteArray> methodNames;
2085+ for (int i = metaObject.methodOffset (); i < metaObject.methodCount (); i++) {
2086+ methodNames.insert (metaObject.method (i).name ());
2087+ }
2088+ QByteArray staticPrefix = " static_" + QByteArray (typeName) + " _" ; // every static method starts with this string
2089+ for (auto name: methodNames) {
2090+ if (name.startsWith (staticPrefix)) { // non-static methods wouldn't work (and should not exists)
2091+ name = name.mid (staticPrefix.length ());
2092+ PyObject* obj = PyObject_GetAttrString (globalNamespace, name.constData ());
2093+ if (obj) {
2094+ addObjectToPackage (obj, name, packageName, package);
2095+ }
2096+ else {
2097+ std::cerr << " method not found " << name.constData () << " in " << typeName << std::endl;
2098+ }
2099+ }
2100+ }
2101+
2102+ // Global enums
2103+ for (int i = metaObject.enumeratorOffset (); i < metaObject.enumeratorCount (); i++) {
2104+ QMetaEnum metaEnum = metaObject.enumerator (i);
2105+ PyObject* obj = PyObject_GetAttrString (globalNamespace, metaEnum.name ());
2106+ if (obj) {
2107+ addObjectToPackage (obj, metaEnum.name (), packageName, package);
2108+ }
2109+ else {
2110+ std::cerr << " enum type not found " << metaEnum.name () << " in " << typeName << std::endl;
2111+ }
2112+ #if QT_VERSION > 0x050800
2113+ bool isScoped = metaEnum.isScoped ();
2114+ #else
2115+ bool isScoped = false ;
2116+ #endif
2117+ if (!isScoped) {
2118+ for (int j = 0 ; j < metaEnum.keyCount (); j++) {
2119+ QByteArray key = PythonQtClassInfo::escapeReservedNames (metaEnum.key (j));
2120+ int value = metaEnum.value (j);
2121+ PyObject* obj = PyInt_FromLong (value);
2122+ addObjectToPackage (obj, key, packageName, package);
2123+ }
2124+ }
2125+ }
2126+
2127+ PythonQtClassInfo::addGlobalNamespaceWrapper (classInfo);
2128+ }
2129+
20632130PyObject* PythonQtPrivate::packageByName (const char * name)
20642131{
20652132 if (name==nullptr || name[0 ]==0 ) {
0 commit comments