Py::Object UiLoaderPy::createWidget(const Py::Tuple& args) { Py::Module sipmod(PyImport_AddModule((char*)"sip")); Py::Module qtmod(PyImport_ImportModule((char*)"PyQt4.Qt")); // 1st argument std::string className = (std::string)Py::String(args[0]); // 2nd argument QWidget* parent = 0; if (args.size() > 1) { Py::Callable func = sipmod.getDict().getItem("unwrapinstance"); Py::Tuple arguments(1); arguments[0] = args[1]; //PyQt pointer Py::Object result = func.apply(arguments); void* ptr = PyLong_AsVoidPtr(result.ptr()); QObject* object = reinterpret_cast<QObject*>(ptr); if (object) parent = qobject_cast<QWidget*>(object); } // 3rd argument std::string objectName; if (args.size() > 2) { objectName = (std::string)Py::String(args[2]); } QWidget* widget = loader.createWidget(QString::fromAscii(className.c_str()), parent, QString::fromAscii(objectName.c_str())); Py::Callable func = sipmod.getDict().getItem("wrapinstance"); Py::Tuple arguments(2); arguments[0] = Py::asObject(PyLong_FromVoidPtr(widget)); arguments[1] = qtmod.getDict().getItem("QWidget"); return func.apply(arguments); }
Py::Object PythonWrapper::fromQWidget(QWidget* widget, const char* className) { #if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) PyTypeObject * type = Shiboken::SbkType<QWidget>(); if (type) { SbkObjectType* sbk_type = reinterpret_cast<SbkObjectType*>(type); std::string typeName; if (className) typeName = className; else typeName = widget->metaObject()->className(); PyObject* pyobj = Shiboken::Object::newObject(sbk_type, widget, false, false, typeName.c_str()); return Py::asObject(pyobj); } throw Py::RuntimeError("Failed to wrap widget"); #else Py::Module sipmod(PyImport_AddModule((char*)"sip")); Py::Callable func = sipmod.getDict().getItem("wrapinstance"); Py::Tuple arguments(2); arguments[0] = Py::asObject(PyLong_FromVoidPtr(widget)); Py::Module qtmod(PyImport_ImportModule((char*)"PyQt4.Qt")); arguments[1] = qtmod.getDict().getItem("QWidget"); return func.apply(arguments); #endif }
QObject* PythonWrapper::toQObject(const Py::Object& pyobject) { // http://pastebin.com/JByDAF5Z #if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) #if 1 PyTypeObject * type = Shiboken::SbkType<QObject>(); if (type) { if (Shiboken::Object::checkType(pyobject.ptr())) { SbkObject* sbkobject = reinterpret_cast<SbkObject *>(pyobject.ptr()); void* cppobject = Shiboken::Object::cppPointer(sbkobject, type); return reinterpret_cast<QObject*>(cppobject); } } #else // does the same using shiboken's Python interface // https://github.com/PySide/Shiboken/blob/master/shibokenmodule/typesystem_shiboken.xml Py::Module mainmod(PyImport_ImportModule((char*)"shiboken"), true); Py::Callable func = mainmod.getDict().getItem("getCppPointer"); Py::Tuple arguments(1); arguments[0] = pyobject; //PySide pointer Py::Tuple result(func.apply(arguments)); void* ptr = PyLong_AsVoidPtr(result[0].ptr()); return reinterpret_cast<QObject*>(ptr); #endif #else Py::Module mainmod(PyImport_ImportModule((char*)"sip"), true); Py::Callable func = mainmod.getDict().getItem("unwrapinstance"); Py::Tuple arguments(1); arguments[0] = pyobject; //PyQt pointer Py::Object result = func.apply(arguments); void* ptr = PyLong_AsVoidPtr(result.ptr()); return reinterpret_cast<QObject*>(ptr); #endif return 0; }
Py::Object qt_wrapInstance(qttype object, const char* className, const char* shiboken, const char* pyside, const char* wrap) { PyObject* module = PyImport_ImportModule(shiboken); if (!module) { std::string error = "Cannot load "; error += shiboken; error += " module"; throw Py::Exception(PyExc_ImportError, error); } Py::Module mainmod(module, true); Py::Callable func = mainmod.getDict().getItem(wrap); Py::Tuple arguments(2); arguments[0] = Py::asObject(PyLong_FromVoidPtr((void*)object)); module = PyImport_ImportModule(pyside); if (!module) { std::string error = "Cannot load "; error += pyside; error += " module"; throw Py::Exception(PyExc_ImportError, error); } Py::Module qtmod(module); arguments[1] = qtmod.getDict().getItem(className); return func.apply(arguments); }
TaskDialogPython::TaskDialogPython(const Py::Object& o) : dlg(o) { if (dlg.hasAttr(std::string("ui"))) { UiLoader loader; #if QT_VERSION >= 0x040500 loader.setLanguageChangeEnabled(true); #endif QString fn, icon; Py::String ui(dlg.getAttr(std::string("ui"))); std::string path = (std::string)ui; fn = QString::fromUtf8(path.c_str()); QFile file(fn); QWidget* form = 0; if (file.open(QFile::ReadOnly)) form = loader.load(&file, 0); file.close(); if (form) { Gui::TaskView::TaskBox* taskbox = new Gui::TaskView::TaskBox( QPixmap(icon), form->windowTitle(), true, 0); taskbox->groupLayout()->addWidget(form); Content.push_back(taskbox); } else { Base::Console().Error("Failed to load UI file from '%s'\n", (const char*)fn.toUtf8()); } } else if (dlg.hasAttr(std::string("form"))) { Py::Object f(dlg.getAttr(std::string("form"))); Py::List widgets; if (f.isList()) { widgets = f; } else { widgets.append(f); } for (Py::List::iterator it = widgets.begin(); it != widgets.end(); ++it) { Py::Module mainmod(PyImport_AddModule((char*)"sip")); Py::Callable func = mainmod.getDict().getItem("unwrapinstance"); Py::Tuple arguments(1); arguments[0] = *it; //PyQt pointer Py::Object result = func.apply(arguments); void* ptr = PyLong_AsVoidPtr(result.ptr()); QObject* object = reinterpret_cast<QObject*>(ptr); if (object) { QWidget* form = qobject_cast<QWidget*>(object); if (form) { Gui::TaskView::TaskBox* taskbox = new Gui::TaskView::TaskBox( form->windowIcon().pixmap(32), form->windowTitle(), true, 0); taskbox->groupLayout()->addWidget(form); Content.push_back(taskbox); } } } } }
void* qt_getCppPointer(const Py::Object& pyobject, const char* shiboken, const char* unwrap) { // https://github.com/PySide/Shiboken/blob/master/shibokenmodule/typesystem_shiboken.xml PyObject* module = PyImport_ImportModule(shiboken); if (!module) { std::string error = "Cannot load "; error += shiboken; error += " module"; throw Py::Exception(PyExc_ImportError, error); } Py::Module mainmod(module, true); Py::Callable func = mainmod.getDict().getItem(unwrap); Py::Tuple arguments(1); arguments[0] = pyobject; //PySide pointer Py::Tuple result(func.apply(arguments)); void* ptr = PyLong_AsVoidPtr(result[0].ptr()); return ptr; }
QObject* PythonWrapper::toQObject(const Py::Object& pyobject) { // http://pastebin.com/JByDAF5Z #if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) PyTypeObject * type = Shiboken::SbkType<QObject>(); if (type) { if (Shiboken::Object::checkType(pyobject.ptr())) { SbkObject* sbkobject = reinterpret_cast<SbkObject *>(pyobject.ptr()); void* cppobject = Shiboken::Object::cppPointer(sbkobject, type); return reinterpret_cast<QObject*>(cppobject); } } #else Py::Module mainmod(PyImport_AddModule((char*)"sip")); Py::Callable func = mainmod.getDict().getItem("unwrapinstance"); Py::Tuple arguments(1); arguments[0] = pyobject; //PyQt pointer Py::Object result = func.apply(arguments); void* ptr = PyLong_AsVoidPtr(result.ptr()); return reinterpret_cast<QObject*>(ptr); #endif return 0; }
QVariant PythonObject::callMethod(const QString& name, const QVariantList& args) { #ifdef QROSS_PYTHON_FUNCTION_DEBUG qrossdebug( QString("PythonObject(%1)::call(%2) isInstance=%3").arg(d->m_pyobject.as_string().c_str()).arg(name).arg(d->m_pyobject.isInstance()) ); #endif //if(d->m_pyobject.isInstance()) { // if it inherits a PyQt4 QObject/QWidget then it's not counted as instance try { Py::Callable method = d->m_pyobject.getAttr(name.toLatin1().data()); if (!method.isCallable()) { qrossdebug( QString("%1 is not callable (%2).").arg(name).arg(method.str().as_string().c_str()) ); return QVariant(); } Py::Object pyresult = method.apply( PythonType<QVariantList,Py::Tuple>::toPyObject(args) ); QVariant result = PythonType<QVariant>::toVariant(pyresult); #ifdef QROSS_PYTHON_FUNCTION_DEBUG qrossdebug( QString("PythonScript::callFunction() result=%1 variant.toString=%2 variant.typeName=%3").arg(pyresult.as_string().c_str()).arg(result.toString()).arg(result.typeName()) ); #endif return result; } catch(Py::Exception& e) { //#ifdef QROSS_PYTHON_SCRIPT_CALLFUNC_DEBUG qrosswarning( QString("PythonScript::callFunction() Exception: %1").arg(Py::value(e).as_string().c_str()) ); //#endif Py::Object err = Py::value(e); if(err.ptr() == Py_None) err = Py::type(e); // e.g. string-exceptions have there errormessage in the type-object QStringList trace; int lineno; PythonInterpreter::extractException(trace, lineno); setError(err.as_string().c_str(), trace.join("\n"), lineno); PyErr_Print(); } //} return QVariant(); }
TaskWatcherPython::TaskWatcherPython(const Py::Object& o) : TaskWatcher(0), watcher(o) { QString title; if (watcher.hasAttr(std::string("title"))) { Py::String name(watcher.getAttr(std::string("title"))); std::string s = (std::string)name; title = QString::fromUtf8(s.c_str()); } QPixmap icon; if (watcher.hasAttr(std::string("icon"))) { Py::String name(watcher.getAttr(std::string("icon"))); std::string s = (std::string)name; icon = BitmapFactory().pixmap(s.c_str()); } Gui::TaskView::TaskBox *tb = 0; if (watcher.hasAttr(std::string("commands"))) { if (!tb) tb = new Gui::TaskView::TaskBox(icon, title, true, 0); Py::List cmds(watcher.getAttr(std::string("commands"))); CommandManager &mgr = Gui::Application::Instance->commandManager(); for (Py::List::iterator it = cmds.begin(); it != cmds.end(); ++it) { Py::String name(*it); std::string s = (std::string)name; Command *c = mgr.getCommandByName(s.c_str()); if (c) c->addTo(tb); } } if (watcher.hasAttr(std::string("widgets"))) { if (!tb && !title.isEmpty()) tb = new Gui::TaskView::TaskBox(icon, title, true, 0); Py::List list(watcher.getAttr(std::string("widgets"))); Py::Module mainmod(PyImport_AddModule((char*)"sip")); Py::Callable func = mainmod.getDict().getItem("unwrapinstance"); for (Py::List::iterator it = list.begin(); it != list.end(); ++it) { Py::Tuple arguments(1); arguments[0] = *it; //PyQt pointer Py::Object result = func.apply(arguments); void* ptr = PyLong_AsVoidPtr(result.ptr()); QObject* object = reinterpret_cast<QObject*>(ptr); if (object) { QWidget* w = qobject_cast<QWidget*>(object); if (w) { if (tb) tb->groupLayout()->addWidget(w); else Content.push_back(w); } } } } if (tb) Content.push_back(tb); if (watcher.hasAttr(std::string("filter"))) { Py::String name(watcher.getAttr(std::string("filter"))); std::string s = (std::string)name; this->setFilter(s.c_str()); } }