No description
  • Scheme 82.4%
  • Shell 7.6%
  • C 6.2%
  • Makefile 2.7%
  • C++ 1%
Find a file
2026-07-30 15:47:06 -06:00
.builds ci: set umask 022 in package/verify tasks too (jerbuild creates group-writable cache dirs during pkg operations) 2026-07-22 13:10:57 -06:00
.jerboa Security hardening and release readiness 2026-06-23 10:50:56 -06:00
docs Resolve security audit findings 2026-07-11 17:22:32 -06:00
examples Resolve security audit findings 2026-07-11 17:22:32 -06:00
scripts fix(P1 #35b): cache Qt shim ABI validation as a one-shot fast path 2026-07-21 20:10:12 -06:00
src/jerboa-qt Expose Qt mouse press callbacks 2026-07-30 14:45:05 -06:00
support Resolve security audit findings 2026-07-11 17:22:32 -06:00
tests fix(P1 #35b): cache Qt shim ABI validation as a one-shot fast path 2026-07-21 20:10:12 -06:00
.gitignore build: remove tracked generated .sls files and ignore them 2026-07-24 11:43:56 -06:00
AGENTS.md docs: remove jerboa-emacs restriction 2026-07-30 15:47:06 -06:00
callback_queue.c Resolve security audit findings 2026-07-11 17:22:32 -06:00
callback_queue.h Resolve security audit findings 2026-07-11 17:22:32 -06:00
compile-libs.ss Security hardening and release readiness 2026-06-23 10:50:56 -06:00
jerboa_qt_lifecycle.cpp fix: non-blocking notify, NUL-separated process args, NULL string guards, watch TOCTOU, app-exec return 2026-07-21 10:43:23 -06:00
jerboa_qt_shim.c Expose Qt mouse press callbacks 2026-07-30 14:45:05 -06:00
jpkg.sexp Add jpkg packaging 2026-07-21 15:09:25 -06:00
LICENSE Switch to MIT license 2026-07-21 13:42:19 -06:00
Makefile fix(P1 #35a): mark blocking Qt FFI entries __collect_safe 2026-07-21 20:07:10 -06:00
qt-test.ss fix(P1 #35b): cache Qt shim ABI validation as a one-shot fast path 2026-07-21 20:10:12 -06:00
README.md Resolve security audit findings 2026-07-11 17:22:32 -06:00
SECURITY.md Resolve security audit findings 2026-07-11 17:22:32 -06:00

jerboa-qt

Qt6 Widgets bindings for Jerboa Scheme.

Build desktop GUI applications with native Qt6 widgets from Jerboa, using a thin C++ shim and Chez's FFI underneath. API-compatible with qt-vendor at the high-level qt-* API layer.

Requirements

  • Jerboa with jerbuild on PATH
  • Qt6 development libraries
  • C compiler
  • A Qt shim provider. The Makefile first looks for $HOME/mine/qt-vendor/vendor, then falls back to $HOME/mine/jerboa-emacs.

Linux (Ubuntu/Debian)

sudo apt install qt6-base-dev libgl1-mesa-dev chezscheme

Linux (Fedora)

sudo dnf install qt6-qtbase-devel chez-scheme

macOS (Homebrew)

brew install qt@6 chezscheme
export PKG_CONFIG_PATH="$(brew --prefix qt@6)/lib/pkgconfig:$PKG_CONFIG_PATH"

Build

First, clone and build qt-vendor to get the C++ shim:

git clone https://github.com/ober/qt-vendor.git
cd qt-vendor
make build
cd ..

Then build jerboa-qt:

cd jerboa-qt
make

By default, the Makefile uses $HOME/mine/qt-vendor/vendor when present and otherwise falls back to $HOME/mine/jerboa-emacs. Override with:

make QT_SHIM_INCLUDE_DIR=/path/to/include QT_SHIM_LIB_DIR=/path/to/lib

This transpiles the Jerboa modules under lib/ and builds the callback bridge (jerboa_qt_shim.dylib on macOS, jerboa_qt_shim.so elsewhere).

Test

make test

make test runs pure import and validation checks that do not require native Qt libraries.

Hosted native tests and native dependency inspection are separate gates:

make test-native
make audit
make security
make target-evidence
make qt-shim-provenance-enforce
make qt-advisory-enforce

Native tests run headless using Qt's offscreen platform plugin (QT_QPA_PLATFORM=offscreen).

Security

jerboa-qt is experimental until the production gates in SECURITY.md, docs/ffi-boundary.md, docs/shim-provenance.md, docs/qt-advisory-review.md, and docs/threat-model.md are complete.

The Scheme modules are designed to import without loading native Qt libraries. Native libraries are resolved lazily on first FFI use, but dynamic loading requires canonical absolute JERBOA_QT_SHIM_DIR and JERBOA_QT_LIB directories whose final library files are regular non-symlinks. Static builds are detected from pre-registered representative symbols. Scheme strings with embedded NUL bytes are rejected before native calls.

Qt's native thread never enters Chez. Signal values are copied into a bounded native queue and qt-app-exec! or qt-pump-events! drains that queue on the thread that created the application. Callback registration, removal, and execution from any other Jerboa thread are rejected.

make release-evidence records pure/native tests, native-boundary corpus evidence, native linkage, Qt advisory status, external shim provenance, sanitized target evidence, SBOM manifests, and hash-only reproducibility output under dist/release-evidence/. make target-evidence fails closed when JQT_REQUIRE_TARGET_PROOF=1 is set without a marker-complete JQT_TARGET_PROOF_FILE; overlarge, host-private, or high-confidence secret proof files are rejected before copying.

Usage

(import (jerboa-qt qt))

(define (main)
  (with-qt-app app
    (let* ((win (qt-main-window-create))
           (central (qt-widget-create))
           (layout (qt-vbox-layout-create central))
           (label (qt-label-create "Count: 0"))
           (button (qt-push-button-create "Click me!"))
           (count 0))
      (qt-layout-add-widget! layout label)
      (qt-layout-add-widget! layout button)
      (qt-on-clicked! button
        (lambda ()
          (set! count (+ count 1))
          (qt-label-set-text! label
            (string-append "Count: " (number->string count)))))
      (qt-main-window-set-central-widget! win central)
      (qt-main-window-set-title! win "Counter")
      (qt-widget-resize! win 300 200)
      (qt-widget-show! win)
      (qt-app-exec! app))))

(main)

Running Examples

All examples are self-contained executables with shebangs. Just run them directly from anywhere:

./examples/hello.ss
./examples/counter.ss
./examples/form.ss
./examples/editor.ss
./examples/dashboard.ss

The shebang automatically resolves library paths relative to the script location, so examples work from any working directory:

cd /tmp
/path/to/jerboa-qt/examples/hello.ss

Run headless (no display required):

QT_QPA_PLATFORM=offscreen ./examples/hello.ss

Or invoke manually without the shebang:

JH="$(jerbuild --jerboa-home)"
JERBOA_QT_DEV_NATIVE=1 \
JERBOA_QT_LIB="$PWD" \
JERBOA_QT_SHIM_DIR="${JERBOA_QT_SHIM_DIR:-$HOME/mine/jerboa-emacs}" \
QT_QPA_PLATFORM=offscreen \
jerbuild exec --libdirs "lib:$JH/lib" examples/hello.ss

Using from the REPL

From the jerboa-qt directory:

> (import (jerboa-qt qt))
> (define app (qt-app-create))
> (define win (qt-main-window-create))
> (qt-main-window-set-title! win "REPL Window")
> (qt-widget-resize! win 400 300)
> (qt-widget-show! win)
> (qt-app-exec! app)

Differences from qt-vendor

Aspect qt-vendor jerboa-qt
Import (import :qt-vendor/qt) (import (jerboa-qt qt))
Define (def (name args) ...) (define (name args) ...)
Main (def (main) ...) in build target (define (main) ...) (main) at end of script
Keyword args parent: #f Not supported; positional or omitted
Build other-Scheme build make
Run examples make demo-hello ./examples/hello.ss
FFI mechanism Gambit c-define (compile-time) Chez foreign-callable (runtime)

The high-level API (qt-* functions) is identical between both projects. Code that uses only the (jerboa-qt qt) / :qt-vendor/qt API can be ported by changing the import line and using define instead of def.

API Reference

Application Lifecycle

Function Description
(qt-app-create) Create QApplication
(qt-app-exec! app) Run the event loop
(qt-app-quit! app) Quit the event loop
(qt-app-destroy! app) Destroy application
(with-qt-app app body ...) Macro: create app, run body, destroy on exit

Widget Base

All widget types support these operations:

Function Description
(qt-widget-create) Create a generic widget
(qt-widget-show! w) Show widget
(qt-widget-hide! w) Hide widget
(qt-widget-close! w) Close widget
(qt-widget-set-enabled! w bool) Enable/disable
(qt-widget-enabled? w) Check if enabled
(qt-widget-set-visible! w bool) Set visibility
(qt-widget-visible? w) Check if visible
(qt-widget-resize! w width height) Resize
(qt-widget-set-fixed-size! w width height) Set fixed size
(qt-widget-set-minimum-size! w width height) Set minimum size
(qt-widget-set-maximum-size! w width height) Set maximum size
(qt-widget-set-minimum-width! w pixels) Set minimum width
(qt-widget-set-minimum-height! w pixels) Set minimum height
(qt-widget-set-maximum-width! w pixels) Set maximum width
(qt-widget-set-maximum-height! w pixels) Set maximum height
(qt-widget-set-cursor! w cursor) Set cursor shape (use QT_CURSOR_* constants)
(qt-widget-unset-cursor! w) Reset cursor to default
(qt-widget-set-style-sheet! w css) Apply CSS stylesheet
(qt-widget-set-tooltip! w text) Set tooltip text
(qt-widget-set-font-size! w size) Set font point size
(qt-widget-destroy! w) Destroy widget

Main Window

Function Description
(qt-main-window-create) Create main window
(qt-main-window-set-title! w title) Set window title
(qt-main-window-set-central-widget! w child) Set central widget

Layouts

Function Description
(qt-vbox-layout-create parent) Vertical box layout
(qt-hbox-layout-create parent) Horizontal box layout
(qt-layout-add-widget! layout widget) Add widget to layout
(qt-layout-add-stretch! layout) Add stretch spacer
(qt-layout-set-spacing! layout spacing) Set item spacing
(qt-layout-set-margins! layout l t r b) Set content margins
(qt-layout-add-spacing! layout pixels) Add fixed pixel spacing
(qt-layout-set-stretch-factor! layout widget stretch) Set relative stretch factor

Labels

Function Description
(qt-label-create text) Create label
(qt-label-text l) Get text
(qt-label-set-text! l text) Set text
(qt-label-set-alignment! l alignment) Set alignment (use QT_ALIGN_* constants)
(qt-label-set-word-wrap! l bool) Enable/disable word wrap

Push Button

Function Description
(qt-push-button-create text) Create button
(qt-push-button-text b) Get button text
(qt-push-button-set-text! b text) Set button text
(qt-on-clicked! button handler) Connect clicked signal: (lambda () ...)

Line Edit

Function Description
(qt-line-edit-create) Create single-line text input
(qt-line-edit-text e) Get text
(qt-line-edit-set-text! e text) Set text
(qt-line-edit-set-placeholder! e text) Set placeholder text
(qt-line-edit-set-read-only! e bool) Set read-only
(qt-line-edit-set-echo-mode! e mode) Set echo mode (use QT_ECHO_* constants)
(qt-on-text-changed! e handler) Connect textChanged: (lambda (text) ...)
(qt-on-return-pressed! e handler) Connect returnPressed: (lambda () ...)

Check Box

Function Description
(qt-check-box-create text) Create checkbox
(qt-check-box-checked? c) Is checked?
(qt-check-box-set-checked! c bool) Set checked state
(qt-check-box-set-text! c text) Set label text
(qt-on-toggled! c handler) Connect toggled: (lambda (checked?) ...)

Combo Box

Function Description
(qt-combo-box-create) Create dropdown
(qt-combo-box-add-item! c text) Add item
(qt-combo-box-set-current-index! c index) Set selection
(qt-combo-box-current-index c) Get selected index
(qt-combo-box-current-text c) Get selected text
(qt-combo-box-count c) Get item count
(qt-combo-box-clear! c) Remove all items
(qt-on-index-changed! c handler) Connect indexChanged: (lambda (index) ...)

Text Edit

Function Description
(qt-text-edit-create) Create multi-line text editor
(qt-text-edit-text e) Get plain text
(qt-text-edit-set-text! e text) Set text
(qt-text-edit-set-placeholder! e text) Set placeholder
(qt-text-edit-set-read-only! e bool) Set read-only
(qt-text-edit-append! e text) Append text
(qt-text-edit-clear! e) Clear all text
(qt-text-edit-scroll-to-bottom! e) Scroll to bottom
(qt-text-edit-html e) Get HTML content
(qt-on-text-edit-changed! e handler) Connect textChanged: (lambda () ...)

Spin Box

Function Description
(qt-spin-box-create) Create integer spinner
(qt-spin-box-value s) Get value
(qt-spin-box-set-value! s value) Set value
(qt-spin-box-set-range! s min max) Set min/max range
(qt-spin-box-set-single-step! s step) Set step increment
(qt-spin-box-set-prefix! s prefix) Set display prefix
(qt-spin-box-set-suffix! s suffix) Set display suffix
(qt-on-value-changed! s handler) Connect valueChanged: (lambda (value) ...)

Dialog

Function Description
(qt-dialog-create) Create dialog window
(qt-dialog-exec! d) Run modal dialog
(qt-dialog-accept! d) Accept and close
(qt-dialog-reject! d) Reject and close
(qt-dialog-set-title! d title) Set dialog title

Message Box

Function Description
(qt-message-box-information parent title text) Show info dialog
(qt-message-box-warning parent title text) Show warning dialog
(qt-message-box-question parent title text) Show yes/no dialog, returns boolean
(qt-message-box-critical parent title text) Show error dialog

Pass 0 for parent if none.

File Dialog

Function Description
(qt-file-dialog-open-file parent caption dir filter) Open file picker, returns path or ""
(qt-file-dialog-save-file parent caption dir filter) Save file picker, returns path or ""
(qt-file-dialog-open-directory parent caption dir) Directory picker, returns path or ""

Menu Bar

Function Description
(qt-main-window-menu-bar win) Get menu bar from main window

Menu

Function Description
(qt-menu-bar-add-menu bar title) Add menu to menu bar
(qt-menu-add-menu menu title) Add submenu
(qt-menu-add-action! menu action) Add action to menu
(qt-menu-add-separator! menu) Add separator

Action

Function Description
(qt-action-create text) Create action
(qt-action-text a) Get text
(qt-action-set-text! a text) Set text
(qt-action-set-shortcut! a key-sequence) Set keyboard shortcut (e.g. "Ctrl+S")
(qt-action-set-enabled! a bool) Enable/disable
(qt-action-enabled? a) Is enabled?
(qt-action-set-checkable! a bool) Make checkable
(qt-action-checkable? a) Is checkable?
(qt-action-set-checked! a bool) Set checked state
(qt-action-checked? a) Is checked?
(qt-action-set-tooltip! a text) Set tooltip
(qt-action-set-status-tip! a text) Set status bar tip
(qt-on-triggered! a handler) Connect triggered: (lambda () ...)
(qt-on-action-toggled! a handler) Connect toggled: (lambda (checked?) ...)

Toolbar

Function Description
(qt-toolbar-create title) Create toolbar
(qt-main-window-add-toolbar! win toolbar) Add toolbar to main window
(qt-toolbar-add-action! toolbar action) Add action to toolbar
(qt-toolbar-add-separator! toolbar) Add separator
(qt-toolbar-add-widget! toolbar widget) Add widget to toolbar
(qt-toolbar-set-movable! toolbar bool) Set movable
(qt-toolbar-set-icon-size! toolbar w h) Set icon size

Status Bar

Function Description
(qt-main-window-set-status-bar-text! win text) Set status bar message

Grid Layout

Function Description
(qt-grid-layout-create parent) Create grid layout
(qt-grid-layout-add-widget! grid widget row col) Add widget at position
(qt-grid-layout-set-row-stretch! grid row stretch) Set row stretch factor
(qt-grid-layout-set-column-stretch! grid col stretch) Set column stretch factor
(qt-grid-layout-set-row-minimum-height! grid row height) Set row minimum height
(qt-grid-layout-set-column-minimum-width! grid col width) Set column minimum width

Timer

Function Description
(qt-timer-create) Create timer
(qt-timer-start! t msec) Start with interval
(qt-timer-stop! t) Stop timer
(qt-timer-set-single-shot! t bool) Set single-shot mode
(qt-timer-active? t) Is running?
(qt-timer-interval t) Get interval
(qt-timer-set-interval! t msec) Set interval
(qt-on-timeout! t handler) Connect timeout: (lambda () ...)
(qt-timer-single-shot! msec handler) One-shot timer (static convenience)
(qt-timer-destroy! t) Destroy timer

Clipboard

Function Description
(qt-clipboard-text app) Get clipboard text
(qt-clipboard-set-text! app text) Set clipboard text
(qt-on-clipboard-changed! app handler) Connect dataChanged: (lambda () ...)

The clipboard is a singleton owned by QApplication -- never destroy it.

Tree Widget

Function Description
(qt-tree-widget-create) Create tree widget
(qt-tree-widget-set-column-count! t count) Set number of columns
(qt-tree-widget-column-count t) Get column count
(qt-tree-widget-set-header-label! t label) Set single header label
(qt-tree-widget-set-header-item-text! t col text) Set individual header text
(qt-tree-widget-add-top-level-item! t item) Add top-level item
(qt-tree-widget-top-level-item-count t) Count top-level items
(qt-tree-widget-top-level-item t index) Get top-level item by index
(qt-tree-widget-current-item t) Get selected item (or #f)
(qt-tree-widget-set-current-item! t item) Set selected item
(qt-tree-widget-expand-item! t item) Expand item
(qt-tree-widget-collapse-item! t item) Collapse item
(qt-tree-widget-expand-all! t) Expand all
(qt-tree-widget-collapse-all! t) Collapse all
(qt-tree-widget-clear! t) Remove all items
(qt-on-current-item-changed! t handler) (lambda () ...)
(qt-on-tree-item-double-clicked! t handler) (lambda () ...)
(qt-on-item-expanded! t handler) (lambda () ...)
(qt-on-item-collapsed! t handler) (lambda () ...)

Tree Widget Item

Function Description
(qt-tree-item-create text) Create tree item
(qt-tree-item-set-text! item col text) Set text at column
(qt-tree-item-text item col) Get text at column
(qt-tree-item-add-child! parent child) Add child item
(qt-tree-item-child-count item) Get child count
(qt-tree-item-child item index) Get child by index
(qt-tree-item-parent item) Get parent item
(qt-tree-item-set-expanded! item bool) Set expanded state
(qt-tree-item-expanded? item) Is expanded?

List Widget

Function Description
(qt-list-widget-create) Create list widget
(qt-list-widget-add-item! l text) Add item
(qt-list-widget-insert-item! l row text) Insert at position
(qt-list-widget-remove-item! l row) Remove by position
(qt-list-widget-current-row l) Get selected row
(qt-list-widget-set-current-row! l row) Set selected row
(qt-list-widget-item-text l row) Get item text
(qt-list-widget-count l) Get item count
(qt-list-widget-clear! l) Remove all items
(qt-list-widget-set-item-data! l row data) Set hidden data string
(qt-list-widget-item-data l row) Get hidden data string
(qt-on-current-row-changed! l handler) (lambda (row) ...)
(qt-on-item-double-clicked! l handler) (lambda (row) ...)

Table Widget

Function Description
(qt-table-widget-create rows cols) Create table widget
(qt-table-widget-set-item! t row col text) Set cell text
(qt-table-widget-item-text t row col) Get cell text
(qt-table-widget-set-horizontal-header! t col text) Set column header
(qt-table-widget-set-vertical-header! t row text) Set row header
(qt-table-widget-set-row-count! t count) Set row count
(qt-table-widget-set-column-count! t count) Set column count
(qt-table-widget-row-count t) Get row count
(qt-table-widget-column-count t) Get column count
(qt-table-widget-current-row t) Get current row
(qt-table-widget-current-column t) Get current column
(qt-table-widget-clear! t) Clear all cells
(qt-on-cell-clicked! t handler) (lambda () ...)

Tab Widget

Function Description
(qt-tab-widget-create) Create tab widget
(qt-tab-widget-add-tab! tw page title) Add tab page
(qt-tab-widget-set-current-index! tw index) Set active tab
(qt-tab-widget-current-index tw) Get active tab index
(qt-tab-widget-count tw) Get tab count
(qt-tab-widget-set-tab-text! tw index text) Change tab label
(qt-on-tab-changed! tw handler) (lambda (index) ...)

Progress Bar

Function Description
(qt-progress-bar-create) Create progress bar
(qt-progress-bar-set-value! p value) Set current value
(qt-progress-bar-value p) Get current value
(qt-progress-bar-set-range! p min max) Set value range
(qt-progress-bar-set-format! p fmt) Set display format (e.g. "%p%")

Slider

Function Description
(qt-slider-create orientation) Create slider (QT_HORIZONTAL / QT_VERTICAL)
(qt-slider-set-value! s value) Set value
(qt-slider-value s) Get value
(qt-slider-set-range! s min max) Set range
(qt-slider-set-single-step! s step) Set step
(qt-slider-set-tick-interval! s interval) Set tick spacing
(qt-slider-set-tick-position! s position) Set tick position (use QT_TICKS_* constants)
(qt-on-slider-value-changed! s handler) (lambda (value) ...)

Window State

Function Description
(qt-widget-show-minimized! w) Minimize
(qt-widget-show-maximized! w) Maximize
(qt-widget-show-fullscreen! w) Fullscreen
(qt-widget-show-normal! w) Normal
(qt-widget-window-state w) Get state constant
(qt-widget-move! w x y) Move window
(qt-widget-x w) Get X position
(qt-widget-y w) Get Y position
(qt-widget-width w) Get width
(qt-widget-height w) Get height
(qt-widget-set-focus! w) Set keyboard focus

App-wide Style Sheet

Function Description
(qt-app-set-style-sheet! app css) Apply CSS to entire application

Scroll Area

Function Description
(qt-scroll-area-create) Create scroll area
(qt-scroll-area-set-widget! sa widget) Set scrollable content
(qt-scroll-area-set-widget-resizable! sa bool) Allow content to resize
(qt-scroll-area-set-horizontal-scrollbar-policy! sa policy) Set horizontal scrollbar
(qt-scroll-area-set-vertical-scrollbar-policy! sa policy) Set vertical scrollbar

Splitter

Function Description
(qt-splitter-create orientation) Create splitter (QT_HORIZONTAL / QT_VERTICAL)
(qt-splitter-add-widget! sp widget) Add widget
(qt-splitter-insert-widget! sp index widget) Insert at position
(qt-splitter-count sp) Get widget count
(qt-splitter-set-handle-width! sp pixels) Set handle width
(qt-splitter-set-collapsible! sp index bool) Set collapsible
(qt-splitter-collapsible? sp index) Is collapsible?
(qt-splitter-set-orientation! sp orientation) Change orientation

Keyboard Events

Function Description
(qt-on-key-press! w handler) Key press: (lambda () ...), then query key info
(qt-on-key-press-consuming! w handler) Same but consumes the event
(qt-last-key-code) Get last key code (use QT_KEY_* constants)
(qt-last-key-modifiers) Get modifier flags (use QT_MOD_* constants)
(qt-last-key-text) Get key text

Pixmap

Function Description
(qt-pixmap-load path) Load image from file
(qt-pixmap-create-blank w h) Create blank pixmap
(qt-pixmap-width pm) Get width
(qt-pixmap-height pm) Get height
(qt-pixmap-null? pm) Is empty?
(qt-pixmap-scaled pm w h) Scale pixmap, returns new pixmap
(qt-pixmap-fill! pm r g b a) Fill with color
(qt-pixmap-destroy! pm) Destroy pixmap
(qt-label-set-pixmap! label pm) Display pixmap in label

Icon

Function Description
(qt-icon-create path) Create icon from file
(qt-icon-create-from-pixmap pm) Create icon from pixmap
(qt-icon-null? icon) Is empty?
(qt-icon-destroy! icon) Destroy icon
(qt-push-button-set-icon! button icon) Set button icon
(qt-action-set-icon! action icon) Set action icon
(qt-widget-set-window-icon! w icon) Set window icon

Radio Button

Function Description
(qt-radio-button-create text) Create radio button
(qt-radio-button-text r) Get text
(qt-radio-button-set-text! r text) Set text
(qt-radio-button-checked? r) Is checked?
(qt-radio-button-set-checked! r bool) Set checked state
(qt-on-radio-toggled! r handler) (lambda (checked?) ...)

Button Group

Function Description
(qt-button-group-create) Create button group
(qt-button-group-add-button! bg button id) Add button with ID
(qt-button-group-remove-button! bg button) Remove button
(qt-button-group-checked-id bg) Get checked button ID
(qt-button-group-set-exclusive! bg bool) Set exclusive mode
(qt-button-group-exclusive? bg) Is exclusive?
(qt-on-button-group-clicked! bg handler) (lambda (id) ...)
(qt-button-group-destroy! bg) Destroy group

Group Box

Function Description
(qt-group-box-create title) Create group box
(qt-group-box-title gb) Get title
(qt-group-box-set-title! gb title) Set title
(qt-group-box-set-checkable! gb bool) Make checkable
(qt-group-box-checkable? gb) Is checkable?
(qt-group-box-set-checked! gb bool) Set checked state
(qt-group-box-checked? gb) Is checked?
(qt-on-group-box-toggled! gb handler) (lambda (checked?) ...)

QFont

Function Description
(qt-font-create family point-size) Create font
(qt-font-family f) Get font family name
(qt-font-point-size f) Get point size
(qt-font-bold? f) Check if bold
(qt-font-set-bold! f bool) Set bold
(qt-font-italic? f) Check if italic
(qt-font-set-italic! f bool) Set italic
(qt-font-destroy! f) Destroy font
(qt-widget-set-font! w f) Set font on any widget
(qt-widget-font w) Get widget's font (new copy -- caller must destroy)

QColor

Function Description
(qt-color-create r g b a) Create from RGBA (0-255)
(qt-color-create-name name) Create from "#rrggbb" or named color
(qt-color-red c) Red channel
(qt-color-green c) Green channel
(qt-color-blue c) Blue channel
(qt-color-alpha c) Alpha channel
(qt-color-name c) Hex string "#rrggbb"
(qt-color-valid? c) Is color valid?
(qt-color-destroy! c) Destroy color

QFontDialog / QColorDialog

Function Description
(qt-font-dialog-get-font) Show font picker, returns QFont or #f
(qt-color-dialog-get-color) Show color picker, returns QColor or #f

Stacked Widget

Function Description
(qt-stacked-widget-create) Create stacked widget
(qt-stacked-widget-add-widget! sw widget) Add page
(qt-stacked-widget-set-current-index! sw index) Set visible page
(qt-stacked-widget-current-index sw) Get visible page index
(qt-stacked-widget-count sw) Get page count
(qt-on-stacked-current-changed! sw handler) (lambda (index) ...)

Dock Widget

Function Description
(qt-dock-widget-create title) Create dock widget
(qt-dock-widget-set-widget! dock widget) Set dock content
(qt-dock-widget-widget dock) Get dock content
(qt-dock-widget-set-title! dock title) Set dock title
(qt-dock-widget-title dock) Get dock title
(qt-dock-widget-set-floating! dock bool) Set floating state
(qt-dock-widget-floating? dock) Is floating?
(qt-main-window-add-dock-widget! win area dock) Add to main window (use QT_DOCK_* constants)

System Tray Icon

Function Description
(qt-system-tray-icon-create) Create tray icon
(qt-system-tray-icon-set-tooltip! tray text) Set tooltip
(qt-system-tray-icon-set-icon! tray icon) Set tray icon
(qt-system-tray-icon-show! tray) Show in tray
(qt-system-tray-icon-hide! tray) Hide from tray
(qt-system-tray-icon-show-message! tray title msg icon-type msec) Show notification
(qt-system-tray-icon-set-context-menu! tray menu) Set right-click menu
(qt-on-tray-activated! tray handler) (lambda (reason) ...)
(qt-system-tray-icon-available?) Is system tray available?
(qt-system-tray-icon-destroy! tray) Destroy tray icon

QPainter

Function Description
(qt-painter-create target) Create painter on pixmap or paint widget
(qt-painter-end! p) End painting
(qt-painter-destroy! p) Destroy painter
(qt-painter-set-pen-color! p r g b) Set pen color
(qt-painter-set-pen-width! p width) Set pen width
(qt-painter-set-brush-color! p r g b) Set fill color
(qt-painter-set-font! p font) Set text font
(qt-painter-set-antialiasing! p bool) Enable antialiasing
(qt-painter-draw-line! p x1 y1 x2 y2) Draw line
(qt-painter-draw-rect! p x y w h) Draw rectangle
(qt-painter-fill-rect! p x y w h) Fill rectangle
(qt-painter-draw-ellipse! p x y w h) Draw ellipse
(qt-painter-draw-text! p x y text) Draw text at point
(qt-painter-draw-text-rect! p x y w h flags text) Draw text in rectangle
(qt-painter-draw-pixmap! p x y pixmap) Draw pixmap
(qt-painter-draw-point! p x y) Draw point
(qt-painter-draw-arc! p x y w h start-angle span-angle) Draw arc
(qt-painter-save! p) Save painter state
(qt-painter-restore! p) Restore painter state
(qt-painter-translate! p dx dy) Translate origin
(qt-painter-rotate! p angle) Rotate (degrees)
(qt-painter-scale! p sx sy) Scale
(with-painter (p target) body ...) Macro: create, paint, auto end+destroy

Drag and Drop

Function Description
(qt-widget-set-accept-drops! w bool) Enable drop target
(qt-drop-filter-install! w) Install drop event filter
(qt-drop-filter-last-text) Get last dropped text
(qt-drop-filter-destroy! filter) Destroy drop filter
(qt-drag-text! source text) Initiate text drag

Double Spin Box

Function Description
(qt-double-spin-box-create) Create decimal spinner
(qt-double-spin-box-set-value! s value) Set value
(qt-double-spin-box-value s) Get value
(qt-double-spin-box-set-range! s min max) Set range
(qt-double-spin-box-set-single-step! s step) Set step
(qt-double-spin-box-set-decimals! s n) Set decimal places
(qt-double-spin-box-decimals s) Get decimal places
(qt-double-spin-box-set-prefix! s prefix) Set prefix
(qt-double-spin-box-set-suffix! s suffix) Set suffix
(qt-on-double-spin-value-changed! s handler) (lambda (value) ...)

Date Edit

Function Description
(qt-date-edit-create) Create date picker
(qt-date-edit-set-date! d year month day) Set date
(qt-date-edit-year d) Get year
(qt-date-edit-month d) Get month
(qt-date-edit-day d) Get day
(qt-date-edit-date-string d) Get ISO date string
(qt-date-edit-set-minimum-date! d year month day) Set minimum
(qt-date-edit-set-maximum-date! d year month day) Set maximum
(qt-date-edit-set-calendar-popup! d bool) Enable calendar popup
(qt-date-edit-set-display-format! d format) Set display format
(qt-on-date-changed! d handler) (lambda () ...)

Time Edit

Function Description
(qt-time-edit-create) Create time picker
(qt-time-edit-set-time! t hour minute second) Set time
(qt-time-edit-hour t) Get hour
(qt-time-edit-minute t) Get minute
(qt-time-edit-second t) Get second
(qt-time-edit-time-string t) Get time string
(qt-time-edit-set-display-format! t format) Set display format
(qt-on-time-changed! t handler) (lambda () ...)

Frame

Function Description
(qt-frame-create) Create frame
(qt-frame-set-frame-shape! f shape) Set shape (use QT_FRAME_* constants)
(qt-frame-frame-shape f) Get shape
(qt-frame-set-frame-shadow! f shadow) Set shadow
(qt-frame-frame-shadow f) Get shadow
(qt-frame-set-line-width! f width) Set line width
(qt-frame-line-width f) Get line width
(qt-frame-set-mid-line-width! f width) Set mid-line width

Progress Dialog

Function Description
(qt-progress-dialog-create title cancel-text min max) Create progress dialog
(qt-progress-dialog-set-value! d value) Set progress
(qt-progress-dialog-value d) Get progress
(qt-progress-dialog-set-range! d min max) Set range
(qt-progress-dialog-set-label-text! d text) Set label
(qt-progress-dialog-was-canceled? d) Was cancelled?
(qt-progress-dialog-set-minimum-duration! d msec) Set delay before showing
(qt-progress-dialog-set-auto-close! d bool) Auto close on completion
(qt-progress-dialog-set-auto-reset! d bool) Auto reset on completion
(qt-progress-dialog-reset! d) Reset dialog
(qt-on-progress-canceled! d handler) (lambda () ...)

Input Dialog

Function Description
(qt-input-dialog-get-text title label default) Get text from user; returns string or ""
(qt-input-dialog-get-int title label value min max step) Get integer
(qt-input-dialog-get-double title label value min max decimals) Get double
(qt-input-dialog-get-item title label items current editable) Choose from list
(qt-input-dialog-was-accepted?) Was last dialog accepted?

Form Layout

Function Description
(qt-form-layout-create parent) Create form layout (label:field rows)
(qt-form-layout-add-row! form label widget) Add labeled row
(qt-form-layout-add-row-widget! form widget) Add spanning row
(qt-form-layout-add-spanning-widget! form widget) Add spanning widget
(qt-form-layout-row-count form) Get number of rows

Shortcut

Function Description
(qt-shortcut-create key-sequence parent) Create shortcut (e.g. "Ctrl+S")
(qt-shortcut-set-key! sc key-sequence) Change key sequence
(qt-shortcut-set-enabled! sc bool) Enable/disable
(qt-shortcut-enabled? sc) Is enabled?
(qt-on-shortcut-activated! sc handler) (lambda () ...)
(qt-shortcut-destroy! sc) Destroy shortcut

Calendar

Function Description
(qt-calendar-create) Create calendar widget
(qt-calendar-set-selected-date! cal year month day) Set selected date
(qt-calendar-selected-year cal) Get year
(qt-calendar-selected-month cal) Get month (1-12)
(qt-calendar-selected-day cal) Get day (1-31)
(qt-calendar-selected-date-string cal) Get ISO date string
(qt-calendar-set-minimum-date! cal year month day) Set minimum date
(qt-calendar-set-maximum-date! cal year month day) Set maximum date
(qt-calendar-set-first-day-of-week! cal day) Set first day (use QT_MONDAY..QT_SUNDAY)
(qt-calendar-set-grid-visible! cal bool) Show/hide grid
(qt-calendar-grid-visible? cal) Is grid visible?
(qt-calendar-set-navigation-bar-visible! cal bool) Show/hide navigation
(qt-on-calendar-selection-changed! cal handler) (lambda () ...)
(qt-on-calendar-clicked! cal handler) (lambda (iso-date) ...)

Text Browser

Function Description
(qt-text-browser-create) Create rich text/HTML viewer
(qt-text-browser-set-html! tb html) Set HTML content
(qt-text-browser-set-plain-text! tb text) Set plain text
(qt-text-browser-plain-text tb) Get plain text
(qt-text-browser-set-open-external-links! tb bool) Enable browser launch on click
(qt-text-browser-set-source! tb url) Load content from URL/file
(qt-text-browser-source tb) Get current source URL
(qt-text-browser-scroll-to-bottom! tb) Scroll to bottom
(qt-text-browser-append! tb text) Append text
(qt-text-browser-html tb) Get HTML content
(qt-on-anchor-clicked! tb handler) Link clicked: (lambda (url) ...)

Dialog Button Box

Function Description
(qt-button-box-create flags) Create with standard button flags (bitwise-ior)
(qt-button-box-button bb role) Get button by standard constant
(qt-button-box-add-button! bb text role) Add custom button
(qt-on-button-box-accepted! bb handler) (lambda () ...)
(qt-on-button-box-rejected! bb handler) (lambda () ...)
(qt-on-button-box-clicked! bb handler) (lambda () ...)

Standard buttons: QT_BUTTON_OK, QT_BUTTON_CANCEL, QT_BUTTON_APPLY, QT_BUTTON_CLOSE, QT_BUTTON_YES, QT_BUTTON_NO, QT_BUTTON_RESET, QT_BUTTON_HELP, QT_BUTTON_SAVE, QT_BUTTON_DISCARD

QSettings

Function Description
(qt-settings-create org app) Create settings for org/app
(qt-settings-create-file path format) Create file-backed settings
(qt-settings-set-string! s key value) Store string
(qt-settings-value-string s key default) Read string
(qt-settings-set-int! s key value) Store integer
(qt-settings-value-int s key default) Read integer
(qt-settings-set-double! s key value) Store double
(qt-settings-value-double s key default) Read double
(qt-settings-set-bool! s key value) Store boolean
(qt-settings-value-bool s key default) Read boolean
(qt-settings-contains? s key) Check if key exists
(qt-settings-remove! s key) Remove key
(qt-settings-all-keys s) List all keys
(qt-settings-child-keys s) Keys in current group
(qt-settings-child-groups s) Subgroups in current group
(qt-settings-begin-group! s prefix) Enter group
(qt-settings-end-group! s) Leave group
(qt-settings-group s) Current group name
(qt-settings-sync! s) Flush to storage
(qt-settings-clear! s) Remove all keys
(qt-settings-file-name s) Path to storage file
(qt-settings-writable? s) Can write?
(qt-settings-destroy! s) Destroy settings

Format constants: QT_SETTINGS_NATIVE, QT_SETTINGS_INI

QCompleter

Function Description
(qt-completer-create items) Create from list of strings
(qt-completer-set-model-strings! c items) Update completion list
(qt-completer-set-case-sensitivity! c sensitive?) Case-sensitive matching
(qt-completer-set-completion-mode! c mode) Set popup/inline mode
(qt-completer-set-filter-mode! c mode) Set starts-with/contains/ends-with
(qt-completer-set-max-visible-items! c count) Max visible popup items
(qt-completer-completion-count c) Number of completions
(qt-completer-current-completion c) Current completion text
(qt-completer-set-completion-prefix! c prefix) Set prefix to match
(qt-on-completer-activated! c handler) (lambda (text) ...)
(qt-line-edit-set-completer! e c) Attach to line edit
(qt-completer-set-widget! c widget) Attach to arbitrary widget
(qt-completer-complete-rect! c x y w h) Show popup at rect
(qt-completer-destroy! c) Destroy (only if not attached)

Mode constants: QT_COMPLETER_POPUP, QT_COMPLETER_INLINE, QT_COMPLETER_UNFILTERED_POPUP

Case constants: QT_CASE_INSENSITIVE, QT_CASE_SENSITIVE

Filter constants: QT_MATCH_STARTS_WITH, QT_MATCH_CONTAINS, QT_MATCH_ENDS_WITH

Tooltip / WhatsThis

Function Description
(qt-tooltip-show-text! x y text) Show tooltip at screen position
(qt-tooltip-hide-text!) Hide current tooltip
(qt-tooltip-visible?) Is tooltip visible?
(qt-widget-tooltip w) Get widget's tooltip text
(qt-widget-set-whats-this! w text) Set "What's This?" text
(qt-widget-whats-this w) Get "What's This?" text

QStandardItemModel

Function Description
(qt-standard-model-create rows cols) Create model
(qt-standard-model-destroy! m) Destroy model
(qt-standard-model-row-count m) Row count
(qt-standard-model-column-count m) Column count
(qt-standard-model-set-row-count! m rows) Set rows
(qt-standard-model-set-column-count! m cols) Set columns
(qt-standard-model-set-item! m row col item) Set item (transfers ownership)
(qt-standard-model-item m row col) Get item
(qt-standard-model-insert-row! m row) Insert row
(qt-standard-model-insert-column! m col) Insert column
(qt-standard-model-remove-row! m row) Remove row
(qt-standard-model-remove-column! m col) Remove column
(qt-standard-model-clear! m) Clear all items
(qt-standard-model-set-horizontal-header! m col text) Set column header
(qt-standard-model-set-vertical-header! m row text) Set row header

QStandardItem

Function Description
(qt-standard-item-create text) Create item
(qt-standard-item-text item) Get text
(qt-standard-item-set-text! item text) Set text
(qt-standard-item-tooltip item) Get tooltip
(qt-standard-item-set-tooltip! item text) Set tooltip
(qt-standard-item-set-editable! item bool) Set editable
(qt-standard-item-editable? item) Is editable?
(qt-standard-item-set-enabled! item bool) Set enabled
(qt-standard-item-enabled? item) Is enabled?
(qt-standard-item-set-selectable! item bool) Set selectable
(qt-standard-item-selectable? item) Is selectable?
(qt-standard-item-set-checkable! item bool) Set checkable
(qt-standard-item-checkable? item) Is checkable?
(qt-standard-item-set-check-state! item state) Set check state
(qt-standard-item-check-state item) Get check state
(qt-standard-item-set-icon! item icon) Set icon
(qt-standard-item-append-row! parent child) Add child (tree hierarchy)
(qt-standard-item-row-count item) Child row count
(qt-standard-item-column-count item) Child column count
(qt-standard-item-child item row col) Get child item

Items transfer ownership to the model after set-item! or append-row!. Do not destroy manually.

QStringListModel

Function Description
(qt-string-list-model-create items) Create from list of strings
(qt-string-list-model-destroy! m) Destroy model
(qt-string-list-model-set-strings! m items) Replace all strings
(qt-string-list-model-strings m) Get all strings as list
(qt-string-list-model-row-count m) Number of items

Views (QListView, QTableView, QTreeView)

Function Description
(qt-list-view-create) Create list view
(qt-table-view-create) Create table view
(qt-tree-view-create) Create tree view
(qt-view-set-model! view model) Set data model
(qt-view-set-selection-mode! view mode) Set selection mode
(qt-view-set-selection-behavior! view behavior) Set selection behavior
(qt-view-set-alternating-row-colors! view bool) Alternating colors
(qt-view-set-sorting-enabled! view bool) Enable sorting
(qt-view-set-edit-triggers! view triggers) Set edit triggers
(qt-list-view-set-flow! v flow) Set list flow direction
(qt-table-view-set-column-width! v col w) Set column width
(qt-table-view-set-row-height! v row h) Set row height
(qt-table-view-hide-column! v col) Hide column
(qt-table-view-show-column! v col) Show column
(qt-table-view-hide-row! v row) Hide row
(qt-table-view-show-row! v row) Show row
(qt-table-view-resize-columns-to-contents! v) Auto-fit columns
(qt-table-view-resize-rows-to-contents! v) Auto-fit rows
(qt-tree-view-expand-all! v) Expand all nodes
(qt-tree-view-collapse-all! v) Collapse all nodes
(qt-tree-view-set-indentation! v pixels) Set indentation
(qt-tree-view-indentation v) Get indentation
(qt-tree-view-set-root-is-decorated! v bool) Root decoration
(qt-tree-view-set-header-hidden! v bool) Hide header
(qt-tree-view-set-column-width! v col w) Set column width

QHeaderView (via view)

Function Description
(qt-view-header-set-stretch-last-section! view bool) Stretch last section
(qt-view-header-set-section-resize-mode! view mode) Set resize mode
(qt-view-header-hide! view) Hide header
(qt-view-header-show! view) Show header
(qt-view-header-set-default-section-size! view size) Set default section size

QSortFilterProxyModel

Function Description
(qt-sort-filter-proxy-create) Create proxy
(qt-sort-filter-proxy-destroy! p) Destroy proxy
(qt-sort-filter-proxy-set-source-model! p model) Set source model
(qt-sort-filter-proxy-set-filter-regex! p pattern) Set filter regex
(qt-sort-filter-proxy-set-filter-column! p col) Filter column
(qt-sort-filter-proxy-set-filter-case-sensitivity! p cs) Case sensitivity
(qt-sort-filter-proxy-set-filter-role! p role) Filter data role
(qt-sort-filter-proxy-sort! p col) Sort by column
(qt-sort-filter-proxy-set-sort-role! p role) Sort data role
(qt-sort-filter-proxy-set-dynamic-sort-filter! p bool) Auto re-sort
(qt-sort-filter-proxy-invalidate-filter! p) Force re-filter
(qt-sort-filter-proxy-row-count p) Visible row count

View Signals + Selection

Function Description
(qt-on-view-clicked! view handler) (lambda () ...)
(qt-on-view-double-clicked! view handler) (lambda () ...)
(qt-on-view-activated! view handler) (lambda () ...)
(qt-on-view-selection-changed! view handler) (lambda () ...)
(qt-view-last-clicked-row) Row of last click
(qt-view-last-clicked-col) Column of last click
(qt-view-selected-rows view) List of selected row indices
(qt-view-current-row view) Current row (-1 if none)

Validators

Function Description
(qt-int-validator-create min max) Integer range validator
(qt-double-validator-create bottom top decimals) Decimal range validator
(qt-regex-validator-create pattern) Regex validator
(qt-validator-destroy! v) Destroy validator
(qt-validator-validate v input) Validate string, returns state constant
(qt-line-edit-set-validator! edit validator) Attach to line edit
(qt-line-edit-has-acceptable-input? edit) Current input passes?

Validator state constants: QT_VALIDATOR_INVALID (0), QT_VALIDATOR_INTERMEDIATE (1), QT_VALIDATOR_ACCEPTABLE (2)

QPlainTextEdit

Efficient plain text editor for large documents.

Function Description
(qt-plain-text-edit-create) Create editor
(qt-plain-text-edit-set-text! e text) Set text
(qt-plain-text-edit-text e) Get text
(qt-plain-text-edit-append! e text) Append line
(qt-plain-text-edit-clear! e) Clear all
(qt-plain-text-edit-set-read-only! e bool) Set read-only
(qt-plain-text-edit-read-only? e) Is read-only?
(qt-plain-text-edit-set-placeholder! e text) Set placeholder
(qt-plain-text-edit-line-count e) Line count
(qt-plain-text-edit-set-max-block-count! e n) Limit max lines
(qt-plain-text-edit-cursor-line e) Cursor line (0-based)
(qt-plain-text-edit-cursor-column e) Cursor column (0-based)
(qt-plain-text-edit-set-line-wrap! e mode) Set wrap mode
(qt-on-plain-text-changed! e handler) (lambda () ...)

Editor extensions:

Function Description
(qt-plain-text-edit-cursor-position e) Get cursor position
(qt-plain-text-edit-set-cursor-position! e pos) Set cursor position
(qt-plain-text-edit-move-cursor! e operation anchor) Move cursor
(qt-plain-text-edit-select-all! e) Select all text
(qt-plain-text-edit-selected-text e) Get selection
(qt-plain-text-edit-selection-start e) Selection start
(qt-plain-text-edit-selection-end e) Selection end
(qt-plain-text-edit-set-selection! e start end) Set selection range
(qt-plain-text-edit-has-selection? e) Has selection?
(qt-plain-text-edit-insert-text! e text) Insert at cursor
(qt-plain-text-edit-remove-selected-text! e) Delete selection
(qt-plain-text-edit-undo! e) Undo
(qt-plain-text-edit-redo! e) Redo
(qt-plain-text-edit-can-undo? e) Can undo?
(qt-plain-text-edit-cut! e) Cut
(qt-plain-text-edit-copy! e) Copy
(qt-plain-text-edit-paste! e) Paste
(qt-plain-text-edit-text-length e) Total text length
(qt-plain-text-edit-text-range e start end) Get text range
(qt-plain-text-edit-line-from-position e pos) Line at position
(qt-plain-text-edit-line-end-position e line) End of line
(qt-plain-text-edit-find-text e text flags) Find text
(qt-plain-text-edit-ensure-cursor-visible! e) Scroll to cursor
(qt-plain-text-edit-center-cursor! e) Center cursor in view

Line wrap constants: QT_PLAIN_NO_WRAP (0), QT_PLAIN_WIDGET_WRAP (1)

Cursor movement constants: QT_CURSOR_NO_MOVE, QT_CURSOR_START, QT_CURSOR_UP, QT_CURSOR_START_OF_LINE, QT_CURSOR_END_OF_LINE, QT_CURSOR_NEXT_CHAR, QT_CURSOR_PREVIOUS_CHAR, QT_CURSOR_END, QT_CURSOR_DOWN, etc.

Anchor constants: QT_MOVE_ANCHOR, QT_KEEP_ANCHOR

Find flags: QT_FIND_BACKWARD, QT_FIND_CASE_SENSITIVE, QT_FIND_WHOLE_WORDS

QTextDocument

Function Description
(qt-text-document-create) Create document
(qt-plain-text-document-create) Create plain text document
(qt-text-document-destroy! doc) Destroy document
(qt-plain-text-edit-document e) Get editor's document
(qt-plain-text-edit-set-document! e doc) Set editor's document
(qt-text-document-modified? doc) Is modified?
(qt-text-document-set-modified! doc bool) Set modified flag

QToolButton

Function Description
(qt-tool-button-create) Create tool button
(qt-tool-button-set-text! b text) Set text
(qt-tool-button-text b) Get text
(qt-tool-button-set-icon! b path) Set icon from file
(qt-tool-button-set-menu! b menu) Attach dropdown menu
(qt-tool-button-set-popup-mode! b mode) Set popup mode
(qt-tool-button-set-auto-raise! b bool) Auto-raise appearance
(qt-tool-button-set-arrow-type! b arrow) Set arrow indicator
(qt-tool-button-set-tool-button-style! b style) Set display style
(qt-on-tool-button-clicked! b handler) (lambda () ...)

Popup mode: QT_DELAYED_POPUP (0), QT_MENU_BUTTON_POPUP (1), QT_INSTANT_POPUP (2)

Arrow type: QT_NO_ARROW (0), QT_UP_ARROW (1), QT_DOWN_ARROW (2), QT_LEFT_ARROW (3), QT_RIGHT_ARROW (4)

Style: QT_TOOL_BUTTON_ICON_ONLY (0), QT_TOOL_BUTTON_TEXT_ONLY (1), QT_TOOL_BUTTON_TEXT_BESIDE_ICON (2), QT_TOOL_BUTTON_TEXT_UNDER_ICON (3)

QSizePolicy

Function Description
(qt-widget-set-size-policy! w h-policy v-policy) Set size policy

Constants: QT_SIZE_FIXED (0), QT_SIZE_MINIMUM (1), QT_SIZE_MINIMUM_EXPANDING (3), QT_SIZE_MAXIMUM (4), QT_SIZE_PREFERRED (5), QT_SIZE_EXPANDING (7), QT_SIZE_IGNORED (13)

QGraphicsScene

2D scene graph for interactive diagrams.

Function Description
(qt-graphics-scene-create x y w h) Create scene with bounds
(qt-graphics-scene-add-rect! scene x y w h) Add rectangle
(qt-graphics-scene-add-ellipse! scene x y w h) Add ellipse
(qt-graphics-scene-add-line! scene x1 y1 x2 y2) Add line
(qt-graphics-scene-add-text! scene text) Add text item
(qt-graphics-scene-add-pixmap! scene pixmap) Add pixmap
(qt-graphics-scene-remove-item! scene item) Remove item
(qt-graphics-scene-clear! scene) Clear all items
(qt-graphics-scene-items-count scene) Item count
(qt-graphics-scene-set-background! scene r g b) Set background color
(qt-graphics-scene-destroy! scene) Destroy scene (and all items)

QGraphicsView

Function Description
(qt-graphics-view-create scene) Create view for scene
(qt-graphics-view-set-render-hint! view hint) Set render hint
(qt-graphics-view-set-drag-mode! view mode) Set drag mode
(qt-graphics-view-fit-in-view! view) Fit scene to view
(qt-graphics-view-scale! view sx sy) Zoom
(qt-graphics-view-center-on! view x y) Center on coordinates

QGraphicsItem

Function Description
(qt-graphics-item-set-pos! item x y) Set position
(qt-graphics-item-x item) Get X
(qt-graphics-item-y item) Get Y
(qt-graphics-item-set-pen! item r g b width) Set outline
(qt-graphics-item-set-brush! item r g b) Set fill
(qt-graphics-item-set-flags! item flags) Set interaction flags
(qt-graphics-item-set-tooltip! item text) Set tooltip
(qt-graphics-item-set-zvalue! item z) Set stacking order
(qt-graphics-item-zvalue item) Get stacking order
(qt-graphics-item-set-rotation! item angle) Set rotation
(qt-graphics-item-set-scale! item factor) Set scale
(qt-graphics-item-set-visible! item bool) Show/hide

Item flags: QT_ITEM_MOVABLE (0x1), QT_ITEM_SELECTABLE (0x2), QT_ITEM_FOCUSABLE (0x4). Combine with bitwise-ior.

Drag modes: QT_DRAG_NONE (0), QT_DRAG_SCROLL (1), QT_DRAG_RUBBER_BAND (2)

Render hints: QT_RENDER_ANTIALIASING (0x01), QT_RENDER_SMOOTH_PIXMAP (0x02), QT_RENDER_TEXT_ANTIALIASING (0x04)

PaintWidget (custom paintEvent)

A QWidget subclass that fires a Scheme callback during paintEvent().

Function Description
(qt-paint-widget-create) Create custom paint widget
(qt-on-paint! widget handler) Register paint callback
(qt-paint-widget-painter widget) Get active QPainter (only valid inside callback)
(qt-paint-widget-update! widget) Request repaint
(qt-paint-widget-width widget) Current width
(qt-paint-widget-height widget) Current height

QProcess

Function Description
(qt-process-create) Create process
(qt-process-start! proc program args) Start process
(qt-process-write! proc data) Write to stdin
(qt-process-close-write! proc) Close stdin
(qt-process-read-stdout proc) Read stdout
(qt-process-read-stderr proc) Read stderr
(qt-process-wait-for-finished! proc msecs) Wait for exit
(qt-process-exit-code proc) Get exit code
(qt-process-state proc) Get state
(qt-process-kill! proc) Kill (SIGKILL)
(qt-process-terminate! proc) Terminate (SIGTERM)
(qt-on-process-finished! proc handler) (lambda (exit-code) ...)
(qt-on-process-ready-read! proc handler) (lambda () ...)
(qt-process-destroy! proc) Destroy process

Constants: QT_PROCESS_NOT_RUNNING (0), QT_PROCESS_STARTING (1), QT_PROCESS_RUNNING (2)

QWizard / QWizardPage

Function Description
(qt-wizard-create) Create wizard dialog
(qt-wizard-add-page! wizard page) Add page, returns ID
(qt-wizard-set-start-id! wizard id) Set starting page
(qt-wizard-current-id wizard) Current page ID
(qt-wizard-set-title! wizard title) Set title
(qt-wizard-exec! wizard) Run modal wizard
(qt-wizard-page-create) Create page
(qt-wizard-page-set-title! page title) Set page title
(qt-wizard-page-set-subtitle! page subtitle) Set subtitle
(qt-wizard-page-set-layout! page layout) Set page layout
(qt-on-wizard-current-changed! wizard handler) (lambda (page-id) ...)

QMdiArea / QMdiSubWindow

Function Description
(qt-mdi-area-create) Create MDI area
(qt-mdi-area-add-sub-window! area widget) Add sub-window
(qt-mdi-area-remove-sub-window! area sub) Remove sub-window
(qt-mdi-area-active-sub-window area) Get active (or #f)
(qt-mdi-area-sub-window-count area) Count sub-windows
(qt-mdi-area-cascade! area) Cascade layout
(qt-mdi-area-tile! area) Tile layout
(qt-mdi-area-set-view-mode! area mode) Set view mode
(qt-mdi-sub-window-set-title! sub title) Set title
(qt-on-mdi-sub-window-activated! area handler) (lambda () ...)

Constants: QT_MDI_SUBWINDOW (0), QT_MDI_TABBED (1)

QDial

Function Description
(qt-dial-create) Create dial (knob)
(qt-dial-set-value! dial value) Set value
(qt-dial-value dial) Get value
(qt-dial-set-range! dial min max) Set range
(qt-dial-set-notches-visible! dial bool) Show notches
(qt-dial-set-wrapping! dial bool) Enable wrap-around
(qt-on-dial-value-changed! dial handler) (lambda (value) ...)

QLCDNumber

Function Description
(qt-lcd-create digits) Create LCD display
(qt-lcd-display-int! lcd value) Display integer
(qt-lcd-display-double! lcd value) Display float
(qt-lcd-display-string! lcd text) Display string
(qt-lcd-set-mode! lcd mode) Set mode (dec/hex/oct/bin)
(qt-lcd-set-segment-style! lcd style) Set style

Constants: QT_LCD_DEC (0), QT_LCD_HEX (1), QT_LCD_OCT (2), QT_LCD_BIN (3); QT_LCD_OUTLINE (0), QT_LCD_FILLED (1), QT_LCD_FLAT (2)

QToolBox

Function Description
(qt-tool-box-create) Create accordion widget
(qt-tool-box-add-item! tb widget text) Add page
(qt-tool-box-set-current-index! tb index) Switch page
(qt-tool-box-current-index tb) Current page index
(qt-tool-box-count tb) Page count
(qt-tool-box-set-item-text! tb index text) Change label
(qt-on-tool-box-current-changed! tb handler) (lambda (index) ...)

QUndoStack

Function Description
(qt-undo-stack-create) Create undo stack
(qt-undo-stack-push! stack text undo-handler redo-handler) Push command
(qt-undo-stack-undo! stack) Undo
(qt-undo-stack-redo! stack) Redo
(qt-undo-stack-can-undo? stack) Can undo?
(qt-undo-stack-can-redo? stack) Can redo?
(qt-undo-stack-undo-text stack) Next undo text
(qt-undo-stack-redo-text stack) Next redo text
(qt-undo-stack-clear! stack) Clear history
(qt-undo-stack-create-undo-action stack) Create undo QAction
(qt-undo-stack-create-redo-action stack) Create redo QAction
(qt-undo-stack-destroy! stack) Destroy stack
;; Undo/redo example
(qt-undo-stack-push! stack "Increment"
  (lambda () (set! counter (- counter 1)))    ; undo
  (lambda () (set! counter (+ counter 1))))   ; redo (called immediately)
(qt-undo-stack-undo! stack)  ; counter goes back
(qt-undo-stack-redo! stack)  ; counter goes forward

QFileSystemModel

Function Description
(qt-file-system-model-create) Create filesystem model
(qt-file-system-model-set-root-path! model path) Set root directory
(qt-file-system-model-set-filter! model filters) Set filters (bitwise-ior)
(qt-file-system-model-set-name-filters! model patterns) Set glob patterns (list of strings)
(qt-file-system-model-file-path model row col) Get file path
(qt-tree-view-set-file-system-root! view model path) Set tree root
(qt-file-system-model-destroy! model) Destroy model

Constants: QT_DIR_DIRS, QT_DIR_FILES, QT_DIR_HIDDEN, QT_DIR_NO_DOT_AND_DOT_DOT

QSyntaxHighlighter

Regex-based syntax highlighting for QPlainTextEdit.

Function Description
(qt-syntax-highlighter-create document) Create highlighter on a document
(qt-syntax-highlighter-destroy! h) Destroy highlighter
(qt-syntax-highlighter-add-rule! h pattern fg-color bold) Add regex rule
(qt-syntax-highlighter-add-keywords! h words fg-color bold) Add keyword list
(qt-syntax-highlighter-add-multiline-rule! h start end fg-color bold) Add multiline pattern
(qt-syntax-highlighter-clear-rules! h) Clear all rules
(qt-syntax-highlighter-rehighlight! h) Re-apply highlighting

Line Number Area

Function Description
(qt-line-number-area-create editor) Create line numbers for QPlainTextEdit
(qt-line-number-area-destroy! area) Destroy line number area
(qt-line-number-area-set-visible! area bool) Show/hide
(qt-line-number-area-set-bg-color! area color) Set background color
(qt-line-number-area-set-fg-color! area color) Set text color

Extra Selections

Function Description
(qt-plain-text-edit-clear-extra-selections! e) Clear highlights
(qt-plain-text-edit-add-extra-selection-line! e line bg-color) Highlight line
(qt-plain-text-edit-add-extra-selection-range! e start end fg bg) Highlight range
(qt-plain-text-edit-apply-extra-selections! e) Apply pending highlights

QScintilla

Advanced code editor component (requires libqscintilla2).

Function Description
(qt-scintilla-create) Create Scintilla editor
(qt-scintilla-destroy! s) Destroy editor
(qt-scintilla-send-message s msg wparam lparam) Send raw Scintilla message
(qt-scintilla-send-message-string s msg wparam str) Send message with string
(qt-scintilla-receive-string s msg wparam) Receive string from message
(qt-scintilla-set-text! s text) Set text
(qt-scintilla-get-text s) Get text
(qt-scintilla-get-text-length s) Get text length
(qt-scintilla-set-lexer-language! s language) Set lexer (e.g. "cpp")
(qt-scintilla-get-lexer-language s) Get lexer language
(qt-scintilla-set-read-only! s bool) Set read-only
(qt-scintilla-read-only? s) Is read-only?
(qt-scintilla-set-margin-width! s margin pixels) Set margin width
(qt-scintilla-set-margin-type! s margin type) Set margin type
(qt-scintilla-set-focus! s) Set keyboard focus
(qt-on-scintilla-text-changed! s handler) (lambda () ...)
(qt-on-scintilla-char-added! s handler) (lambda () ...)
(qt-on-scintilla-save-point-reached! s handler) (lambda () ...)
(qt-on-scintilla-save-point-left! s handler) (lambda () ...)
(qt-on-scintilla-margin-clicked! s handler) (lambda () ...)
(qt-on-scintilla-modified! s handler) (lambda () ...)

Signal Disconnect & Callback Management

Function Description
(unregister-qt-handler! id) Remove callback by ID (returned from qt-on-*!)
(qt-disconnect-all! obj) Disconnect all signals from a QObject

All qt-on-*! functions return a callback ID:

(let ((id (qt-on-clicked! button (lambda () (display "clicked!\n")))))
  ;; Later, remove the handler:
  (unregister-qt-handler! id))

Calling qt-on-*! multiple times accumulates connections. To replace a handler, unregister the old one first.

Resource Safety Macros

RAII-style macros that guarantee cleanup even on exceptions.

Macro Description
(with-painter (p target) body ...) Create QPainter, auto end+destroy
(with-qt-app app body ...) Create QApplication, auto destroy

Constants Reference

Alignment

QT_ALIGN_LEFT, QT_ALIGN_RIGHT, QT_ALIGN_CENTER, QT_ALIGN_TOP, QT_ALIGN_BOTTOM

Orientation

QT_HORIZONTAL, QT_VERTICAL

Echo Mode

QT_ECHO_NORMAL, QT_ECHO_NO_ECHO, QT_ECHO_PASSWORD, QT_ECHO_PASSWORD_ON_EDIT

Tick Position

QT_TICKS_NONE, QT_TICKS_ABOVE, QT_TICKS_BELOW, QT_TICKS_BOTH_SIDES

Window State

QT_WINDOW_NO_STATE, QT_WINDOW_MINIMIZED, QT_WINDOW_MAXIMIZED, QT_WINDOW_FULL_SCREEN

Scrollbar Policy

QT_SCROLLBAR_AS_NEEDED, QT_SCROLLBAR_ALWAYS_OFF, QT_SCROLLBAR_ALWAYS_ON

Cursor Shape

QT_CURSOR_ARROW, QT_CURSOR_CROSS, QT_CURSOR_WAIT, QT_CURSOR_IBEAM, QT_CURSOR_POINTING_HAND, QT_CURSOR_FORBIDDEN, QT_CURSOR_BUSY

Frame

Shape: QT_FRAME_NO_FRAME, QT_FRAME_BOX, QT_FRAME_PANEL, QT_FRAME_WIN_PANEL, QT_FRAME_HLINE, QT_FRAME_VLINE, QT_FRAME_STYLED_PANEL

Shadow: QT_FRAME_PLAIN, QT_FRAME_RAISED, QT_FRAME_SUNKEN

Dock Area

QT_DOCK_LEFT, QT_DOCK_RIGHT, QT_DOCK_TOP, QT_DOCK_BOTTOM

Tray Icon

QT_TRAY_NO_ICON, QT_TRAY_INFORMATION, QT_TRAY_WARNING, QT_TRAY_CRITICAL

Key Codes

QT_KEY_ESCAPE, QT_KEY_TAB, QT_KEY_BACKTAB, QT_KEY_BACKSPACE, QT_KEY_RETURN, QT_KEY_ENTER, QT_KEY_INSERT, QT_KEY_DELETE, QT_KEY_PAUSE, QT_KEY_HOME, QT_KEY_END, QT_KEY_LEFT, QT_KEY_UP, QT_KEY_RIGHT, QT_KEY_DOWN, QT_KEY_PAGE_UP, QT_KEY_PAGE_DOWN, QT_KEY_F1..QT_KEY_F12, QT_KEY_SPACE

Key Modifiers

QT_MOD_NONE, QT_MOD_SHIFT, QT_MOD_CONTROL, QT_MOD_ALT, QT_MOD_META

Selection

Mode: QT_SELECT_NO_SELECTION, QT_SELECT_SINGLE, QT_SELECT_MULTI, QT_SELECT_EXTENDED, QT_SELECT_CONTIGUOUS

Behavior: QT_SELECT_ITEMS, QT_SELECT_ROWS, QT_SELECT_COLUMNS

Sort Order

QT_SORT_ASCENDING, QT_SORT_DESCENDING

Check State

QT_UNCHECKED, QT_PARTIALLY_CHECKED, QT_CHECKED

Header Resize Mode

QT_HEADER_INTERACTIVE, QT_HEADER_STRETCH, QT_HEADER_FIXED, QT_HEADER_RESIZE_TO_CONTENTS

Edit Triggers

QT_NO_EDIT_TRIGGERS, QT_EDIT_DOUBLE_CLICK, QT_EDIT_SELECTED_CLICK, QT_EDIT_ANY_KEY_PRESSED, QT_EDIT_ALL_TRIGGERS

Flow Direction

QT_FLOW_TOP_TO_BOTTOM, QT_FLOW_LEFT_TO_RIGHT

Day of Week

QT_MONDAY, QT_TUESDAY, QT_WEDNESDAY, QT_THURSDAY, QT_FRIDAY, QT_SATURDAY, QT_SUNDAY

Architecture

The binding uses a four-layer architecture:

  1. C++ shim (vendor/qt_shim.h, vendor/qt_shim.cpp in qt-vendor) -- thin extern "C" wrappers around Qt6 C++ classes. All Qt objects are opaque void* handles. Compiled as libqt_shim.so.

  2. Native callback bridge (jerboa_qt_shim.c, callback_queue.c, and jerboa_qt_lifecycle.cpp) -- Qt callbacks copy bounded scalar/string events into a pthread-safe queue. It never stores or calls a Scheme function pointer. QObject destruction queues priority cleanup events, including parent-driven child teardown.

  3. FFI layer (jerboa-qt/ffi.ss) -- Jerboa FFI bindings for each C function. Imports are pure; libqt_shim.so and jerboa_qt_shim.so are loaded lazily on first native use, and C entries are resolved lazily with c-lambda.

  4. High-level API (jerboa-qt/qt.ss) -- Idiomatic Jerboa wrappers with boolean conversions, the with-qt-app macro, and all the qt-on-*! signal registration functions. It owns the generation-tagged callback registry on the qt-app-create thread.

Callback Pattern

Qt signals are transferred to Scheme handlers through an owner-thread queue:

Qt signal -> C++ lambda -> bounded native queue -> owner-thread drain
  -> synchronized callback table lookup -> user's Scheme closure

Four callback types cover all signals: void, string(text), int(value), bool(checked).

All qt-on-*! signal registration functions return a generation-tagged callback ID (integer). Use unregister-qt-handler! to remove a specific callback, or qt-disconnect-all! to disconnect all signals from a QObject. Both must run on the application owner thread. qt-timer-single-shot! removes its closure before invocation. Explicit destructors and native QObject::destroyed events remove registrations exactly once; queued events for removed IDs are ignored.

qt-app-exec! drains automatically. Code that pumps Qt manually must call (qt-pump-events! app), which processes Qt events and drains at most one bounded queue batch. qt-callback-registry-size, qt-callback-pending-count, and qt-callback-dropped-count are available for lifecycle/overload monitoring.

Memory Management

Qt uses parent-child ownership: destroying a parent automatically destroys all children. No GC finalizers are used on parented widgets. The QApplication must be explicitly destroyed (or use with-qt-app).

Examples

Example Description
hello.ss Minimal window with label
counter.ss Button click counter
form.ss Form with text inputs, checkboxes, combo box, spin box, message boxes
editor.ss Text editor with menus, toolbar, keyboard shortcuts, file I/O
dashboard.ss Tabbed dashboard with todo list, data table, slider + progress bar
filebrowser.ss File browser with tree view, grid layout, timer clock, clipboard
styled.ss Dark-themed split-pane app with scroll area, key events, fullscreen toggle
settings.ss Settings dialog with radio buttons, button groups, group boxes, dark theme
painter.ss QPainter demo with shapes, text, transforms, compositing
datainput.ss Double spin box, date/time pickers, frames, progress dialog, input dialogs
planner.ss Event planner with form layout, calendar, rich text preview, dialog buttons, shortcuts
autocomplete.ss Search with auto-complete, persistent history (QSettings), tooltips
modelviewer.ss Model/View with sortable table, live text filter, tree hierarchy
polished.ss Validated inputs, tool buttons, log area, size policies
diagram.ss Interactive diagram with QGraphicsScene/View and custom PaintWidget
terminal.ss Simple terminal with QProcess, command input, streaming output
widgets.ss QDial + QLCDNumber, QToolBox accordion, QUndoStack undo/redo
filemanager.ss File system browser with QFileSystemModel + QTreeView, filters
wizard.ss Multi-step wizard dialog with QWizard/QWizardPage
mdi.ss Multi-document interface with QMdiArea, undo/redo, tile/cascade
dockable.ss Dock widgets with QDockWidget
trayapp.ss System tray icon with context menu and notifications
dragdrop.ss Drag and drop text between widgets
keyboard.ss Keyboard event handling demo
dialogs.ss All dialog types (message, file, input, color, font)
richtext.ss Rich text editing with QTextBrowser

License

MIT