[Interest] Best way to QObject-wrap simple objects
Hello List! Sometimes I have a simple class, maybe a POD, that I want to pump through a queued signal-slot connection. As I understand it, I need a QObject to do that. So I wrap my class in QObject. What are some good idioms for this? What is the most parsimonious approach? Here's one method I've used: wrapped_pod.h: #include pod.h #include QObject #include QMetaType class WrappedPOD : public QObject, public POD { Q_OBJECT public: WrappedPOD() {} WrappedPOD (const WrappedPOD wp) : POD(wp) {} WrappedPOD (const POD p) : POD(p) {} ~WrappedPOD() {} }; (A comment: I was a little surprised that I seem to need to define the constructors. I would have thought that the c++ defaults would have sufficed.) Any thoughts on other, better ways to achieve this goal? Or is there an approach I can use that avoids wrapping the object in the first place? I imagine that this is not an uncommon need, so I imagine that there is some standard practice I can learn from. Thanks. K. Frank ___ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest
Re: [Interest] Best way to QObject-wrap simple objects
Hello, IIRC you don't, You have to Q_DECLARE_METATYPE your POD, qRegisterMetaType it and maybe (depends on your use case) add the in/out stream operators (only if you need to load and store in a QVariant). Hope it helps On 19 févr. 2013, at 14:19, K. Frank wrote: Hello List! Sometimes I have a simple class, maybe a POD, that I want to pump through a queued signal-slot connection. As I understand it, I need a QObject to do that. So I wrap my class in QObject. What are some good idioms for this? What is the most parsimonious approach? Here's one method I've used: wrapped_pod.h: #include pod.h #include QObject #include QMetaType class WrappedPOD : public QObject, public POD { Q_OBJECT public: WrappedPOD() {} WrappedPOD (const WrappedPOD wp) : POD(wp) {} WrappedPOD (const POD p) : POD(p) {} ~WrappedPOD() {} }; (A comment: I was a little surprised that I seem to need to define the constructors. I would have thought that the c++ defaults would have sufficed.) Any thoughts on other, better ways to achieve this goal? Or is there an approach I can use that avoids wrapping the object in the first place? I imagine that this is not an uncommon need, so I imagine that there is some standard practice I can learn from. Thanks. K. Frank ___ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest ___ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest
Re: [Interest] Best way to QObject-wrap simple objects
Op 19-2-2013 14:19, K. Frank schreef: Hello List! Sometimes I have a simple class, maybe a POD, that I want to pump through a queued signal-slot connection. As I understand it, I need a QObject to do that. So I wrap my class in QObject. No, you don't. In fact, it is a Bad Idea(TM). In order to send your POD as a signal/slot argument, it needs to be copyable. However, QObject is explicitly *not* copyable. As Samual already said: use Q_DECLARE_METATYPE instead. André What are some good idioms for this? What is the most parsimonious approach? Here's one method I've used: wrapped_pod.h: #include pod.h #include QObject #include QMetaType class WrappedPOD : public QObject, public POD { Q_OBJECT public: WrappedPOD() {} WrappedPOD (const WrappedPOD wp) : POD(wp) {} WrappedPOD (const POD p) : POD(p) {} ~WrappedPOD() {} }; (A comment: I was a little surprised that I seem to need to define the constructors. I would have thought that the c++ defaults would have sufficed.) Any thoughts on other, better ways to achieve this goal? Or is there an approach I can use that avoids wrapping the object in the first place? I imagine that this is not an uncommon need, so I imagine that there is some standard practice I can learn from. Thanks. K. Frank ___ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest ___ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest
Re: [Interest] Best way to QObject-wrap simple objects
Hi Frank, Sent: Wednesday, 20 February 2013 12:19 AM Hello List! Sometimes I have a simple class, maybe a POD, that I want to pump through a queued signal-slot connection. As I understand it, I need a QObject to do that. So I wrap my class in QObject. You can pass pointers to the POD without doing anything else: signals: void my_signal(POD *data); If it really must be POD by value, then use Samuel's approach. Tony. ___ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest
Re: [Interest] Best way to QObject-wrap simple objects
Hi Tony! On Tue, Feb 19, 2013 at 6:13 PM, Tony Rietwyk t...@rightsoft.com.au wrote: Hi Frank, Sent: Wednesday, 20 February 2013 12:19 AM Hello List! Sometimes I have a simple class, maybe a POD, that I want to pump through a queued signal-slot connection. As I understand it, I need a QObject to do that. So I wrap my class in QObject. You can pass pointers to the POD without doing anything else: signals: void my_signal(POD *data); Thanks for noting that. It seems a little odd, though. I could of sworn I tried passing a reference: void my_signal (const POD data) and it failed at run time when I tried to pass the reference through a queued connection. Of course, pointers and references are not identical, but, under the hood, you would think that if a queued connection could handle one, it could handle the other. Is it in fact the case that queued connections can handle pointers but not references (to non-qmetatypes), or am I just misremembering what I did? If it really must be POD by value, then use Samuel's approach. Well, in my case it certainly doesn't have to be by value, but by value or by reference stylistically reflects the by-value semantics of the POD. Tony. Thanks. K. Frank ___ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest