[Qt-interest] Generic input widgets for varying types - how to?

Nathan Carter nathancarter5 at gmail.com
Fri Mar 27 21:28:56 CET 2009


On Mar 27, 2009, at 4:12 PM, Helge Preuss wrote:

> Nathan Carter wrote:
>> How about changing the relationship from is-a to has-a?  Just make
>> your ParameterInput inherit from QHBox instead, and put the
>> appropriate input widget inside, based on the type?
>>
> Right, I just had this idea too. I was thinking "QWidget" though.  
> Would
> using a QHBox take care of resizing, moving, etc. the inner widget
> automatically? Then that would be the better choice, of course.

I believe so.

>> You should also consider just making one class, not many, and using  
>> an
>> enum for types, and returning QVariants.  (They already have the type
>> enum built-in.)
> I'm not familiar with the QVariant class, but from scanning the
> documentation I gather that it is a union for /Qt/ classes. I need to
> define my own widgets. That would rule out this idea, right?

No.  You're in charge of the association between QVariant types and  
the widgets you want to use for editing them.  That's what's up with  
the code I gave in the previous email, quoted below.  However another  
poster suggested that QItemEditorFactory may save you some of that code.

Nathan


> Thanks,
>
> Helge
>> Something like this:
>>
>> class ParameterInput : public QHBox
>> {
>> private:
>> 	QVariant::Type type;
>> 	QWidget* inner;
>> public:
>> 	ParameterInput ( QVariant::Type type = QVariant::Int, QWidget*  
>> parent
>> = 0 )
>> 		: QWidget( parent ), type( type )
>> 	{
>> 		switch ( type )
>> 		{
>> 			case QVariant::Int:
>> 				inner = new QSpinBox( ..., this );
>> 				break;
>> 			case ...:
>> 			...
>> 		}
>> 	};
>> 	QVariant value ()
>> 	{
>> 		switch ( type )
>> 		{
>> 			case QVariant::Int:
>> 				return qobject_cast<QSpinBox*>( inner )->value();
>> 			case ...:
>> 			...
>> 		}
>>
>> 	};
>> };
>>
>> You could even later have a signal emitted on data change, and hook  
>> it
>> up to the corresponding slot of inner on its construction, etc.
>> Furthermore, you could add some other convenience methods, like
>> ParameterInput(QVariant v,QWidget* parent) and setValue(QVariant v)
>> and so forth.  All done with switch statements.
>>
>> Except for this idea:  Do all the widgets you're interested in using
>> have the value property equal to what you want?  If so, throw the
>> switch statements out the window and just use setProperty() and
>> getProperty() on the value property.
>>
>> Surely someone has done this somewhere already; I'm getting the
>> reinventing the wheel feeling.  Anyone?...anyone?...Bueller?
>>
>> Nathan
>>
> -- 
> Helge Preuss
> Freelance Software Developer
> +49 30 40 30 10 90
> +49 177 2262 484
> helge.preuss at gmx.net
>




More information about the Qt-interest-old mailing list