FPC and Qt
There are a number of Qt bindings available:
The first one aims on linux/unix users while the second one is for win32.
The FPC arm port and this Qt/E binding allow graphical programming on devices such as the Zaurus
How it works
FPC still can't use C++ classes natively so these interface units use the same scheme as e.g. the official C interface to Qt does: there are wrapper procedures written which export an procedural interface. This procedural interface is wrapped by an object pascal interface again to make usage easier.
This might sound like an huge overhead but these wrapper are mainly necessary to hide name mangling differences so there shouldn't be a noticable speed decrease in real world applications.
This piece of code is taken from the second package mentioned above.
var app: QApplicationH; btn: QPushButtonH; begin // create static ( interfaced handled ) QApplicationH app := NewQApplicationH(ArgCount, ArgValues).get; // due to a bug in fpc 1.9.5 the WideString helper methods with default parameter are disabled //btn := NewQPushButtonH('Quit', nil).get; btn := NewQPushButtonH(qs('Quit').get, nil, nil).get; btn.setGeometry(100, 100, 300, 300); btn.show; // override the virtual eventFilter method of btn btn.OverrideHook.eventFilter := @TTest.MyEventFilter; // and install the btn as it's own eventFilter btn.installEventFilter(btn); // connect Qt signal to Qt slot QObjectH.connect(btn, SIGNAL('clicked()'), app, SLOT('quit()')); ...
If you know Qt used in C++, you can see that there is not much difference.