Gui: extend PythonWrapper:

* add methods to wrap/unwrap QDir
* add method to load QtUiTools module
This commit is contained in:
wmayer
2021-09-22 19:49:39 +02:00
parent 0ec51a959a
commit 30848cb635
2 changed files with 53 additions and 0 deletions

View File

@@ -422,8 +422,39 @@ QIcon *PythonWrapper::toQIcon(PyObject *pyobj)
return 0;
}
Py::Object PythonWrapper::fromQDir(const QDir& dir)
{
#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE)
const char* typeName = typeid(dir).name();
PyObject* pyobj = Shiboken::Object::newObject(reinterpret_cast<SbkObjectType*>(getPyTypeObjectForTypeName<QDir>()),
const_cast<QDir*>(&dir), false, false, typeName);
if (pyobj)
return Py::asObject(pyobj);
#endif
throw Py::RuntimeError("Failed to wrap icon");
}
QDir* PythonWrapper::toQDir(PyObject* pyobj)
{
#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE)
PyTypeObject* type = getPyTypeObjectForTypeName<QDir>();
if (type) {
if (Shiboken::Object::checkType(pyobj)) {
SbkObject* sbkobject = reinterpret_cast<SbkObject*>(pyobj);
void* cppobject = Shiboken::Object::cppPointer(sbkobject, type);
return reinterpret_cast<QDir*>(cppobject);
}
}
#else
Q_UNUSED(pyobj);
#endif
return nullptr;
}
Py::Object PythonWrapper::fromQObject(QObject* object, const char* className)
{
if (!object)
return Py::None();
#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE)
// Access shiboken/PySide via C++
//
@@ -563,6 +594,21 @@ bool PythonWrapper::loadWidgetsModule()
return true;
}
bool PythonWrapper::loadUiToolsModule()
{
#if defined (HAVE_SHIBOKEN2) && defined(HAVE_PYSIDE2)
// QtUiTools
static PyTypeObject** SbkPySide2_QtUiToolsTypes = nullptr;
if (!SbkPySide2_QtUiToolsTypes) {
Shiboken::AutoDecRef requiredModule(Shiboken::Module::import("PySide2.QtUiTools"));
if (requiredModule.isNull())
return false;
SbkPySide2_QtUiToolsTypes = Shiboken::Module::getTypes(requiredModule);
}
#endif
return true;
}
void PythonWrapper::createChildrenNameAttributes(PyObject* root, QObject* object)
{
Q_FOREACH (QObject* child, object->children()) {

View File

@@ -35,6 +35,10 @@
#include "PropertyPage.h"
#include <CXX/Extensions.hxx>
QT_BEGIN_NAMESPACE
class QDir;
QT_END_NAMESPACE
namespace Gui {
namespace Dialog{
class PreferencePage;
@@ -47,6 +51,7 @@ public:
bool loadCoreModule();
bool loadGuiModule();
bool loadWidgetsModule();
bool loadUiToolsModule();
bool toCString(const Py::Object&, std::string&);
QObject* toQObject(const Py::Object&);
@@ -60,6 +65,8 @@ public:
*/
Py::Object fromQIcon(const QIcon*);
QIcon *toQIcon(PyObject *pyobj);
Py::Object fromQDir(const QDir&);
QDir* toQDir(PyObject* pyobj);
static void createChildrenNameAttributes(PyObject* root, QObject* object);
static void setParent(PyObject* pyWdg, QObject* parent);
};