Slint Kit Documentation

Buttons and actions

Submit Button for Slint

KitSubmitButton · Slint Kit 0.3.0

Primary button preset for requesting form submission.

Primary button preset for requesting form submission.
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.

Edit the name and click Create project: Rust accepts a non-empty name and displays it.

ui/app.slint

export { KitFormValidation, HtmlInputKind, NumberInputFormat, KitInputConstraints, KitValidationResult, KitValidityState } from "@kit/kit.slint";
// SPDX-License-Identifier: GPL-3.0-or-later
import { KitSubmitButton, KitTextField, KitThemes, FormAction } from "@kit/kit.slint";
export { FormAction }
export component App inherits Window {
    title: "KitSubmitButton";
    preferred-width: 460px;
    preferred-height: 260px;
    max-width: 100000px;
    max-height: 100000px;
    background: KitThemes.light.canvas;
    in-out property <string> draft: "Field notes";
    in property <string> result: "Edit the draft, then use the action.";
    callback form-action(FormAction, string);
    VerticalLayout {
        padding: 24px; spacing: 16px; alignment: start;
        KitTextField { label: "Project name"; text <=> root.draft; }
        action := KitSubmitButton { text: "Create project"; form-action(action) => { root.form-action(action, root.draft); } }
        Text { text: root.result; color: KitThemes.light.text-primary; wrap: word-wrap; }
    }
}

src/main.rs

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

struct ProjectName(String);
impl ProjectName {
    fn parse(draft: &str) -> Option<Self> {
        let name = draft.trim();
        (!name.is_empty()).then(|| Self(name.into()))
    }
}

fn main() -> Result<(), slint::PlatformError> {
    let app = App::new()?;
    slint_kit::init_form_validation!(self, app);
    let weak = app.as_weak();
    app.on_form_action(move |action, draft| {
        if let Some(app) = weak.upgrade() {
            match action {
                FormAction::Reset => {
                    app.set_draft("Field notes".into());
                    app.set_result("Draft reset to Field notes".into());
                }
                FormAction::Submit => {
                    let result = match ProjectName::parse(&draft) {
                        Some(name) => format!("Accepted in Rust: {}", name.0),
                        None => "Enter a project name before submitting".into(),
                    };
                    app.set_result(result.into());
                }
            }
        }
    });
    app.run()
}

Cargo.toml and build.rs

Cargo.toml

[package]
name = "slint-kit-submit-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

Supply text and handle form-action(FormAction.submit) using the form’s accepted values. Project asynchronous work through busy.

It inherits KitFormButton, with action: FormAction.submit and intent: ButtonIntent.primary. It performs no implicit validation.

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
Primary button preset for requesting form submission.
Native screenshot of the same example, rendered with Skia.
// SPDX-License-Identifier: GPL-3.0-or-later
import { KitSubmitButton, KitTheme, KitThemes } from "@kit/kit.slint";

export component Example inherits Window {
    title: "KitSubmitButton example";
    preferred-width: 360px;
    preferred-height: 160px;
    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: "Submit Button"; color: root.theme.text-primary; font-size: 20px * root.theme.text-scale; font-weight: 600; }
        KitSubmitButton { theme: root.theme; text: "Create account"; activated => { root.status = "Action 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 KitFormButton.

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
text string KitButton
action FormAction KitFormButton
form-no-validate bool KitFormButton

See also