Slint Kit Documentation

Saisie de texte

Champ texte pour Slint

KitTextField · Slint Kit 0.3.1

Saisie native sur une ligne avec libellé et message de validation.

Saisie native sur une ligne avec libellé et message de validation.
Application native de l’exemple ci-dessous.

Essayer le composant

Télécharger le projet complet, le décompresser et lancer cargo run --locked dans son dossier. Rust 1.92+ ; Slint Kit 0.3.0 depuis crates.io. Vous pouvez aussi copier les quatre fichiers ci-dessous.

Saisissez un brouillon puis cliquez sur Accept pour l’envoyer à Rust. Cet exemple accepte un texte non vide ; le type de champ ne valide pas sa signification métier.

ui/app.slint

export { KitFormValidation, HtmlInputKind, NumberInputFormat, KitInputConstraints, KitValidationResult, KitValidityState } from "@kit/kit.slint";
import { KitTextField, KitButton, KitThemes, ValidationPresentation } from "@kit/kit.slint";
export component App inherits Window {
    title: "Text field"; preferred-width: 520px; preferred-height: 320px;
    max-width: 100000px; max-height: 100000px; background: KitThemes.light.canvas;
    in-out property <string> draft; in property <string> error; in property <string> accepted;
    callback edited(string); callback commit(); callback blurred(); callback cancel();
    
    VerticalLayout {
        padding: 24px; spacing: 16px; alignment: start;
        control := KitTextField {
            required: true;
            label: "Text field"; text <=> root.draft; error: root.error;
            validation: root.error != "" ? ValidationPresentation.invalid : ValidationPresentation.pristine;
            
            edited(value) => { root.edited(value); }
            commit-requested(value) => { root.commit(); }
            cancelled => { root.cancel(); }
            focus-observed(focused) => { if (!focused) { root.blurred(); } }
            
        }
        KitButton { text: "Accept"; activated => { root.commit(); } }
        Text { text: "Accepted: " + root.accepted; color: KitThemes.light.text-primary; wrap: word-wrap; }
    }
}

src/main.rs

use slint::ComponentHandle;
use slint_kit::*;
slint::include_modules!();
#[derive(Clone, PartialEq)]
struct Value(String);
fn parse(text: &str) -> DraftValue<Value> {
    if text.is_empty() {
        DraftValue::Empty
    } else {
        DraftValue::Parsed(Value(text.into()))
    }
}
fn format(value: &Value) -> String {
    value.0.clone()
}
fn main() -> Result<(), slint::PlatformError> {
    let app = App::new()?;
    slint_kit::init_form_validation!(self, app);
    let initial = Value("Alex Morgan".into());
    app.set_accepted(format(&initial).into());
    let weak = app.as_weak();
    let field = FieldBinding::<Value, ()>::new(
        Some(initial),
        Ownership::Local,
        CommitPolicy::OnBlur,
        AbsencePolicy::Required,
        parse,
        format,
        |_| String::new(),
        move |view| {
            if let Some(app) = weak.upgrade() {
                app.set_draft(view.draft.into());
                app.set_error(view.error.into());
            }
        },
    );
    field.set_html_constraints(slint_kit::HtmlConstraints {
        kind: slint_kit::HtmlInputKind::Text, required: true,
        ..Default::default()
    });
    let weak = app.as_weak();
    field.on_intent(move |intent| {
        if let Some(app) = weak.upgrade() {
            if let FieldIntent::Commit(value) = intent {
                app.set_accepted(format(&value).into());
            }
        }
    });
    let binding = field.clone();
    app.on_edited(move |text| {
        let _ = binding.edited(&text);
    });
    let binding = field.clone();
    app.on_commit(move || {
        let _ = binding.commit(CommitTrigger::Submit);
    });
    let binding = field.clone();
    app.on_blurred(move || {
        let _ = binding.commit(CommitTrigger::Blur);
    });
    let binding = field.clone();
    app.on_cancel(move || binding.cancel());

    app.run()
}

Cargo.toml et build.rs

Cargo.toml

[package]
name = "slint-kit-text-field-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");
}

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

