From f3d69f65d18b641aeeedfbbfe8a0e16d2a75d9fe Mon Sep 17 00:00:00 2001 From: Hugo Parente Lima Date: Mon, 4 Jul 2011 18:29:46 -0300 Subject: Fix bug 913 - "Widgets inside QTabWidget are not exported as members of the containing widget" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewer: Marcelo Lira Renato Araújo --- PySide/QtUiTools/glue/uitools_loadui.h | 81 +++++++++++++-------------------- PySide/QtUiTools/typesystem_uitools.xml | 6 +-- 2 files changed, 35 insertions(+), 52 deletions(-) (limited to 'PySide/QtUiTools') diff --git a/PySide/QtUiTools/glue/uitools_loadui.h b/PySide/QtUiTools/glue/uitools_loadui.h index a6e339ab0..18bb36050 100644 --- a/PySide/QtUiTools/glue/uitools_loadui.h +++ b/PySide/QtUiTools/glue/uitools_loadui.h @@ -5,73 +5,56 @@ */ #include +#include +#include +#include -static void -_populate_parent(PyObject* pyParent, QObject *parent) +static void createChildrenNameAttributes(PyObject* root, QObject* object) { - if (parent->children().isEmpty()) - return; + foreach (QObject* child, object->children()) { + const QByteArray name = child->objectName().toLocal8Bit(); - foreach(QObject *child, parent->children()) { - QString name(child->objectName()); if (!name.isEmpty() && !name.startsWith("_") && !name.startsWith("qt_")) { - bool has_attr = PyObject_HasAttrString(pyParent, qPrintable(name)); - Shiboken::AutoDecRef pyChild(Shiboken::Converter::toPython(child)); - if (!has_attr) - PyObject_SetAttrString(pyParent, qPrintable(name), pyChild); - - Shiboken::Object::setParent(pyParent, pyChild); - _populate_parent(pyChild, qobject_cast(child)); + bool hasAttr = PyObject_HasAttrString(root, name.constData()); + if (!hasAttr) { + Shiboken::AutoDecRef pyChild(Shiboken::Converter::toPython(child)); + PyObject_SetAttrString(root, name.constData(), pyChild); + } + createChildrenNameAttributes(root, child); } + createChildrenNameAttributes(root, child); } } -static PyObject* -quiloader_load_ui_from_device(QUiLoader* self, QIODevice* dev, QWidget *parent) +static PyObject* QUiLoadedLoadUiFromDevice(QUiLoader* self, QIODevice* dev, QWidget* parent) { - QWidget *w = self->load(dev, parent); - if (w) { - QObject* _parent = parent; - if (!_parent) - _parent = w; + QWidget* wdg = self->load(dev, parent); + + if (wdg) { + PyObject* pyWdg = Shiboken::Converter::toPython(wdg); + + if (!parent) + parent = wdg; - if (parent && parent->layout()) + if (parent->layout()) parent->layout()->deleteLater(); - PyObject* pyParent = Shiboken::Converter::toPython(w); - _populate_parent(pyParent, _parent); + createChildrenNameAttributes(pyWdg, wdg); + if (parent) { + Shiboken::AutoDecRef pyParent(Shiboken::Converter::toPython(parent)); + Shiboken::Object::setParent(pyParent, pyWdg); + } - return pyParent; + return pyWdg; } if (!PyErr_Occurred()) - PyErr_SetString(PyExc_RuntimeError, "Unable to open ui file"); + PyErr_SetString(PyExc_RuntimeError, "Unable to open/read ui device"); return 0; } -static PyObject* -quiloader_load_ui(QUiLoader* self, const QString &ui_file, QWidget *parent) +static PyObject* QUiLoaderLoadUiFromFileName(QUiLoader* self, const QString& uiFile, QWidget* parent) { - QFile fd(ui_file); - - if (fd.exists(ui_file) && fd.open(QFile::ReadOnly)) { - QWidget* w = self->load(&fd, parent); - fd.close(); - if (w != 0) { - QObject *_parent = parent; - if (!_parent) - _parent = w; - - Shiboken::AutoDecRef pyParent(Shiboken::Converter::toPython(_parent)); - if (parent && parent->layout()) - parent->layout()->deleteLater(); - - _populate_parent(pyParent, _parent); - - return Shiboken::Converter::toPython(w); - } - } - if (!PyErr_Occurred()) - PyErr_SetString(PyExc_RuntimeError, "Unable to open ui file"); - return 0; + QFile fd(uiFile); + return QUiLoadedLoadUiFromDevice(self, &fd, parent); } diff --git a/PySide/QtUiTools/typesystem_uitools.xml b/PySide/QtUiTools/typesystem_uitools.xml index 9d36d3e50..46c325ca5 100644 --- a/PySide/QtUiTools/typesystem_uitools.xml +++ b/PySide/QtUiTools/typesystem_uitools.xml @@ -1,7 +1,7 @@