[Interest] Best way to QObject-wrap simple objects

2013-02-19 Thread K. Frank
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

2013-02-19 Thread Samuel Gaist
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

2013-02-19 Thread André Somers
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

2013-02-19 Thread Tony Rietwyk
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

2013-02-19 Thread K. Frank
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