@@ -118,6 +118,8 int PythonQtClassInfo::findCharOffset(const char* sigStart, char someChar) | |||||
118 |
|
118 | |||
119 | bool PythonQtClassInfo::lookForPropertyAndCache(const char* memberName) |
|
119 | bool PythonQtClassInfo::lookForPropertyAndCache(const char* memberName) | |
120 | { |
|
120 | { | |
|
121 | if (!_meta) return false; | |||
|
122 | ||||
121 |
|
|
123 | bool found = false; | |
122 | bool nameMapped = false; |
|
124 | bool nameMapped = false; | |
123 | const char* attributeName = memberName; |
|
125 | const char* attributeName = memberName; |
@@ -241,6 +241,17 static PyObject *PythonQtInstanceWrapper_getattro(PyObject *obj,PyObject *name) | |||||
241 | std::cerr << "PythonQtInstanceWrapper: something is wrong, could not get attribute " << name.toLatin1().data(); |
|
241 | std::cerr << "PythonQtInstanceWrapper: something is wrong, could not get attribute " << name.toLatin1().data(); | |
242 | } |
|
242 | } | |
243 | } |
|
243 | } | |
|
244 | ||||
|
245 | QList<QByteArray> dynamicProps = wrapper->_obj->dynamicPropertyNames(); | |||
|
246 | foreach (QByteArray name, dynamicProps) { | |||
|
247 | PyObject* o = PyObject_GetAttrString(obj, name.data()); | |||
|
248 | if (o) { | |||
|
249 | PyDict_SetItemString(dict, name.data(), o); | |||
|
250 | Py_DECREF(o); | |||
|
251 | } else { | |||
|
252 | std::cerr << "PythonQtInstanceWrapper: dynamic property could not be read " << name.data(); | |||
|
253 | } | |||
|
254 | } | |||
244 | } |
|
255 | } | |
245 | // Note: we do not put children into the dict, is would look confusing?! |
|
256 | // Note: we do not put children into the dict, is would look confusing?! | |
246 | return dict; |
|
257 | return dict; | |
@@ -255,8 +266,6 static PyObject *PythonQtInstanceWrapper_getattro(PyObject *obj,PyObject *name) | |||||
255 |
|
266 | |||
256 | // mlabDebugConst("Python","get " << attributeName); |
|
267 | // mlabDebugConst("Python","get " << attributeName); | |
257 |
|
268 | |||
258 | // TODO: dynamic properties are missing |
|
|||
259 |
|
||||
260 | PythonQtMemberInfo member = wrapper->classInfo()->member(attributeName); |
|
269 | PythonQtMemberInfo member = wrapper->classInfo()->member(attributeName); | |
261 | switch (member._type) { |
|
270 | switch (member._type) { | |
262 | case PythonQtMemberInfo::Property: |
|
271 | case PythonQtMemberInfo::Property: | |
@@ -290,6 +299,15 static PyObject *PythonQtInstanceWrapper_getattro(PyObject *obj,PyObject *name) | |||||
290 | return enumWrapper; |
|
299 | return enumWrapper; | |
291 | } |
|
300 | } | |
292 | break; |
|
301 | break; | |
|
302 | case PythonQtMemberInfo::NotFound: | |||
|
303 | // handle dynamic properties | |||
|
304 | if (wrapper->_obj) { | |||
|
305 | QVariant v = wrapper->_obj->property(attributeName); | |||
|
306 | if (v.isValid()) { | |||
|
307 | return PythonQtConv::QVariantToPyObject(v); | |||
|
308 | } | |||
|
309 | } | |||
|
310 | break; | |||
293 | default: |
|
311 | default: | |
294 | // is an invalid type, go on |
|
312 | // is an invalid type, go on | |
295 | break; |
|
313 | break; | |
@@ -367,6 +385,23 static int PythonQtInstanceWrapper_setattro(PyObject *obj,PyObject *name,PyObjec | |||||
367 | } else if (member._type == PythonQtMemberInfo::EnumWrapper) { |
|
385 | } else if (member._type == PythonQtMemberInfo::EnumWrapper) { | |
368 | error = QString("Enum '") + attributeName + "' can not be overwritten on " + obj->ob_type->tp_name + " object"; |
|
386 | error = QString("Enum '") + attributeName + "' can not be overwritten on " + obj->ob_type->tp_name + " object"; | |
369 | } else if (member._type == PythonQtMemberInfo::NotFound) { |
|
387 | } else if (member._type == PythonQtMemberInfo::NotFound) { | |
|
388 | // handle dynamic properties | |||
|
389 | if (wrapper->_obj) { | |||
|
390 | QVariant prop = wrapper->_obj->property(attributeName); | |||
|
391 | if (prop.isValid()) { | |||
|
392 | QVariant v = PythonQtConv::PyObjToQVariant(value); | |||
|
393 | if (v.isValid()) { | |||
|
394 | wrapper->_obj->setProperty(attributeName, v); | |||
|
395 | return 0; | |||
|
396 | } else { | |||
|
397 | error = QString("Dynamic property '") + attributeName + "' does not accept an object of type " | |||
|
398 | + QString(value->ob_type->tp_name) + " (" + PythonQtConv::PyObjGetRepresentation(value) + ")"; | |||
|
399 | PyErr_SetString(PyExc_AttributeError, error.toLatin1().data()); | |||
|
400 | return -1; | |||
|
401 | } | |||
|
402 | } | |||
|
403 | } | |||
|
404 | ||||
370 |
|
|
405 | // if we are a derived python class, we allow setting attributes. | |
371 | // if we are a direct CPP wrapper, we do NOT allow it, since |
|
406 | // if we are a direct CPP wrapper, we do NOT allow it, since | |
372 | // it would be confusing to allow it because a wrapper will go away when it is not seen by python anymore |
|
407 | // it would be confusing to allow it because a wrapper will go away when it is not seen by python anymore |
@@ -149,6 +149,16 const QObjectList* PythonQtStdDecorators::children(QObject* o) | |||||
149 | return &o->children(); |
|
149 | return &o->children(); | |
150 | } |
|
150 | } | |
151 |
|
151 | |||
|
152 | bool PythonQtStdDecorators::setProperty(QObject* o, const char* name, const QVariant& value) | |||
|
153 | { | |||
|
154 | return o->setProperty(name, value); | |||
|
155 | } | |||
|
156 | ||||
|
157 | QVariant PythonQtStdDecorators::property(QObject* o, const char* name) | |||
|
158 | { | |||
|
159 | return o->property(name); | |||
|
160 | } | |||
|
161 | ||||
152 | QString PythonQtStdDecorators::tr(QObject* obj, const QByteArray& text, const QByteArray& ambig, int n) |
|
162 | QString PythonQtStdDecorators::tr(QObject* obj, const QByteArray& text, const QByteArray& ambig, int n) | |
153 | { |
|
163 | { | |
154 | return QCoreApplication::translate(obj->metaObject()->className(), text.constData(), ambig.constData(), QCoreApplication::CodecForTr, n); |
|
164 | return QCoreApplication::translate(obj->metaObject()->className(), text.constData(), ambig.constData(), QCoreApplication::CodecForTr, n); |
@@ -75,6 +75,9 public slots: | |||||
75 | QList<QObject*> findChildren(QObject* parent, PyObject* type, const QString& name= QString()); |
|
75 | QList<QObject*> findChildren(QObject* parent, PyObject* type, const QString& name= QString()); | |
76 | QList<QObject*> findChildren(QObject* parent, PyObject* type, const QRegExp& regExp); |
|
76 | QList<QObject*> findChildren(QObject* parent, PyObject* type, const QRegExp& regExp); | |
77 |
|
77 | |||
|
78 | bool setProperty(QObject* o, const char* name, const QVariant& value); | |||
|
79 | QVariant property(QObject* o, const char* name); | |||
|
80 | ||||
78 | double static_Qt_qAbs(double a) { return qAbs(a); } |
|
81 | double static_Qt_qAbs(double a) { return qAbs(a); } | |
79 | double static_Qt_qBound(double a,double b,double c) { return qBound(a,b,c); } |
|
82 | double static_Qt_qBound(double a,double b,double c) { return qBound(a,b,c); } | |
80 | void static_Qt_qDebug(const QByteArray& msg) { qDebug(msg.constData()); } |
|
83 | void static_Qt_qDebug(const QByteArray& msg) { qDebug(msg.constData()); } |
General Comments 0
You need to be logged in to leave comments.
Login now