Introdução: GUI em Rust Nunca Esteve Tão Madura
Durante anos, a ausência de um framework GUI consolidado foi uma das críticas mais comuns à linguagem Rust. Desenvolvedores que queriam criar aplicações desktop com interface gráfica precisavam lidar com bindings incompletos, APIs instáveis e documentação escassa. Em 2026, esse cenário mudou radicalmente.
O ecossistema GUI de Rust conta hoje com pelo menos seis frameworks robustos, cada um com filosofia e público-alvo distintos. Desde soluções nativas multiplataforma até abordagens híbridas com tecnologias web, há opções maduras para praticamente qualquer necessidade. Se você está acompanhando a evolução do ecossistema Rust, sabe que esse é um dos segmentos que mais cresceu nos últimos dois anos.
Neste artigo, vamos analisar em profundidade os melhores frameworks GUI em Rust para 2026: Iced, Tauri, Dioxus, egui, Slint e gtk-rs. Para cada um, apresentamos uma descrição, quando usar, prós e contras, e um exemplo de código funcional. Ao final, trazemos uma tabela comparativa e recomendações por caso de uso.
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
| 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 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.