Liez text au brouillon et gérez edited, commit-requested et cancelled. FieldBinding conserve la dernière valeur acceptée.

L’exemple accepte le texte non vide à la perte de focus ou avec Accepter. L’édition native conserve curseur, sélection et annulation.

Choisir entre une option intégrée et une composition personnalisée

Options partagées

Composition visuelle

Le fichier ci-dessous produit la capture. Pour les composants pilotés par un contrôleur, il montre l’état affiché sans fournir le branchement Rust. Créer un projet.

Afficher le fichier de la capture
Saisie native sur une ligne avec libellé et message de validation.
Capture native du même exemple, moteur Skia.
// Public label overrides localize this fixture; toolkit/host defaults keep their language.
// SPDX-License-Identifier: GPL-3.0-or-later
import { KitTextField, KitTheme, KitThemes } from "@kit/kit.slint";

export component Example inherits Window {
    title: "KitTextField — exemple";
    preferred-width: 420px;
    preferred-height: 180px;
    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: "Champ de texte"; color: root.theme.text-primary; font-size: 20px * root.theme.text-scale; font-weight: 600; }
        KitTextField { character-count-label: "caractères"; checking-label: "Vérification…"; clear-label: "Effacer la recherche"; hide-label: "Masquer le mot de passe"; reveal-label: "Afficher le mot de passe"; theme: root.theme; label: "Nom du projet"; text: "Notes de terrain"; edited(value) => { root.status = "Brouillon : " + value; } }
        if root.status != "": Text { text: root.status; color: root.theme.text-secondary; font-size: 12px * root.theme.text-scale; wrap: word-wrap; }
    }
}

Télécharger cet exemple

API publique

Hérite de KitField.

Propriétés

Nom Type Sens
theme KitTheme in
control-size ControlSize in
access FieldAccess in
validation ValidationPresentation in
purpose TextPurpose in
input-type InputType in
input-kind HtmlInputKind in
validation-twelve-hour bool in
number-format NumberInputFormat in
validation-text string in
display-text string in
intrinsic-error string in
required bool in
multiple bool in
min-length int in
max-length int in
pattern string in
pattern-enabled bool in
min string in
max string in
step string in
default-value string in
validation-timing ValidationTiming in
custom-validity string in-out
required-message string in
email-message string in
url-message string in
pattern-message string in
too-short-message string in
too-long-message string in
underflow-message string in
overflow-message string in
step-message string in
bad-input-message string in
validity KitValidityState out
will-validate bool out
validation-ready bool out
validation-message string out
pattern-error string out
value string out
dirty bool out
touched bool out
secret-visibility SecretVisibility in-out
line-mode TextLineMode in
resize-policy ResizePolicy in
min-lines int in
max-lines int in
label string in
accessible-name string in
input-method-hints InputMethodHints in
show-validation-message bool in
validation-visible bool out
description string in
error string in
placeholder string in
text-letter-spacing length in
text-alignment TextHorizontalAlignment in
prefix string in
suffix string in
text string in-out
show-character-count bool in
character-count int in
reveal-label string in
hide-label string in
clear-label string in
character-count-label string in
checking-label string in
has-focus bool out

Types et variantes

Type Déclaration
enum ControlSize compact, medium, comfortable
enum FieldAccess editable, read-only, disabled
enum HtmlInputKind text, search, telephone, email, url, password, text-area, number, date, month, week, time, date-time-local, checkbox, radio, select, file, range, color
struct KitValidityState valid: bool, value-missing: bool, type-mismatch: bool, pattern-mismatch: bool, too-long: bool, too-short: bool, range-underflow: bool, range-overflow: bool, step-mismatch: bool, bad-input: bool, custom-error: bool,
enum NumberInputFormat canonical, decimal-comma
enum ResizePolicy fixed, auto-grow
enum SecretVisibility hidden, revealed
enum TextLineMode single-line, multiline
enum TextPurpose plain, email, url, telephone, password, search
enum ValidationPresentation pristine, checking, valid, invalid
enum ValidationTiming on-blur, on-input, on-submit

Signaux

Fonctions

Voir aussi