@@ -2110,6 +2110,73 @@ void PythonQtPrivate::registerCPPClass(const char* typeName, const char* parentT
21102110 }
21112111}
21122112
2113+ namespace {
2114+
2115+ void addObjectToPackage (PyObject* obj, const char * name, const char * packageName, PyObject* package)
2116+ {
2117+ if (PyModule_AddObject (package, name, obj) < 0 ) {
2118+ Py_DECREF (obj);
2119+ std::cerr << " failed to add " << name << " to " << packageName << " \n " ;
2120+ }
2121+ }
2122+
2123+ };
2124+
2125+ void PythonQtPrivate::registerGlobalNamespace (const char * typeName, const char * packageName, PythonQtQObjectCreatorFunctionCB* wrapperCreator, const QMetaObject& metaObject, PyObject* module )
2126+ {
2127+ registerCPPClass (typeName, " " , packageName, wrapperCreator, nullptr , module , 0 );
2128+
2129+ PyObject* package = module ? module : PythonQt::priv ()->packageByName (packageName);
2130+ PythonQtClassInfo* classInfo = PythonQt::priv ()->getClassInfo (typeName);
2131+ PyObject* globalNamespace = classInfo->pythonQtClassWrapper ();
2132+
2133+ // Collect the names of global methods
2134+ QSet<QByteArray> methodNames;
2135+ for (int i = metaObject.methodOffset (); i < metaObject.methodCount (); i++) {
2136+ methodNames.insert (metaObject.method (i).name ());
2137+ }
2138+ QByteArray staticPrefix = " static_" + QByteArray (typeName) + " _" ; // every static method starts with this string
2139+ for (auto name: methodNames) {
2140+ if (name.startsWith (staticPrefix)) { // non-static methods wouldn't work (and should not exists)
2141+ name = name.mid (staticPrefix.length ());
2142+ PyObject* obj = PyObject_GetAttrString (globalNamespace, name.constData ());
2143+ if (obj) {
2144+ addObjectToPackage (obj, name, packageName, package);
2145+ }
2146+ else {
2147+ std::cerr << " method not found " << name.constData () << " in " << typeName << std::endl;
2148+ }
2149+ }
2150+ }
2151+
2152+ // Global enums
2153+ for (int i = metaObject.enumeratorOffset (); i < metaObject.enumeratorCount (); i++) {
2154+ QMetaEnum metaEnum = metaObject.enumerator (i);
2155+ PyObject* obj = PyObject_GetAttrString (globalNamespace, metaEnum.name ());
2156+ if (obj) {
2157+ addObjectToPackage (obj, metaEnum.name (), packageName, package);
2158+ }
2159+ else {
2160+ std::cerr << " enum type not found " << metaEnum.name () << " in " << typeName << std::endl;
2161+ }
2162+ #if QT_VERSION > 0x050800
2163+ bool isScoped = metaEnum.isScoped ();
2164+ #else
2165+ bool isScoped = false ;
2166+ #endif
2167+ if (!isScoped) {
2168+ for (int j = 0 ; j < metaEnum.keyCount (); j++) {
2169+ QByteArray key = PythonQtClassInfo::escapeReservedNames (metaEnum.key (j));
2170+ int value = metaEnum.value (j);
2171+ PyObject* obj = PyInt_FromLong (value);
2172+ addObjectToPackage (obj, key, packageName, package);
2173+ }
2174+ }
2175+ }
2176+
2177+ PythonQtClassInfo::addGlobalNamespaceWrapper (classInfo);
2178+ }
2179+
21132180PyObject* PythonQtPrivate::packageByName (const char * name)
21142181{
21152182 if (name==nullptr || name[0 ]==0 ) {
0 commit comments