Champ monétaire pour Slint
KitMoneyField · Slint Kit 0.3.1
Saisie numérique reliée à Money avec CurrencyCode CAD en Rust.

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 montant CAD avec au plus deux décimales puis acceptez. Rust conserve Money avec une devise CAD explicite et un montant décimal exact.
ui/app.slint
export { KitFormValidation, HtmlInputKind, NumberInputFormat, KitInputConstraints, KitValidationResult, KitValidityState } from "@kit/kit.slint";
import { KitMoneyField, KitButton, KitThemes, ValidationPresentation } from "@kit/kit.slint";
export component App inherits Window {
title: "Amount (CAD)"; 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 := KitMoneyField {
required: true;
label: "Amount (CAD)"; text <=> root.draft; error: root.error;
validation: root.error != "" ? ValidationPresentation.invalid : ValidationPresentation.pristine;
placeholder: "12.50";
edited(value) => { root.edited(value); }
commit-requested(value) => { root.commit(); }
cancelled => { root.cancel(); }
focus-observed(focused) => { if (!focused) { root.blurred(); } }
prefix: "CAD";
}
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!();
type Value = Money;
fn parse(text: &str) -> DraftValue<Value> {
match (DecimalRules {
locale: NumberLocale::EnCa,
scale: DecimalScale::new(2).unwrap(),
sign: SignPolicy::NonNegative,
bounds: None,
})
.parse(text)
{
DraftValue::Parsed(value) => DraftValue::Parsed(Money {
amount: value,
currency: CurrencyCode::new("CAD").unwrap(),
}),
DraftValue::Empty => DraftValue::Empty,
DraftValue::Incomplete => DraftValue::Incomplete,
DraftValue::Invalid(issue) => DraftValue::Invalid(issue),
}
}
fn format(value: &Value) -> String {
value.amount.to_string()
}
fn main() -> Result<(), slint::PlatformError> {
let app = App::new()?;
slint_kit::init_form_validation!(self, app);
let initial = Money {
amount: DecimalValue::from_integer(12),
currency: CurrencyCode::new("CAD").unwrap(),
};
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::Number, required: true,
step: Some("any".into()),
..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-money-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
Utilisez FieldBinding avec un parseur, un formateur et une politique de validation explicites. L’exemple fixe CAD et accepte les montants positifs ou nuls avec deux décimales au maximum.
Le brouillon reste distinct de la valeur typée acceptée. Une saisie invalide ou incomplète affiche une erreur sans remplacer cette valeur.
Choisir entre une option intégrée et une composition personnalisée
Options partagées
label— propriété intégrée ; exemple de composition personnalisédescription— propriété intégrée ; exemple de composition personnaliséerror— propriété intégrée ; exemple de composition personnalisé
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

// Public label overrides localize this fixture; toolkit/host defaults keep their language.
// SPDX-License-Identifier: GPL-3.0-or-later
// Display projections are fixtures. Validate accepted domain values in Rust.
import { KitMoneyField, KitTheme, KitThemes } from "@kit/kit.slint";
export component Example inherits Window {
title: "KitMoneyField — 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 monétaire"; color: root.theme.text-primary; font-size: 20px * root.theme.text-scale; font-weight: 600; }
KitMoneyField { 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: "Budget"; text: "129.95"; prefix: "$"; 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; }
}
}
API publique
Hérite de KitDecimalField.
Propriétés héritées disponibles
| Nom | Type | Définie sur |
|---|---|---|
theme |
KitTheme |
KitTextField |
control-size |
ControlSize |
KitTextField |
access |
FieldAccess |
KitTextField |
validation |
ValidationPresentation |
KitTextField |
purpose |
TextPurpose |
KitTextField |
input-type |
InputType |
KitTextField |
input-kind |
HtmlInputKind |
KitTextField |
validation-twelve-hour |
bool |
KitTextField |
number-format |
NumberInputFormat |
KitTextField |
validation-text |
string |
KitTextField |
display-text |
string |
KitTextField |
intrinsic-error |
string |
KitTextField |
required |
bool |
KitTextField |
multiple |
bool |
KitTextField |
min-length |
int |
KitTextField |
max-length |
int |
KitTextField |
pattern |
string |
KitTextField |
pattern-enabled |
bool |
KitTextField |
min |
string |
KitTextField |
max |
string |
KitTextField |
step |
string |
KitTextField |
default-value |
string |
KitTextField |
validation-timing |
ValidationTiming |
KitTextField |
custom-validity |
string |
KitTextField |
required-message |
string |
KitTextField |
email-message |
string |
KitTextField |
url-message |
string |
KitTextField |
pattern-message |
string |
KitTextField |
too-short-message |
string |
KitTextField |
too-long-message |
string |
KitTextField |
underflow-message |
string |
KitTextField |
overflow-message |
string |
KitTextField |
step-message |
string |
KitTextField |
bad-input-message |
string |
KitTextField |
validity |
KitValidityState |
KitTextField |
will-validate |
bool |
KitTextField |
validation-ready |
bool |
KitTextField |
validation-message |
string |
KitTextField |
pattern-error |
string |
KitTextField |
value |
string |
KitTextField |
dirty |
bool |
KitTextField |
touched |
bool |
KitTextField |
secret-visibility |
SecretVisibility |
KitTextField |
line-mode |
TextLineMode |
KitTextField |
resize-policy |
ResizePolicy |
KitTextField |
min-lines |
int |
KitTextField |
max-lines |
int |
KitTextField |
label |
string |
KitTextField |
accessible-name |
string |
KitTextField |
input-method-hints |
InputMethodHints |
KitTextField |
show-validation-message |
bool |
KitTextField |
validation-visible |
bool |
KitTextField |
description |
string |
KitTextField |
error |
string |
KitTextField |
placeholder |
string |
KitTextField |
text-letter-spacing |
length |
KitTextField |
text-alignment |
TextHorizontalAlignment |
KitTextField |
prefix |
string |
KitTextField |
suffix |
string |
KitTextField |
text |
string |
KitTextField |
show-character-count |
bool |
KitTextField |
character-count |
int |
KitTextField |
reveal-label |
string |
KitTextField |
hide-label |
string |
KitTextField |
clear-label |
string |
KitTextField |
character-count-label |
string |
KitTextField |
checking-label |
string |
KitTextField |
has-focus |
bool |
KitTextField |