From Lazarus wiki
Revision as of 16:19, 24 March 2012 by Vincent (talk | contribs) (Text replace - "delphi>" to "syntaxhighlight>")

This is my page ? ;) Hi I'm Zeljan Rikalo (everybody calls me Zeljko), currently trying to finish qt4 interface for lazarus. Any feedback about qt-lcl from linux,win32 or mac is welcome (patches also). All about Qt interface you can find at

NEWS (dd.MM.yyyy)

  • 18.12.2011 - finnaly built qt 64bit (cocoa) lazarus on MacOSX, detailed explanation is here
  • 05.11.2011 - MDI support is added to laz trunk ... qt mdi is fully implemented.
  • 21.11.2010 there are known problems with qt-4.7.XX (lazarus and qt based apps crashes).Seem that our bindings need -mstackrealign.
  • 29.09.2009 as of lazarus r 21913 qt-4.5.XX is default , minimum bindings version is 1.72. No more USE_QT_XX defines
  • 18.09.2008 Trolltech released qt-4.4.2. Changes:
Fixed many bugs & regressions.
  • 31.08.2008 I'm testing 4.4.X for about two weeks (4.4.2 snapshots currently - 4.4.1 have some nasty bugs).
It looks much better than 4.3.XX - no flickering, faster, fixed some ugly QPainter bugs, fixed event queue bug 
(now I reverted QEventFocusIn & QEventFocusOut into my local svn copy (svn r. 14361)). 
Lazarus IDE feels much better with 4.4.X than with 4.3.X.
There's no special changes for 4.4, only r.14361 is out of game.
Fixes for QCoreApplication events, QComboBox crash fixed ...
QPainter supports justified text in overloaded QPainter::drawText() 
Fixes for QMainWindow, QMdiArea, QMdiSubWindow.
Fixes QPixmap bug with scaling & shifting by half a pixel.
Fixes for QFileDialog, QListView, QTreeView etc ....
Looks like a nice update.

My TODO list

  • Try to write an MDI "emulator" at LCL site based on TScrollView and TForm (mdiChild is real form embedded into TScrollView and custom painted title bar).With this emulator we'll get mdi support for all ws.

Current status: Trivial MDI Emulator works fine on all widgetsets I can test: gtk2, carbon, win32, qt.

Working features:

  • MDI viewport (TScrollBox)
  • MDI window.
  • Minimize, Restore, Maximize, Move works.
  • Tab order inside each MDI window belongs to itself.
  • Reordering of minimized MDI children when minimized MDI child is closed.

Missing features to implement:

  • resizing of MDI window by mouse (in progress).
  • when many MDI's minimized, and one of them restored, maximized or closed, reorder other minimized mdi's (in progress).
  • cascade, tile ops.
  • add missing code to TCustomForm (mainly reparent to MDI viewport when form created) and to interfaces.
  • implement win32 native MDI's


  • add MDI menu (when MDI window maximized).
  • fix bugs ? ;)


KNOWN BUGS IN QT-4.5.3 - (visible in LCLQt)

  1. Plastique,Cleanlooks style - combobox, checkbox doesn't show focus rect when focused by pressing ENTER and SelectNext(ActiveControl, True, True) from another control (TAB KEY WORKS OK) - have patch for Qt. fixed as of qt-4.6.0
  2. WindowsXP style - checkbox doesn't show focus rect for same reason as Plastique checkbox. - have patch for Qt.
  3. QStatusBar - size grip & last item isn't visible (if we have few items) if our main window started as wsMaximized. Issue submitted to Qt fixed with qt >= 4.6.2.


  • Add next classes: QDesktopServices (Felipe asked), QTextBlock, QTextBlockFormat, QTextFormat, QTextLayout, QTextLine, QShortcut, QGesture, QGestureEvent, QGestureRecognizer, QPanGesture, QPinchGesture, QTapAndHoldGesture, QTapGesture, QSwipeGesture, QTouchEvent, QStylePainter (have some convinience functions for styled painting, also QStylePainter is initialized from widget).
  • Maybe add OpenGL (QGLxxxx classes), but only if it can be separated in different unit and different C bindings, so loaded only on demand (for lazarus TOpenGLControl). See .
  • Maemo bindings - support for Maemo platform.
  • QGraphics*** - check what's missing for complete painting and use of QGraphicsItems.

Painting of qt controls with HasPaint=FALSE inside qtlcl

  • procedure SlotPaint() should be function SlotPaint() with Result from paint message eg. Result := Msg.Result <> 0;

That says that qt will not paint that control (event filter resulted with True result).This works as expected, but not sure about impact on qt or bindings when setting result to true in such way - must test it.

  • This is example of overrided TQtLineEdit.EventFilter.Don't forget to change SlotPaint() into function

and add Result := Msg.Result <> 0; after you process paint event.

function TQtLineEdit.EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl;
  Result := False;
  if LCLObject = nil then
  // TQtLineEdit have HasPaint := False, so only qt draws it
  // but we can do whatever here
  if (QEvent_type(Event) = QEventPaint) then
    // eg. this makes default qt paint of our control
    // after this call we can do something more inside our SlotPaint
    // and set result to true.
    // As a result we have native control on screen with eg.small red triangle in
    // controls corner which we painted after control was painted by qt.
    // If we don't set Result to true in this case, our control will be
    // repainted by qt again ,and we wan't see small red triangle in corner
    // of our control.
    // if SomeFlagOnOurControl then
    // begin
    //   QObject_event(Widget, Event);
    //   SlotPaint(Sender, Event)
    //   Result := True;
    // end else
    // begin
    // In this case: if result of SlotPaint is false - qt draws control, otherwise
    // we already done that.
    Result := SlotPaint(Sender, Event);
    QEvent_setAccepted(Event, not Result);
    // end
  end else
    Result:=inherited EventFilter(Sender, Event);