[Qt-qml] Pragmas for QML
Hi, Hope you are all having fun reading existing QML ;-) What I am finding is creating QML is an exceeding simple task compared to reading other's QML. The main culprit that inhibits my reading is the 'Component instance hierarchy' feature in http://doc.qt.nokia.com/4.7-snapshot/qdeclarativescope.html. The code which I am reading accesses components and ids all over the place. For example, if we had a Component heirarchy A that contains B that inturn contains C - C would access ids of A. B would set state (yes, _state_) of something in A. C would react on states of A etc. When used this way, ids have to be 'unique' and I think this pattern in most cases results in unreadable code (as shown in the example in the documentation too). Authors seems to think of all these ids as a global pool of objects that can be accessed from anywhere and think that this is declarative programming e.g. C.state = A.something. Yes, it's declarative but it should be done the other way around, in A's code, no? So, am I correct in thinking that in general, a component should _never_ really access anything else other than ids of it's own regardless of how un-reusable and specialized it is? Each qml component as much as possible should expose stuff as properties and bindings should be done in the _parent_ component. I do understand that there are cases that require child components to access parent stuff. So, is it a sane suggestion/feature request to add a 'pragma strictScope' which I can add to the top of a QML file to disable this feature? It would make reading QML infinitely good for me. Reminds me of VB - the first thing in do is add 'Option Explicit' :-) I would do the same in qml. Let me know if I am thinking very 'imperatively' :-) On the topic of pragmas, I would also like to have a 'pragma noSyntacticSugar'. QML has shortcuts which make it very hard for beginners to understand why things don't work in QML. For example, ListView { delegate: Text { text: model.text } } versus Text { id: textDelegate; text: model.text } ListView { delegate: textDelegate; } Oops, latter doesn't work. So, it would be nice to force people to write Component { } so they _understand_ what's happening. Same goes for default properties (I am looking the 'children' property). Girish ___ Qt-qml mailing list Qt-qml@trolltech.com http://lists.trolltech.com/mailman/listinfo/qt-qml
Re: [Qt-qml] QDeclarativeView::setObjectOwnership
Thanks, I created http://bugreports.qt.nokia.com/browse/QTBUG-15695. Girish On Mon, Nov 29, 2010 at 3:57 PM, wrote: > Hi, > > Sounds like a bug to me - please file a bug report. > > Cheers, > > Aaron > > On 29/11/2010, at 7:39 PM, "ext Girish Ramakrishnan" > wrote: > >> Hi, >> QDeclarativeView::setObjectOwnership doesn't seem to be working as I >> would expect. Maybe I am reading the documentation wrong. >> >> In essence, I have a >> Q_INVOKABLE QObject *create() { >> Object *o = new Object; >> o->setObjectName("object x"); >> QDeclarativeEngine::setObjectOwnership(o, >> QDeclarativeEngine::CppOwnership); >> return o; >> } >> >> I call the above function from QML and despite the ownership being set >> to CppOwnership, the above objects gets deleted anyway. >> >> If you want full compilable code, it's here - >> http://pastebin.com/ffqmxHy6. Keep clicking on the rectangle to create >> new objects. Then close the app, all the created objects gets deleted >> (I thought setting CppOwnership will make qml not delete the objects). >> >> Girish >> ___ >> Qt-qml mailing list >> Qt-qml@trolltech.com >> http://lists.trolltech.com/mailman/listinfo/qt-qml > ___ Qt-qml mailing list Qt-qml@trolltech.com http://lists.trolltech.com/mailman/listinfo/qt-qml
Re: [Qt-qml] QDeclarativeView::setObjectOwnership
Hi, Replying to myself. On Mon, Nov 29, 2010 at 3:08 PM, Girish Ramakrishnan wrote: > Hi, > QDeclarativeView::setObjectOwnership doesn't seem to be working as I > would expect. Maybe I am reading the documentation wrong. > > In essence, I have a > Q_INVOKABLE QObject *create() { > Object *o = new Object; > o->setObjectName("object x"); > QDeclarativeEngine::setObjectOwnership(o, > QDeclarativeEngine::CppOwnership); > return o; > } > > I call the above function from QML and despite the ownership being set > to CppOwnership, the above objects gets deleted anyway. > > If you want full compilable code, it's here - > http://pastebin.com/ffqmxHy6. Keep clicking on the rectangle to create > new objects. Then close the app, all the created objects gets deleted > (I thought setting CppOwnership will make qml not delete the objects). > Gregory pointed out on irc that I need to prove that qml is deleting it. So here's my gdb session: Creating new Object(0x85c5f0) // Object gets created 3 Breakpoint 1, QObject::deleteLater (this=0x60cf40) at /home/girish/Qt/qt-4.7/src/corelib/kernel/qobject.cpp:2123 2123QCoreApplication::postEvent(this, new QEvent(QEvent::DeferredDelete)); // this is the delete of the view (gdb) c Continuing. Breakpoint 1, QObject::deleteLater (this=0x85c5f0) at /home/girish/Qt/qt-4.7/src/corelib/kernel/qobject.cpp:2123 2123QCoreApplication::postEvent(this, new QEvent(QEvent::DeferredDelete)); // delete of the object (see pointer value) (gdb) bt #0 QObject::deleteLater (this=0x85c5f0) at /home/girish/Qt/qt-4.7/src/corelib/kernel/qobject.cpp:2123 #1 0x77a30ff7 in ObjectData::~ObjectData (this=0x85b170, __in_chrg=) at /home/girish/Qt/qt-4.7/src/declarative/qml/qdeclarativeobjectscriptclass.cpp:73 #2 0x77460ac1 in QScript::DeclarativeObjectDelegate::~DeclarativeObjectDelegate (this=0x86e7a0, __in_chrg=) at /home/girish/Qt/qt-4.7/src/script/bridge/qscriptdeclarativeobject.cpp:56 #3 0x7744703e in QScriptObject::Data::~Data (this=0x797a10, __in_chrg=) at /home/girish/Qt/qt-4.7/src/script/bridge/qscriptobject.cpp:42 #4 0x774471b4 in QScriptObject::~QScriptObject (this=0x7fffe13c4d40, __in_chrg=) at /home/girish/Qt/qt-4.7/src/script/bridge/qscriptobject.cpp:52 #5 0x7734b52e in QTJSC::Heap::freeBlocks (this=0x7fffec046a18) at /home/girish/Qt/qt-4.7/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp:349 #6 0x7734af21 in QTJSC::Heap::destroy (this=0x7fffec046a18) at /home/girish/Qt/qt-4.7/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp:199 #7 0x7741f7a8 in QScriptEnginePrivate::~QScriptEnginePrivate (this=0x8025b0, __in_chrg=) at /home/girish/Qt/qt-4.7/src/script/api/qscriptengine.cpp:1028 #8 0x7520e0aa in QScopedPointerDeleter::cleanup (pointer=0x8025b0) at ../../include/QtCore/../../../../qt-4.7/src/corelib/tools/qscopedpointer.h:62 #9 0x7526ede5 in QScopedPointer >::~QScopedPointer (this=0x802098, __in_chrg=) at ../../include/QtCore/../../../../qt-4.7/src/corelib/tools/qscopedpointer.h:100 #10 0x752669ab in QObject::~QObject (this=0x802090, __in_chrg=) at /home/girish/Qt/qt-4.7/src/corelib/kernel/qobject.cpp:963 #11 0x77424d38 in QScriptEngine::~QScriptEngine (this=0x802090, __in_chrg=) at /home/girish/Qt/qt-4.7/src/script/api/qscriptengine.cpp:1980 #12 0x77956da6 in QDeclarativeScriptEngine::~QDeclarativeScriptEngine (this=0x802090, __in_chrg=) at /home/girish/Qt/qt-4.7/src/declarative/qml/qdeclarativeengine.cpp:382 #13 0x779586a6 in QDeclarativeEnginePrivate::~QDeclarativeEnginePrivate (this=0x801f80, __in_chrg=) at /home/girish/Qt/qt-4.7/src/declarative/qml/qdeclarativeengine.cpp:431 #14 0x7520e0aa in QScopedPointerDeleter::cleanup (pointer=0x801f80) at ../../include/QtCore/../../../../qt-4.7/src/corelib/tools/qscopedpointer.h:62 #15 0x7526ede5 in QScopedPointer >::~QScopedPointer (this=0x801388, __in_chrg=) at ../../include/QtCore/../../../../qt-4.7/src/corelib/tools/qscopedpointer.h:100 #16 0x752669ab in QObject::~QObject (this=0x801380, __in_chrg=) at /home/girish/Qt/qt-4.7/src/corelib/kernel/qobject.cpp:963 #17 0x77958ed1 in QDeclarativeEngine::~QDeclarativeEngine (this=0x801380, __in_chrg=) at /home/girish/Qt/qt-4.7/src/declarative/qml/qdeclarativeengine.cpp:555 #18 0x77839804 in QDeclarativeViewPrivate::~QDeclarativeViewPrivate (this=0x7ed250, __in_chrg=) at /home/girish/Qt/qt-4.7/src/declarative/util/qdeclarativeview.cpp:135 #19 0x7520e0aa in QScopedPointerDeleter::cleanup (pointer=0x7ed250) at ../../include/QtCore/../../../../qt-4.7/src/corelib/tools/qscopedpointer.h:62 #20 0x7526ede5 in QScopedPointer >::~QScopedPointer (this=0x60cf48, __in_chrg=) ---Type to continue, or q t
[Qt-qml] QDeclarativeView::setObjectOwnership
Hi, QDeclarativeView::setObjectOwnership doesn't seem to be working as I would expect. Maybe I am reading the documentation wrong. In essence, I have a Q_INVOKABLE QObject *create() { Object *o = new Object; o->setObjectName("object x"); QDeclarativeEngine::setObjectOwnership(o, QDeclarativeEngine::CppOwnership); return o; } I call the above function from QML and despite the ownership being set to CppOwnership, the above objects gets deleted anyway. If you want full compilable code, it's here - http://pastebin.com/ffqmxHy6. Keep clicking on the rectangle to create new objects. Then close the app, all the created objects gets deleted (I thought setting CppOwnership will make qml not delete the objects). Girish ___ Qt-qml mailing list Qt-qml@trolltech.com http://lists.trolltech.com/mailman/listinfo/qt-qml
Re: [Qt-qml] C++ MyClass to detect child added/removed from QML
Hi, On Thu, Nov 25, 2010 at 2:55 AM, Charley Bay wrote: > I confirmed that these *do not* work for me: > > ...with a "Text { width: 50; height: 20 }" on the QML side, > > QGraphicsItem::boundingRect() // ALWAYS RETURNS QRectF(0,0,-1,-1) > QGraphicsItem::opaqueArea().boundingRect() // ALWAYS RETURNS QRectF(0,0,0,0) > > ...however, after casting the QGraphicsItem* to a QObject*, I can correctly > extract my "width" and "height" properties. > > So, my current conclusion is that I have *no* useful properties in > QGraphicsItem (and must cross-cast it to something I can use). boundingRect() works as I would expect. Can you provide some sample code? Rectangle { width: 300 height: 300 objectName: "rect" Text { objectName: "text" text: "foo" } } QDeclarativeItem *rect = qobject_cast(view->rootObject()); qDebug() << rect->boundingRect(); QDeclarativeItem *text = rect->findChild("text"); qDebug() << text->boundingRect(); Output: QRectF(0,0 300x300) QRectF(0,0 24x17) The first one is the rect of the top level item (and it matches what I set in qml) and the second one is the text item's computed width/height. So, the values are as I would expect. Girish ___ Qt-qml mailing list Qt-qml@trolltech.com http://lists.trolltech.com/mailman/listinfo/qt-qml
Re: [Qt-qml] C++ MyClass to detect child added/removed from QML
Hi Charley, On Wed, Nov 24, 2010 at 7:42 PM, Charley Bay wrote: > > > Martin spaketh: >> >> QGraphicsItem::itemChange() may do what you want: >> >> >> >> http://doc.qt.nokia.com/4.7-snapshot/qgraphicsitem.html#itemChange > > Works great! Thanks! > > Related question: Now that I'm in the QGraphicsItem world, which is *not* a > QObject with properties, how does QML expose attributes (since those are > *all* properties based)? > QML works with properties exposed through the metaobject system (Q_PROPERTY). So, items have to be extend QObject at some point. AFAIK, QML supports properties exposed through QObject and user visible items must be QGraphicsObject or QDeclarativeItem (there are restrictions like the component's root item must be a QDeclarative item etc). > For example, the QGraphicsItem::boundingRect() is always (0,0,-1,-1), even > though the referenced QML component *has* width and height. Similarly, the > QGraphicsItem::opaqueArea()::boundingRect() is always (0,0,0,0). Does the > QGraphicsItem have *any* opinion about or state from attributes in the QML > element? (e.g., what attributes can I trust in the QGraphicsItem as being > those used by the QML element?) > QDeclarativeView builds on QGraphicsView. So, QGraphicsItem::boundingRect is still very much used. For a component, the QGraphicsItem of the component will return the (0, 0, width, height), so I think your testing above is probably incorrect. I think opaqueArea is used only for obscurity detection which is not used in QML and thus left unimplemented. > What is the intended mechanism by which I interrogate the QGraphicsItem? As I understand, all QGraphicsItem API should still work as expected for QML items. > (Is the expectation that the user will merely attempt to downcast to > QGraphicsObject or QDeclarativeItem, handling the scenarios where it is not > that type?) For examle, I *assume* that the MouseArea will trigger child > notification, but it is not a QDeclarativeItem. In contrast, a Rectangle{} > or Text{} trigger child notification, and "happen to be" QDeclarativeItem > instances. > MouseArea is a QDeclarativeItem. Think of it as a transparent "overlay" child item that positions itself over the parent. I do not know why it does not trigger child notifications. Girish ___ Qt-qml mailing list Qt-qml@trolltech.com http://lists.trolltech.com/mailman/listinfo/qt-qml
Re: [Qt-qml] Modal dialogs in QML?
Hi, On Wed, Nov 24, 2010 at 10:05 AM, Bart Kelsey wrote: > Greets! > > Is there any way to create a modal dialog in QML, such that mouse input > outside of the dialog box is blocked? I've tried making a dialog with a > MouseArea under it (which would catch mouse input and do nothing with it), > but I can't seem to figure out how to make the MouseArea fill the entire > screen. Any ideas? > Conceptually something like, // main.qml Item { Dialog { // make Dialog a direct child of the main window anchors.fill: parent; // Dialog spans the entire window MouseArea { anchors.fill: parent; onClicked: opacity = 0; } // handle outside clicks Rectangle { // the dialogs content anchors.centerIn: parent MouseArea { anchors.fill: parent; } // absorb clicks in the "content" area so that it won't close the dialog ...your dialog's widgets... } } } You can expand on the above idea to use a Loader so that the Dialog gets created lazily. Girish ___ Qt-qml mailing list Qt-qml@trolltech.com http://lists.trolltech.com/mailman/listinfo/qt-qml
Re: [Qt-qml] Screen dimensions
You can expose QDesktopWidget::screenGeometry() to the QML engine and then access it from the QML. Something like, engine->rootContext()->setContextProperty("screen", QApplication::desktop()->screenGeometry()); And then screen.width and screen.height can be used in the QML. Girish On Wed, Nov 24, 2010 at 3:56 PM, Mark Constable wrote: > How would I determine the screen dimensions of the > device being used from within QML code? > > Any source examples available? > ___ > Qt-qml mailing list > Qt-qml@trolltech.com > http://lists.trolltech.com/mailman/listinfo/qt-qml > ___ Qt-qml mailing list Qt-qml@trolltech.com http://lists.trolltech.com/mailman/listinfo/qt-qml
Re: [Qt-qml] Mouse wheel events in QML
See http://bugreports.qt.nokia.com/browse/QTBUG-7369. In short, Flickable supports it but not MouseArea. Girish On Sat, Nov 20, 2010 at 9:17 PM, Jerzy Chalupski wrote: > I can't find any mouse wheel events handler. Am I selectively blind or > are mouse wheel events not supported by QML? > ___ > Qt-qml mailing list > Qt-qml@trolltech.com > http://lists.trolltech.com/mailman/listinfo/qt-qml > ___ Qt-qml mailing list Qt-qml@trolltech.com http://lists.trolltech.com/mailman/listinfo/qt-qml
Re: [Qt-qml] Exporting enums to QML
Hi, Create a QObject subclass with the enums and register the class using qmlRegisterUncreatableType. Girish On Sat, Nov 20, 2010 at 12:13 AM, wrote: > Hello, > > I know there is no enum reserved keyword in JavaScript, but what is the > preferred way to expose Q_ENUMS to QML? > > Thanks, > Jerome P. > ___ > Qt-qml mailing list > Qt-qml@trolltech.com > http://lists.trolltech.com/mailman/listinfo/qt-qml > ___ Qt-qml mailing list Qt-qml@trolltech.com http://lists.trolltech.com/mailman/listinfo/qt-qml