[Mono-list] Re: Qt C# bindings and a simple HelloWorld

Richard Dale Richard_Dale@tipitina.demon.co.uk
Tue, 5 Feb 2002 10:25:08 +0000


On Tuesday 05 February 2002 2:04 am, Adam Treat wrote:
> So I've been mucking about for a bit with some c-sharp bindings to the
> qt-toolkit.  I've been successful with a generic helloworld program.  I
> think I am ready to begin generating some bindings in earnest after a few
> problems are solved:
>
> 1.  Not sure how to handle Slots and Signals.  (biggest problem) ;)
You need some kind of reflection/runtime metadata to do this - it has to be 
possible to query whether an instance implements a method/slot, and if so to 
call it. Then you need two C++ proxy classes to handle emitting signals and 
calling slots - eg CSSignal and CSSlot. 

> 2.  I have been using the qtc bindings from kde3 in the pinvoke statements.
> I would like to stop using the libqtc library and just dllimport from libqt
> but the name mangling (see
> http://www.delorie.com/gnu/docs/gcc/gxxint_15.html) is going to have to be
> accounted for.  Thinking about writing a tool that will automatically
> mangle the dllimport statement.  ie:
>
> 	From:
> 	[DllImport("libqtc.so.1.0.0")]
> 	public static extern Object qt_new_QApplication(int argc, string[] argv);
>
> 	To:
> 	[DllImport("libqt.so.2")]
> 	public static extern Object __12QApplicationRiPPc(int argc, string[]
> argv);
This would be a similar problem to deriving the JNI function names for java, 
in the kalyptus tool. See the perl function cplusplusToJNISignature() in 
kalyptus/kalyptusCxxToJava.pm.

> 3.  I don't know how to use kalyptus (don't know perl) and I am a frankly
> little frightened to go in that direction...  Thinking about using the kdoc
> html output and generating the bindings from that, similar to what the
> intel guys did with the ECMA documentation to c# stubs...  Richard, Miguel,
> Mike do you have some suggestions on the best way to proceed?
kalyptus is derived from kdoc - I started by hacking the html output exactly 
as you describe. It uses the same parser down to the method level, but adds 
argument level parsing and a 'typemap' to map Qt C++ data types onto C ones 
(and then from C types onto any other language type system).

> Well tell me what you think.
C# is so similar to Java that it shouldn't be a problem - I had to look twice 
at the example below to spot the difference! I would copy 
kalyptusCxxToJava.pm to kalyptusCxxToCS.pm, add a '-fcs' option to kalyptus 
and start hacking..

>
> P.S.  I am primarly a java programmer, with little experience in qt, c++,
> or c.  This is an exercise to hopefully do something useful and allow me to
> learn a little so feel free to offer up some pointers ;)
If you start by adapting the QtJava bindings, rather than starting from 
scratch it shouldn't be so hard. Mostly you have to write a lot of conversion 
functions to convert between C# string, collections, dates etc and the C++ 
equivalents. Have a look at these source files in QtJava - pretty much 
everything else is 'autogenerated' - it will give you an idea of how much 
work is involved.

JavaSlot.cpp
JavaSlot.h
        C++ proxies for Java signals and slots

QtSupport.cpp
QtSupport.h
        C++ static methods for running the library in conjunction with 
'qtjava.java'

qtjava.java
        A Java class with static methods for running the library, and to keep 
track of C++ -> Java instance mapping.

qtjava.cpp
        Some native code methods to help the 'run the library' Java class 
'qtjava.java'

Invocation.java
        Utility class containing methods to invoke Qt event handlers and slots

-- Richard


> // qt_HelloWorld.cs - qt-csharp Hello World
>
> namespace QtSamples {
>
> 	using Qt;
> 	using System;
>
> 	public class qt_HelloWorld {
>
> 		public static int Main (string[] args)
> 		{
>
> 			QApplication a = new QApplication(args);
> 			QPushButton hello = new QPushButton("Hello world!", 0);
> 			hello.resize(100, 30);
> 			a.setMainWidget(hello);
> 			hello.show();
> 			return a.exec();
>
> 		}
> 	}
> }