[Kde-bindings] Fw: [Qyoto] Casting QObjects

Mach metator.pt at gmail.com
Thu May 24 22:38:30 UTC 2012


Thanks,

Qt.qobject_cast<> does the job. I won't promise you anything but i might 
be able to help in testing (and spreading the word, of course!). I still 
need to get acquainted to Qt and Qyoto. I'm investigating gui libraries 
for csharp that work at least in Windows and Mac's. If it gets approved, 
i'll be glad do help in testing.

Regards

Em 24-05-2012 23:03, Dimitar Dobrev escreveu:
> You're welcome. :) I hope you will join our community, we could 
> definitely use any kind of help: development, testing, popularisation 
> among developers, etc.
>
> I've just checked "qt_rubberband" in a C++ Qt project. The debugger 
> shows it is as a QObject in an empty QMainWindow, i.e. the same as in 
> your C# code. This probably means that Qyoto is in no error in this 
> case. About what "qt_rubberband" is, here is an explanation - 
> http://www.qtcentre.org/threads/34998-qt_rubberband-blocking-events-of-pushbutton?p=161726#post161726.
>
> Anyway, you may try casting it using the Qt.qobject_cast<> static 
> method. Unfortunately, even if this works, I do not yet know a way to 
> test if such an object is of a certain type (QWidget in this case).
>
> ------------------------------------------------------------------------
> *From:* Mach <metator.pt at gmail.com>
> *To:* Dimitar Dobrev <dpldobrev at yahoo.com>; KDE bindings for other 
> programming languages <kde-bindings at kde.org>
> *Sent:* Friday, May 25, 2012 12:38 AM
> *Subject:* Re: [Kde-bindings] [Qyoto] Casting QObjects
>
> Hi Dimitar,
>
> Thank you for your quick reply. Well, i take back what i said about 
> traditional casting in C#. Seems like this qt_rubberband object is 
> somewhat special (i don't have much experience in Qt). For instance, 
> following my example this line of code returns null: QObject 
> rubberBand = win.FindChild<QObject>("qt_rubberband");
>
> What i really find strange though, is that qt_rubberband is considered 
> to be only a QObject. Shouldn't it be a QRubberBand (which is a 
> QWidget...)?
>
> Regards
>
> PS: I take this opportunity to thank you (and also Steven Boswell 
> regarding building Qyoto in Windows) for making Qt available to 
> csharpers.
>
> Em 24-05-2012 21:42, Dimitar Dobrev escreveu:
>> Hi, Mach,
>>
>> On my machine your sample behaves the same way with the addition that 
>> traditional casting (that is, replacing
>> QWidget widget = (QWidget) child.MetaObject().Cast(child);
>>
>> with
>>
>> QWidget widget = (QWidget) child;
>>
>> work as well). Apparently There is a bug in the IsWidgetType function 
>> because it allows the "qt_rubberband" which the debugger shows as a 
>> QObject only, to pass. However, "if (child is QWidget)" works 
>> properly so you can use that.
>>
>> ------------------------------------------------------------------------
>> *From:* Mach <metator.pt at gmail.com> <mailto:metator.pt at gmail.com>
>> *To:* Kde-bindings at kde.org <mailto:Kde-bindings at kde.org>
>> *Sent:* Thursday, May 24, 2012 10:54 PM
>> *Subject:* [Kde-bindings] [Qyoto] Casting QObjects
>>
>> Hi all,
>>
>> I've managed to compile qyoto on windows and now i'm doing some test 
>> applications to try it out. I'm having trouble trying to downcast 
>> QObjects. Traditional casting in C# does not work, but i was 
>> expecting that. So i started to look for something that could perform 
>> a cast and found the method Cast(QObject) in QMetaObject but it's not 
>> working always. Below is an example application that tries to cast 
>> all the children of the main window to widgets. Notice that i 
>> previously check if the object is a widget type:
>>
>> using System;
>> using Qyoto;
>>
>> namespace QtTest {
>>     class Program {
>>         [STAThread]
>>         static void Main(string[] args) {
>>             QApplication app = new QApplication(args);
>>             QMainWindow win = new QMainWindow();
>>             QPushButton btn = new QPushButton(win);
>>             win.WindowTitle = "Demo Application";
>>             win.Show();
>>             foreach (QObject child in win.Children()) {
>>                 if (child.IsWidgetType()) {
>>                     try {
>>                         QWidget widget = (QWidget) 
>> child.MetaObject().Cast(child);
>>                         Console.WriteLine("Cast succeeded. It's now a 
>> " + widget.GetType().Name);
>>                     } catch (InvalidCastException e) {
>>                         Console.WriteLine(child.ObjectName + " of 
>> type " + child.MetaObject().ClassName() +
>>                                           " cannot be cast to QWidget");
>>                     }
>>                 }
>>             }
>>             QApplication.Exec();
>>         }
>>     }
>> }
>>
>> The output on the console is:
>>
>> qt_rubberband of type QRubberBand cannot be cast to QWidget
>> Cast succeeded. It's now a QPushButton
>>
>> I suspect this has something to do with the fact that qt_rubberband 
>> was created on the unmanaged side, whereas QPushButton was created by 
>> the managed side. I also tried calling 
>> QWidget.StaticMetaObject.Cast(QObject) but it's always returning null.
>>
>> Can someone help me out solving this problem?
>>
>> Thanks in advance. Regards
>>
>>
>> _______________________________________________
>> Kde-bindings mailing list
>> Kde-bindings at kde.org <mailto:Kde-bindings at kde.org>
>> https://mail.kde.org/mailman/listinfo/kde-bindings
>>
>>
>>
>>
>> _______________________________________________
>> Kde-bindings mailing list
>> Kde-bindings at kde.org  <mailto:Kde-bindings at kde.org>
>> https://mail.kde.org/mailman/listinfo/kde-bindings
>
>
>
>
>
>
>
> _______________________________________________
> Kde-bindings mailing list
> Kde-bindings at kde.org
> https://mail.kde.org/mailman/listinfo/kde-bindings

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/kde-bindings/attachments/20120524/3fdeb3c5/attachment-0001.html>


More information about the Kde-bindings mailing list