[Kde-bindings] Adding more explicit ambiguous method lookup resolution for PerlQt

Jonathan Yu frequency at cpan.org
Wed Jun 10 19:00:39 UTC 2009


Chris--

For us it's as simple as detecting what the type is, using things like
SvIVOK (to determine if it's an integer value) and then using SvIV or
whatever to extract the actual value out of the scalar. Then we just
have a normal int, which we can pass to the QVariant... And it will
work as normal

Or am I missing something here?

Cheers,

Jonathan

On Wed, Jun 10, 2009 at 2:16 PM, Chris Burel<chrisburel at gmail.com> wrote:
> On Wed, Jun 10, 2009 at 8:34 AM, Richard Dale<rdale at foton.es> wrote:
>> On Wednesday 10 June 2009 06:28:33 am Chris Burel wrote:
>>> Hey guys,
>>> Sorry for double posting, but I wanted to get Ruby's opinion on this too.
>>>
>>> One thing in PerlQt that can be very frustrating is when the bindings
>>> cannot determine which method you intend to call based on the
>>> arguments.  A common example of this happens with the QVariant class,
>>> because it's essentially a union class that has constructors for a
>>> bunch of different data types.  Consider:
>>> my $foo = Qt::Variant(1)
>>> results in
>>>
>>> --- Ambiguous method QVariant::QVariant called
>>> Candidates are:
>>>         QVariant::QVariant( uint )
>>>         QVariant::QVariant( int )
>>>         QVariant::QVariant( bool )
>>> Choosing first one...
>>>
>>> It's frustrating because the bindings clearly know that the other
>>> method exists, and sometimes you really do want to call the other
>>> method.  But how should you specify which method you really want?
>>>
>>> I was thinking that if we already have the method's signature, and it
>>> is unique, why not let the coder specify the exact signature they want
>>> to call?  Something along the lines of
>>> Qt::setSignature( 'QVariant::QVariant( bool )' );
>>> my $foo = Qt::Variant(1);
>>> That way the coder can force the bindings to call the correct method.
>> In QtRuby you can pass an optional second argument to the
>> Qt::Variant#fromValue method to indicate the exact type you want:
> That works for the case where you make the Variant in Ruby/Perl and
> then retrieve data from the Variant also in Ruby/Perl.  But if you're
> passing the variant to some function for use by C++, it's not
> sufficient.  You have to create the variant with the right type so
> that when C++ looks at it to determine it's type, you get the one you
> intended.  Consider the following from the widgets/codeeditor example
> that ships with Qt-4.5.1:
>
> my $selection = Qt::TextEdit::ExtraSelection();
>
> my $lineColor = Qt::Color(Qt::yellow())->lighter(160);
>
> $selection->format->setBackground( Qt::Brush( $lineColor ) );
> # Create a bool or int QVariant?
> $selection->format->setProperty(Qt::TextFormat::FullWidthSelection(),
> Qt::Variant(1));
> $selection->setCursor( this->textCursor() );
> $selection->cursor->clearSelection();
>
> this->setExtraSelections([$extraSelections]);
>
> If that creates an int variant, the resulting property is not set as desired.
> _______________________________________________
> Kde-bindings mailing list
> Kde-bindings at kde.org
> https://mail.kde.org/mailman/listinfo/kde-bindings
>



More information about the Kde-bindings mailing list