Slint Kit Documentation

Buttons and actions

Icon Button for Slint

KitIconButton · Slint Kit 0.3.1

Square icon button for a compact action.

Square icon button for a compact action.
Native app built from the example below.

Try the component

Download the complete project, extract it and run cargo run --locked in its folder. Rust 1.92+; Slint Kit 0.3.0 from crates.io. You can also copy the four files below.

Click New project: Rust handles the command and updates the action count.

ui/app.slint

export { KitFormValidation, HtmlInputKind, NumberInputFormat, KitInputConstraints, KitValidationResult, KitValidityState } from "@kit/kit.slint";
// SPDX-License-Identifier: GPL-3.0-or-later
import { IconKind, KitIconButton, KitTheme, KitThemes } from "@kit/kit.slint";

export enum DemoAction { create-project }

export component App inherits Window {
    title: "KitIconButton example";
    preferred-width: 320px;
    preferred-height: 150px;
    max-width: 100000px;
    max-height: 100000px;
    background: root.theme.canvas;
    in-out property <KitTheme> theme: KitThemes.light;
    in property <string> status: "Choose an action.";
    callback action-requested(DemoAction);
    VerticalLayout {
        padding: 24px; spacing: 16px; alignment: start;
        Text { text: "Icon Button"; color: root.theme.text-primary; font-size: 20px * root.theme.text-scale; font-weight: 600; }
        KitIconButton { theme: root.theme; icon: IconKind.plus; accessible-name: "New project"; activated => { root.action-requested(DemoAction.create-project); } }
        Text { text: root.status; color: root.theme.text-secondary; wrap: word-wrap; }
    }
}

src/main.rs

// SPDX-License-Identifier: GPL-3.0-or-later
use slint::ComponentHandle;
use std::cell::Cell;
slint::include_modules!();

fn main() -> Result<(), slint::PlatformError> {
    let app = App::new()?;
    slint_kit::init_form_validation!(self, app);
    let count = Cell::new(0_u32);
    let weak = app.as_weak();
    app.on_action_requested(move |action| {
        if let Some(app) = weak.upgrade() {
            let next = count.get().checked_add(1).expect("action count capacity");
            count.set(next);
            let label = match action {
                DemoAction::CreateProject => "New project",
            };
            app.set_status(format!("{label} handled by Rust ({next})").into());
        }
    });
    app.run()
}

Cargo.toml and build.rs

Cargo.toml

[package]
name = "slint-kit-icon-button-example"
version = "0.1.0"
edition = "2024"
rust-version = "1.92"
license = "GPL-3.0-or-later"
publish = false

[dependencies]
slint-kit = "=0.3.0"
slint = { version = "=1.18.1", default-features = false, features = ["std", "compat-1-18", "backend-winit", "renderer-skia", "accessibility"] }

[build-dependencies]
slint-kit-build = "=0.3.0"

[workspace]

build.rs

fn main() {
    slint_kit_build::compile("ui/app.slint").expect("compile component example");
}

Files: Cargo.toml · build.rs · ui/app.slint · src/main.rs

Choose icon: IconKind.check and always supply an accessible-name describing the action. Handle activated as with KitPressable.

Its recipe sizes the button from control-size and preserves inherited focus, hover and disabled states. The icon adds no separate keyboard target.

Visual composition

The file below produces the screenshot. For controller-driven components, it shows the displayed state without supplying the Rust wiring. Create a project.

Show the screenshot source
Square icon button for a compact action.
Native screenshot of the same example, rendered with Skia.
// SPDX-License-Identifier: GPL-3.0-or-later
import { IconKind, KitIconButton, KitTheme, KitThemes } from "@kit/kit.slint";

export component Example inherits Window {
    title: "KitIconButton example";
    preferred-width: 320px;
    preferred-height: 150px;
    max-width: 100000px;
    max-height: 100000px;
    background: root.theme.canvas;
    in-out property <KitTheme> theme: KitThemes.light;
    in-out property <string> status;
    VerticalLayout {
        padding: 24px; spacing: 16px; alignment: start;
        Text { text: "Icon Button"; color: root.theme.text-primary; font-size: 20px * root.theme.text-scale; font-weight: 600; }
        KitIconButton { theme: root.theme; icon: IconKind.plus; accessible-name: "New project"; activated => { root.status = "New project requested"; } }
        if root.status != "": Text { text: root.status; color: root.theme.text-secondary; font-size: 12px * root.theme.text-scale; wrap: word-wrap; }
    }
}

Download this example

Public API

Inherits KitPressable.

Properties

Name Type Direction
icon IconKind in
Available inherited properties
Name Type Defined on
theme KitTheme KitPressable
intent ButtonIntent KitPressable
control-size ControlSize KitPressable
control-width ControlWidth KitPressable
recipe ButtonRecipe KitPressable
accessible-name string KitPressable
disabled bool KitPressable
busy bool KitPressable
tab-stop bool KitPressable
hovered bool KitPressable
pressed bool KitPressable
has-focus bool KitPressable
focus-visible bool KitPressable

Types and variants

Type Declaration
enum IconKind chevron-down, chevron-left, chevron-right, close, eye, eye-hidden, search, check, minus, plus, arrow-up-right, warning, chevron-up, bell, menu, information, article, home, grid, copy, upload, download, heart, cart, clock, settings, file, trash

See also