Para criar GUI em Rust em 2026, escolha Tauri se sua equipe já domina frontend web; Iced para uma aplicação desktop 100% Rust; egui para ferramentas e protótipos; Slint para interfaces declarativas e embarcadas; Dioxus para compartilhar uma UI escrita em Rust entre desktop, web e mobile; e gtk-rs para integração nativa com GTK/GNOME. Não existe um vencedor universal: o melhor framework depende de renderização, aparência, tamanho do binário, acessibilidade e competências da equipe.
Durante anos, a ausência de um framework GUI consolidado foi uma das críticas mais comuns à linguagem. Hoje o ecossistema oferece opções com filosofias bem diferentes: WebView, renderização por GPU, immediate mode, linguagem declarativa e bindings para toolkits maduros. Isso é uma vantagem, desde que a decisão seja feita pelo produto — e não apenas pelo framework mais popular.
Resposta rápida: qual framework GUI em Rust escolher?
| Se você precisa de… | Comece avaliando | Motivo principal |
|---|---|---|
| Reaproveitar React, Vue, Svelte, HTML e CSS | Tauri | Backend Rust com frontend web no WebView nativo |
| Aplicação desktop escrita inteiramente em Rust | Iced | Arquitetura Elm/MVU e renderização por GPU |
| Ferramenta interna, editor, debug ou protótipo | egui | API immediate mode rápida de implementar |
| UI declarativa para desktop ou embarcados | Slint | Separação entre interface e lógica, footprint controlável |
| Compartilhar componentes Rust entre desktop, web e mobile | Dioxus | Modelo inspirado em React com múltiplos targets |
| Integração forte com Linux e GNOME | gtk-rs | GTK4 maduro, acessibilidade e muitos widgets |
Se a principal dúvida é Tauri vs Electron, veja o comparativo dedicado. Para interfaces web compiladas para WebAssembly, compare também Leptos, Dioxus e Yew. Neste guia, o foco é a escolha de um framework desktop e GUI em Rust.
Antes de escolher: cinco critérios que mudam a decisão
- Tecnologia de renderização: Tauri usa o WebView do sistema; Iced e egui desenham a interface; gtk-rs usa GTK; Slint compila sua descrição declarativa.
- Competência da equipe: uma equipe de frontend tende a entregar mais rápido com Tauri; uma equipe Rust pode preferir Iced, egui, Slint ou Dioxus.
- Tipo de produto: painel técnico, aplicativo comercial, editor, software embarcado e app multiplataforma têm necessidades diferentes.
- Integração e acessibilidade: toolkits nativos e web têm ecossistemas de widgets, automação e acessibilidade distintos.
- Risco de manutenção: avalie estabilidade da API, licença, dependências do sistema e facilidade de contratar pessoas para manter a stack.
Iced: GUI Nativa Inspirada no Elm
O Iced é um framework GUI multiplataforma que segue a arquitetura Elm (Model-View-Update). Ele renderiza interfaces de forma nativa usando wgpu como backend gráfico, o que significa que não depende de WebView nem de toolkits do sistema operacional.
Quando Usar
- Aplicações desktop nativas com visual moderno e customizado
- Projetos que valorizam uma arquitetura funcional e previsível
- Ferramentas internas e dashboards com gráficos e animações
Prós e Contras
Prós: API idiomática em Rust, renderização GPU acelerada, arquitetura limpa e testável, suporte a temas customizados.
Contras: Ecossistema de widgets menor que GTK, curva de aprendizado para quem não conhece o padrão Elm, ainda sem suporte mobile estável.
Exemplo de Código
use iced::widget::{button, column, text};
use iced::{Element, Task};
#[derive(Default)]
struct Contador {
valor: i32,
}
#[derive(Debug, Clone)]
enum Mensagem {
Incrementar,
Decrementar,
}
impl Contador {
fn update(&mut self, mensagem: Mensagem) -> Task<Mensagem> {
match mensagem {
Mensagem::Incrementar => self.valor += 1,
Mensagem::Decrementar => self.valor -= 1,
}
Task::none()
}
fn view(&self) -> Element<Mensagem> {
column![
button("+ Incrementar").on_press(Mensagem::Incrementar),
text(format!("Valor: {}", self.valor)).size(40),
button("- Decrementar").on_press(Mensagem::Decrementar),
]
.padding(20)
.spacing(10)
.into()
}
}
fn main() -> iced::Result {
iced::application("Contador Iced", Contador::update, Contador::view)
.run()
}
Para incluir o Iced no seu projeto, adicione ao Cargo.toml:
[dependencies]
iced = "0.13"
Tauri: Aplicações Híbridas Leves
O Tauri é um framework para construir aplicações desktop usando Rust no backend e tecnologias web (HTML, CSS, JavaScript/TypeScript) no frontend. Ele utiliza o WebView nativo do sistema operacional, resultando em binários muito menores que o Electron.
Quando Usar
- Aplicações desktop que se beneficiam de uma interface web rica
- Equipes que já possuem expertise em frontend web (React, Vue, Svelte)
- Projetos que precisam de binários pequenos e baixo consumo de memória
Prós e Contras
Prós: Binários extremamente pequenos (< 5 MB), usa WebView nativo, ecossistema frontend completo, excelente sistema de plugins, suporte a mobile (Android e iOS) a partir do Tauri v2.
Contras: Performance da UI depende do WebView, debugging mais complexo entre camadas Rust e JS, a interface não é verdadeiramente nativa.
Exemplo de Código
Backend Rust com um comando Tauri:
use tauri::command;
#[command]
fn saudacao(nome: &str) -> String {
format!("Olá, {}! Bem-vindo ao app Tauri com Rust.", nome)
}
fn main() {
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![saudacao])
.run(tauri::generate_context!())
.expect("Erro ao iniciar aplicação Tauri");
}
No frontend (JavaScript), o comando é chamado assim:
import { invoke } from "@tauri-apps/api/core";
const resposta = await invoke("saudacao", { nome: "Maria" });
console.log(resposta); // "Olá, Maria! Bem-vindo ao app Tauri com Rust."
Se você está avaliando Tauri versus outras stacks, pode ser interessante ler nosso comparativo entre Rust e Go para entender como Rust se destaca em aplicações de sistema.
Dioxus: React para Rust
O Dioxus traz o modelo de componentes do React para o mundo Rust. Ele suporta múltiplos targets: desktop (via WebView ou WGPU), web (WebAssembly), mobile e terminal. A sintaxe RSX é familiar para quem vem do React/JSX.
Quando Usar
- Desenvolvedores que vêm do ecossistema React e querem usar Rust
- Projetos que precisam rodar em múltiplas plataformas com o mesmo código
- Aplicações com interfaces dinâmicas e reativas
Prós e Contras
Prós: Sintaxe RSX intuitiva, hot-reloading, suporte a múltiplos targets com código compartilhado, hooks e estado reativo, comunidade ativa e em rápido crescimento.
Contras: Ainda em evolução, API pode ter breaking changes entre versões, ecossistema de componentes de terceiros ainda menor que React.
Exemplo de Código
use dioxus::prelude::*;
fn main() {
dioxus::launch(App);
}
#[component]
fn App() -> Element {
let mut contador = use_signal(|| 0);
rsx! {
div {
style: "padding: 20px; font-family: sans-serif;",
h1 { "Contador Dioxus" }
p { "Valor atual: {contador}" }
button {
onclick: move |_| contador += 1,
"Incrementar"
}
button {
onclick: move |_| contador -= 1,
"Decrementar"
}
}
}
}
egui: GUI Imediata para Ferramentas e Prototipagem
O egui é uma biblioteca de GUI no modo imediato (immediate mode), inspirada em Dear ImGui. Ele é ideal para ferramentas de desenvolvimento, editores, painéis de debug e prototipagem rápida.
Quando Usar
- Ferramentas internas, editores e painéis de debug
- Prototipagem rápida de interfaces
- Aplicações que precisam integrar GUI em engines gráficas ou jogos
- Visualização de dados em tempo real
Prós e Contras
Prós: Extremamente simples de usar, sem estado externo para gerenciar, renderização instantânea, funciona em WebAssembly, integração fácil com wgpu e OpenGL.
Contras: Visual menos polido para aplicações voltadas ao consumidor final, não segue convenções nativas de cada sistema operacional, menos adequado para formulários complexos.
Exemplo de Código
use eframe::egui;
fn main() -> eframe::Result {
let opcoes = eframe::NativeOptions::default();
eframe::run_native(
"Meu App egui",
opcoes,
Box::new(|_cc| Ok(Box::new(MeuApp::default()))),
)
}
#[derive(Default)]
struct MeuApp {
nome: String,
idade: u32,
}
impl eframe::App for MeuApp {
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
egui::CentralPanel::default().show(ctx, |ui| {
ui.heading("Cadastro");
ui.horizontal(|ui| {
ui.label("Nome:");
ui.text_edit_singleline(&mut self.nome);
});
ui.add(egui::Slider::new(&mut self.idade, 0..=120).text("Idade"));
if ui.button("Enviar").clicked() {
println!("Nome: {}, Idade: {}", self.nome, self.idade);
}
});
}
}
Para usar egui com eframe, adicione ao Cargo.toml:
[dependencies]
eframe = "0.30"
Slint: GUI Declarativa com Linguagem Própria
O Slint (anteriormente SixtyFPS) é um toolkit GUI declarativo que utiliza uma linguagem de marcação própria (.slint) para definir interfaces. Ele gera código nativo altamente otimizado e suporta desktop, embedded e WebAssembly.
Quando Usar
- Aplicações com design visual sofisticado e animações
- Projetos embarcados (microcontroladores, painéis industriais)
- Equipes com designers que querem participar da criação da UI
- Aplicações comerciais (licença comercial disponível)
Prós e Contras
Prós: Linguagem declarativa intuitiva, preview em tempo real, performance excelente em dispositivos embarcados, separação limpa entre UI e lógica de negócios, ferramentas de design integradas.
Contras: Linguagem proprietária adiciona complexidade ao projeto, licença dual (GPLv3 ou comercial paga), ecossistema menor que outras opções.
Exemplo de Código
Arquivo ui/app.slint:
export component AppWindow inherits Window {
title: "Contador Slint";
width: 300px;
height: 200px;
in-out property <int> valor: 0;
callback incrementar();
callback decrementar();
VerticalLayout {
alignment: center;
spacing: 10px;
padding: 20px;
Text {
text: "Valor: " + valor;
font-size: 24px;
horizontal-alignment: center;
}
HorizontalLayout {
alignment: center;
spacing: 10px;
Button { text: "+ Incrementar"; clicked => { incrementar(); } }
Button { text: "- Decrementar"; clicked => { decrementar(); } }
}
}
}
Arquivo src/main.rs:
slint::include_modules!();
fn main() {
let janela = AppWindow::new().unwrap();
let janela_fraca = janela.as_weak();
janela.on_incrementar(move || {
let janela = janela_fraca.unwrap();
janela.set_valor(janela.get_valor() + 1);
});
let janela_fraca = janela.as_weak();
janela.on_decrementar(move || {
let janela = janela_fraca.unwrap();
janela.set_valor(janela.get_valor() - 1);
});
janela.run().unwrap();
}
gtk-rs: Bindings GTK Nativos
O gtk-rs fornece bindings seguros para as bibliotecas GTK4, GLib e GIO. É a escolha natural para aplicações que devem se integrar perfeitamente ao ecossistema GNOME e ao desktop Linux.
Quando Usar
- Aplicações para o ecossistema GNOME/Linux
- Projetos que precisam de look-and-feel nativo no Linux
- Aplicações com widgets complexos (árvores, listas virtualizadas, rich text)
- Quando o acesso ao ecossistema completo de bibliotecas GLib é necessário
Prós e Contras
Prós: Toolkit maduro e estável (GTK4), enorme variedade de widgets, excelente integração com o desktop Linux, acessibilidade robusta, ampla documentação.
Contras: Experiência no macOS e Windows é inferior à do Linux, dependências externas (bibliotecas GTK devem estar instaladas), API verbosa em comparação com frameworks mais modernos.
Exemplo de Código
use gtk4::prelude::*;
use gtk4::{Application, ApplicationWindow, Button, Label, Box as GtkBox, Orientation};
use std::cell::Cell;
use std::rc::Rc;
fn main() {
let app = Application::builder()
.application_id("br.com.rustlang.exemplo")
.build();
app.connect_activate(|app| {
let valor = Rc::new(Cell::new(0i32));
let label = Label::new(Some("Valor: 0"));
label.set_margin_top(10);
label.set_margin_bottom(10);
let valor_inc = valor.clone();
let label_inc = label.clone();
let btn_inc = Button::with_label("+ Incrementar");
btn_inc.connect_clicked(move |_| {
valor_inc.set(valor_inc.get() + 1);
label_inc.set_text(&format!("Valor: {}", valor_inc.get()));
});
let valor_dec = valor.clone();
let label_dec = label.clone();
let btn_dec = Button::with_label("- Decrementar");
btn_dec.connect_clicked(move |_| {
valor_dec.set(valor_dec.get() - 1);
label_dec.set_text(&format!("Valor: {}", valor_dec.get()));
});
let caixa = GtkBox::new(Orientation::Vertical, 5);
caixa.set_margin_top(20);
caixa.set_margin_bottom(20);
caixa.set_margin_start(20);
caixa.set_margin_end(20);
caixa.append(&btn_inc);
caixa.append(&label);
caixa.append(&btn_dec);
let janela = ApplicationWindow::builder()
.application(app)
.title("Contador GTK-rs")
.child(&caixa)
.default_width(300)
.default_height(200)
.build();
janela.present();
});
app.run();
}
Para usar gtk-rs, adicione ao Cargo.toml:
[dependencies]
gtk4 = "0.9"
Tabela Comparativa dos Frameworks GUI em Rust
A tabela abaixo é uma triagem, não um benchmark absoluto. Tamanho final, consumo de memória e aparência variam com features, assets, otimização, sistema operacional e complexidade do aplicativo.
| Característica | Iced | Tauri | Dioxus | egui | Slint | gtk-rs |
|---|---|---|---|---|---|---|
| Arquitetura | Elm (MVU) | Híbrida (Rust + Web) | Componentes (React) | Modo imediato | Declarativa (.slint) | Orientada a objetos |
| Renderização | wgpu (GPU) | WebView nativo | WebView / WGPU | wgpu / OpenGL | Nativa / Software | GTK4 nativo |
| Maturidade | Alta | Muito alta | Média-alta | Alta | Média-alta | Muito alta |
| Facilidade de uso | Média | Alta (se sabe web) | Alta (se sabe React) | Muito alta | Alta | Média |
| Desktop | Windows, macOS, Linux | Windows, macOS, Linux | Windows, macOS, Linux | Windows, macOS, Linux | Windows, macOS, Linux | Windows, macOS, Linux |
| Mobile | Experimental | Android, iOS (v2) | Android, iOS | Limitado | Embarcados | Limitado |
| Web (WASM) | Sim | N/A (usa web nativamente) | Sim | Sim | Sim | Limitado |
| Tamanho do binário | Médio (~10 MB) | Pequeno (~3-5 MB) | Médio (~8 MB) | Pequeno (~5 MB) | Pequeno (~3 MB) | Grande (deps GTK) |
| Licença | MIT | MIT / Apache-2.0 | MIT / Apache-2.0 | MIT / Apache-2.0 | GPLv3 / Comercial | MIT |
| Ideal para | Apps desktop modernas | Apps híbridas | Apps multiplataforma | Ferramentas / debug | Embarcados / design | Apps Linux / GNOME |
Como Escolher: Recomendações por Caso de Uso
A escolha do framework certo depende do contexto do seu projeto. Aqui estão nossas recomendações:
Para aplicações desktop com visual nativo no Linux: gtk-rs continua sendo a melhor opção. A maturidade do GTK4, a variedade de widgets e a integração com o desktop GNOME são imbatíveis.
Para aplicações desktop modernas multiplataforma: Iced é a escolha mais sólida se você quer ficar 100% no ecossistema Rust. A arquitetura Elm torna o código previsível e fácil de testar.
Para equipes com experiência em frontend web: Tauri oferece o melhor dos dois mundos. Você mantém suas habilidades em React, Vue ou Svelte no frontend e ganha toda a performance e segurança do Rust no backend.
Para prototipagem rápida e ferramentas internas: egui é imbatível em simplicidade. Em poucas linhas você tem uma interface funcional. Perfeito para dashboards, editores e painéis de debug.
Para projetos que precisam rodar em múltiplas plataformas (incluindo mobile): Dioxus é o mais versátil, permitindo compartilhar código entre desktop, web e mobile com a mesma base.
Para dispositivos embarcados e interfaces com design sofisticado: Slint foi projetado exatamente para isso. A linguagem declarativa facilita a criação de interfaces bonitas com animações fluidas, mesmo em hardware limitado.
Para explorar mais bibliotecas e ferramentas do ecossistema Rust, visite nossa seção de projetos e confira também nossos artigos técnicos com tutoriais aprofundados.
Conclusão
O desenvolvimento GUI em Rust amadureceu significativamente em 2026. Não existe mais a desculpa de que “Rust não serve para GUI”. Cada um dos seis frameworks apresentados resolve um conjunto específico de problemas, e todos são ativamente mantidos com comunidades crescentes.
Se você está começando agora, nossa sugestão é escolher o framework que mais se alinha com sua experiência prévia e com os requisitos do projeto. Experimente o egui para algo rápido, o Tauri se você vem do mundo web, ou o Iced se quer uma experiência puramente Rust. O importante é começar a construir.
O futuro das interfaces gráficas em Rust é promissor, e a comunidade brasileira está acompanhando de perto. Continue acompanhando o Rust Brasil para mais conteúdos atualizados sobre a linguagem.
Perguntas Frequentes
Qual é o melhor framework GUI em Rust em 2026?
Depende do produto. Use Tauri quando a equipe já domina frontend web; Iced para uma aplicação desktop 100% Rust com arquitetura declarativa; egui para ferramentas internas e protótipos; Slint para interfaces declarativas, embarcadas ou comerciais; Dioxus quando compartilhar componentes entre desktop, web e mobile é prioridade.
Tauri ou Iced: qual escolher?
Escolha Tauri se quer aproveitar HTML, CSS, JavaScript/TypeScript e o ecossistema de React, Vue ou Svelte. Escolha Iced se quer manter a interface em Rust, usar renderização GPU e organizar o estado com Model-View-Update. Tauri costuma reduzir o tempo de entrega para equipes web; Iced reduz a divisão entre frontend e backend para equipes Rust.
egui serve para aplicações desktop profissionais?
Sim, especialmente em ferramentas técnicas, editores, dashboards, visualizadores e painéis de debug. Para aplicativos voltados ao consumidor com muitos formulários, acessibilidade e convenções nativas, compare também Tauri, Iced, Slint e gtk-rs.
Dioxus ou Tauri: qual é a diferença?
Tauri é um shell de aplicação: a lógica privilegiada fica em Rust e a interface normalmente usa tecnologias web no WebView do sistema. Dioxus é um framework de componentes inspirado em React, mas escrito em Rust e capaz de mirar desktop, web e mobile. A escolha depende de querer reaproveitar uma stack web existente ou escrever a UI em Rust.
Slint ou Tauri para desktop?
Slint é indicado quando uma UI declarativa compilada, integração com Rust e suporte a embarcados são prioridades. Tauri faz mais sentido quando o projeto quer reaproveitar frontend web e suas bibliotecas. Verifique também a licença aplicável ao seu produto antes de adotar Slint.
Qual o melhor framework GUI em Rust para iniciantes?
O egui é o mais simples para começar. Sua API no modo imediato elimina a necessidade de gerenciar estado complexo e permite criar interfaces funcionais em poucas linhas de código. Para quem já tem experiência com desenvolvimento web, o Tauri também é excelente porque permite usar HTML, CSS e JavaScript no frontend.
Rust é bom para desenvolvimento de aplicações desktop?
Sim. Em 2026, Rust é uma excelente escolha para aplicações desktop. A linguagem oferece performance nativa, segurança de memória garantida em tempo de compilação e um ecossistema GUI diversificado. Frameworks como Iced, Tauri e Slint produzem aplicações profissionais multiplataforma com binários pequenos e baixo consumo de recursos.
Tauri é melhor que Electron?
Tauri supera o Electron em praticamente todas as métricas técnicas: binários até 100 vezes menores, consumo de memória significativamente menor e melhor performance. A principal vantagem do Electron ainda é o ecossistema mais maduro e a familiaridade de muitas equipes. Porém, com o Tauri v2 suportando mobile e uma comunidade cada vez maior, a diferença diminui a cada dia.
Posso criar apps mobile com GUI em Rust?
Sim, embora o suporte mobile ainda esteja em evolução. O Tauri v2 suporta Android e iOS oficialmente. O Dioxus também permite compilar para mobile. O Slint funciona em dispositivos embarcados com tela. Para projetos mobile críticos, é recomendável avaliar a maturidade do suporte mobile do framework escolhido antes de se comprometer.