1. qt-light
    1. Introduction
    2. Installation
      1. Windows
    3. Classes
    4. General
      1. qt:init
      2. qt:run
    5. Widgets
      1. qt:widget
      2. qt:delete
      3. qt:show
      4. qt:hide
      5. qt:find
      6. qt:pixmap
      7. qt:update
    6. Properties
      1. qt:property
    7. Signals and receivers
      1. qt:receiver
      2. qt:connect
    8. Timers
      1. qt:timer
      2. qt:start
      3. qt:stop
    9. Lists
      1. qt:clear
      2. qt:add
      3. qt:item
      4. qt:set-headers
    10. Text edit widgets
      1. qt:selection
      2. qt:insert
    11. Dialogs
      1. qt:message
    12. Sound
      1. qt:sound
      2. qt:play
      3. qt:stop
    13. Global keyboard shortcuts
      1. qt:shortcut
      2. qt:add-action
      3. qt:remove-action
    14. Miscellaneous
      1. qt:char-encoding
      2. qt:gl
      3. qt:classname
    15. Example
    16. History
    17. License

qt-light

Introduction

This extension provides a lightweight and relatively easy to use interface to Trolltech's Qt 4 GUI toolkit. It has currently only been tested on Linux and Windows.

Memory management is completely manual (with the exception of child widgets, which are deleted when their parent is). To release the resources of a widget or other Qt objects, call qt:delete.

This Qt binding is necessarily incomplete (since it is intended to be lightweight). If you miss certain functionality like widget-specific operations, contact the author.

For a more complete interface to Qt, see the qt extension, which is currently under development and planned to contain much more functionality.

Installation

The QTDIR environment variable must be set to the installation directory of Qt, like this:

QTDIR=/usr/local/Trolltech/Qt-4.2.0 chicken-install qt-light

If you instaled Qt on a debian-based system, setting QTDIR is not strictly necessary, as some default locations will be tried.

Windows

This extension has been tested with the binary distribution of Qt, based on the mingw compiler included in the Qt distribution. It is recommended to use a custom build of CHICKEN that uses this particular gcc version and which is installed directly in the Qt installation directory. So assuming Qt is installed in `c:\Qt\2010.01`, do the following:

 <obtain chicken sources, and cd to that directory>
 
 c:\tmp\chicken> mingw32-make PREFIX=c:/Qt/2010.01 PLATFORM=mingw
 c:\tmp\chicken> mingw32-make PREFIX=c:/Qt/2010.01 PLATFORM=mingw install
 c:\tmp\chicken> chicken-install qt-light

Classes

The following protobj classes are exposed:

<qt>
 <qt-object>
  <at-application>
  <qt-widget>
   <qt-text-edit>
  <qt-receiver>
  <qt-timer>
  <qt-sound>
 <qt-pixmap>
 <qt-action>

General

qt:init

[procedure] (qt:init)

Initializes Qt (including any command-line processing) and returns the application object, an instance of <qt-application>. Performs an implicit

(qt:connect <application> "lastWindowClosed()" <application> "quit()")

qt:run

[procedure] (qt:run [ONCE])

Runs the Qt event loop. If ONCE is given and true, then the procedure returns once all pending events have been processed (use (qt:run #t) in a loop when you want to do some custom idle processing, for example).

Widgets

qt:widget

[procedure] (qt:widget UIXML [PARENT])

Parses the UI description in the string UIXML, which should be the XML representation of a user interface created by the Qt designer application. Returns an instance of <qt-widget>, the toplevel widget. If PARENT is given, the newly created widget will be a child of this.

qt:delete

[procedure] (qt:delete OBJECT)

Deletes OBJECT, which should be an instance of <qt-object> or <qt-pixmap>.

qt:show

[procedure] (qt:show WIDGET)

Shows the given widget.

qt:hide

[procedure] (qt:hide WIDGET)

Hides the widget from view.

qt:find

[procedure] (qt:find WIDGET NAME)

Returns the direct or indirect child widget of WIDGET named NAME (a string) or #f if no such child widget could be found.

qt:pixmap

[procedure] (qt:pixmap FILENAME)

Loads an image file and returns an instance of <qt-image>.

qt:update

[procedure] (qt:update WIDGET)

Schedules a repaint event for the given widget.

Properties

qt:property

[procedure] (qt:property WIDGET PROP)
 (set! (qt:property WIDGET PROP) VALUE)

Get or set a widget property with the name PROP (a string or symbol). See the Qt documentation for more information about which widget supports which properties. Value conversion is automatically, the following value types are supported:

Property (C++) type    Scheme type
QString                string
int                    integer
double                 number
bool                   boolean
char                   char
QPixmap                <qt-image>
Point                  s32vector
Size                   s32vector
Rect                   s32vector
PointF                 f64vector
SizeF                  f64vector
RectF                  f64vector

Signals and receivers

qt:receiver

[procedure] (qt:receiver THUNK)

Returns an instance of <qt-receiver> that when connected to a Qt signal will invoke PROC once the signal is emitted.

qt:connect

[procedure] (qt:connect SOURCE SIGNAL DESTINATION [SLOT])

Connects the signal SIGNAL from the <qt-object> SOURCE to the slot SLOT from DESTINATION. If no slot is given, then "slot()" is assumed (which is the only slot implemented in <qt-receiver> instances). Signals and slots should be strings and follow the normal syntax used by Qt.

Timers

qt:timer

[procedure] (qt:timer SECONDS)

Creates and returns a timer object which can be connected to a receiver and which will emit "timeout()" signals every SECONDS.

qt:start

[procedure] (qt:start TIMER)

Starts the given timer.

qt:stop

[procedure] (qt:stop TIMER)

Stops the given timer.

Lists

qt:clear

[procedure] (qt:clear WIDGET)

Clears all entries from WIDGET which should be a QListWidget.

qt:add

[procedure] (qt:add WIDGET STRING)

Adds a new entry to a QListWidget, QComboBox or QTreeWidget. In the latter case, the columns should be separated by the | character (vertical bar).

qt:item

[procedure] (qt:item WIDGET INDEX)

Returns the text of the QListWidget item with the given index.

qt:set-headers

[procedure] (qt:set-headers WIDGET STRING)

Sets the column headers in a QTreeWidget. Columns should be separated by the | character (vertical bar).

Text edit widgets

qt:selection

[procedure] (qt:selection TEXTEDIT)

Returns the text of the currently active selection, or the empty string, if no text is selected.

qt:insert

[procedure] (qt:insert TEXTEDIT STRING)

Inserts STRING at the current cursor location.

Dialogs

qt:message

[procedure] (qt:message TEXT #!key caption parent button1 button2 button3)

Opens a QMessageBox with the given properties and returns the index of the pressed button.

[procedure] (qt:get-open-filename CAPTION DIRECTORY #!key parent options filter)

Shows a modal file-selection dialog and returns the selected filename (or "", if the dialog was canceled). options should be a list with zero or more of the following keywords:

show-dirs-only:
dont-resolve-symlinks:
dont-confirm-overwrites:
dont-use-sheet:
dont-use-native-dialog:
[procedure] (qt:get-save-filename CAPTION DIRECTORY #!key parent options filter)

Shows a modal file-selection for saving.

[procedure] (qt:get-directory CAPTION DIRECTORY #!key parent options filter)

Shows a modal directory-selection dialog.

Sound

qt:sound

[procedure] (qt:sound FILENAME)

Loads a sound-file and returns an instance of <qt-sound>.

qt:play

[procedure] (qt:play SOUND)

Plays the sound asynchronously.

qt:stop

[procedure] (qt:stop SOUND)

Stops a currently playing sound.

Global keyboard shortcuts

qt:shortcut

[procedure] (qt:shortcut KEY)

Creates a keyboard-shortcut action for KEY, which should be a string naming a key-sequence, for example "Ctrl+E". See the Qt documentation for the interpretation of this string. qt:shortcut returns an <qt-action> instance that can be added to a widget with qt:add-action.

qt:add-action

[procedure] (qt:add-action WIDGET ACTION)

Adds the given action to WIDGET.

qt:remove-action

[procedure] (qt:remove-action WIDGET ACTION)

Removes ACTION from WIDGET.

Miscellaneous

qt:char-encoding

[procedure] (qt:char-encoding [ENCODING])

Selects the default character encoding for strings passed to and received from Qt. ENCODING may be one of the symbols ascii, latin1 or utf8. The default is latin1. If no argument is given, then qt:char-encoding returns the current encoding.

qt:gl

[procedure] (qt:gl NAME PARENT INIT RESIZE PAINT)

Creates and returns a QGLWidget. INIT should be zero-argument procedure called to initialize the OpenGL context. RESIZE should be a two-argument procedure called when the widget is resized and receives the new width and height. PAINT is a zero-argument procedure called when the widget should repaint itself. GL output will be automatically flushed.

qt:classname

[procedure] (qt:classname OBJECT)

Returns the name of the Qt class of which OBJECT is an instance.

Example

Given the file hello.ui:

<ui version="4.0" >
 <class>Form</class>
 <widget class="QWidget" name="Form" >
  <property name="geometry" >
   <rect>
    <x>0</x>
    <y>0</y>
    <width>295</width>
    <height>144</height>
   </rect>
  </property>
  <property name="windowTitle" >
   <string/>
  </property>
  <widget class="QLabel" name="label" >
   <property name="geometry" >
    <rect>
     <x>40</x>
     <y>30</y>
     <width>121</width>
     <height>31</height>
    </rect>
   </property>
   <property name="font" >
    <font>
     <pointsize>15</pointsize>
     <weight>75</weight>
     <bold>true</bold>
    </font>
   </property>
   <property name="text" >
    <string>Hello, world!</string>
   </property>
   <property name="alignment" >
    <set>Qt::AlignCenter</set>
   </property>
  </widget>
  <widget class="QPushButton" name="quitButton" >
   <property name="geometry" >
    <rect>
     <x>180</x>
     <y>90</y>
     <width>75</width>
     <height>31</height>
    </rect>
   </property>
   <property name="text" >
    <string>Quit</string>
   </property>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

Run this to display the Window:

(use qt-light utils)
(define a (qt:init))
(define w (qt:widget (read-all "hello.ui")))
(qt:connect (qt:find w "quitButton") "clicked()" a "quit()")
(qt:show w)
(qt:run)

A more interesting example can be found here: egg-browser.zip.

History

0.97
fix for qt:stop with timers (thanks to ewfalor)
0.96
added include-path option to C++ build for CHICKEN 4.6.4
0.95
.setup script fixes
0.94
renamed this extension to qt-light, more build-fixes (this time for Windows)
0.93
(hopefully) fixed more build problems (thanks to Mario)
0.9
fixed Linux build problems and added qt:char-encoding
0.8
I forgot what I did for 0.8
0.7
added support for Windows
0.6
qt.pro is generated by setup script to force usage of correct csc (thanks to Mario Goulart)
0.5
fixed bug in string-result handling that caused random crashes (reported by Christian Kellermann and Mario Domenench Goulart)
0.4
ported to CHICKEN 4, removed Mac OS X support
0.3
generated application bundle on Mac OS X
0.2
added file dialogs and QSound support, fixed bug by making qt:show "safe"
0.1
initial release

License

Copyright (c) 2006-2011, Felix L. Winkelmann
All rights reserved.

Redistribution and use in source and binary forms, with or
without modification, are permitted provided that the following
conditions are met:

Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.

Neither the name of the author nor the names of its contributors
may be used to endorse or promote products derived from this
software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
THE POSSIBILITY OF SUCH DAMAGE.