Introdução a GTK+ em C

Uma breve introdução de como começar a desenvolver interfaces gráficas em C utilizando a biblioteca GTK+.

[ Hits: 83.836 ]

Por: Fábio Hideki Endo em 09/07/2010


Mais um exemplo



Vamos fazer mais um exemplo, com um pouco mais de funcionalidade. Vamos fazer um conversor de temperatura (quem já não fez um.... talvez em VB? :-)).

#include <stdio.h>
#include <gtk/gtk.h>

GtkWidget *entrada;
GtkWidget *label_saida;

gboolean converter(GtkButton *button, gpointer data) {
  double celsius;
  double fahrenheit;
  char texto[128];

  celsius=atol(gtk_entry_get_text(GTK_ENTRY(entrada)));

  fahrenheit=celsius*1.8+32;
  sprintf(texto, "%.1f ºC = %.1f ºF", celsius, fahrenheit);
  gtk_label_set_text(GTK_LABEL(label_saida), texto);

  return FALSE;
}

int main(int argc, char **argv) {
  GtkWidget *janela;
  GtkWidget *conteudo;
  GtkWidget *label_entrada;
  GtkWidget *botao;

  gtk_init(&argc, &argv);

  janela=gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_position(GTK_WINDOW(janela), GTK_WIN_POS_CENTER);

  conteudo=gtk_vbox_new(FALSE, 0);
  gtk_container_add(GTK_CONTAINER(janela), conteudo);

  label_entrada=gtk_label_new("Digite a temperatura em ºC");
  gtk_box_pack_start(GTK_BOX(conteudo), label_entrada, FALSE, FALSE, 0);

  entrada=gtk_entry_new();
  gtk_box_pack_start(GTK_BOX(conteudo), entrada, FALSE, FALSE, 0);

  botao=gtk_button_new_with_label("Converter para ºF");
  gtk_box_pack_start(GTK_BOX(conteudo), botao, FALSE, FALSE, 0);

  label_saida=gtk_label_new("ºC = ºF");
  gtk_box_pack_start(GTK_BOX(conteudo), label_saida, FALSE, FALSE, 0);

  g_signal_connect(G_OBJECT(janela), "destroy", G_CALLBACK(gtk_main_quit), NULL);
  g_signal_connect(G_OBJECT(botao), "clicked", G_CALLBACK(converter), NULL);

  gtk_widget_show_all(janela);

  gtk_main();

  return 0;
}

Agora uma explicação mais detalhada:
  • Primeiro declaramos a janela e definimos a posição dela;
  • Criamos um box de conteúdo do tipo vbox que organiza os componentes verticalmente, adicionamos o box à janela;
  • Criamos um label de entrada e acrescentamos ele ao box de conteúdo;
  • Criamos um componente de entrada de dados e adicionamos ao box de conteúdo;
  • Criamos um botão com texto e o adicionamos ao box de conteúdo;
  • Criamos um label com o resultado da conversão e o adicionamos ao box de conteúdo;
  • Conectamos o sinal de "destroy" à janela fazendo com que chame a função gtk_main_quit(), que encerra o main loop;
  • Conectamos o sinal "clicked" ao botão fazendo com que execute a função converter();
  • Exibimos tudo que está dentro da janela;

Compilando e rodando, nosso conversor deve funcionar.

Conclusão

Utilizar a GTK+ para desenvolver interfaces gráficas torna-se bem intuitivo depois de um tempo, principalmente pelo fato de que o nome das funções são bem intuitivos.

É óbvio que nosso conversor de unidades tem vários problemas (ele aceita texto no campo de entrada por exemplo...), mas ele demonstra bem a funcionalidade da GTK+.

É fundamental dar uma boa olhada na documentação disponível em library.gnome.org/devel/gtk/, só assim começamos a nos familiarizar com todos os componentes disponíveis e todas as opções disponíveis.

Em casos de dúvidas, um bom fórum de discussão também pode ajudar: http://www.gtkforums.com

Uma coisa legal sobre a GTK+ é que existem bindings para várias linguagens, como PHP, python, C++ e outras.

Espero que o artigo o ajude a pelo menos iniciar o uso da GTK+ para o desenvolvimento de interfaces gráficas.

Página anterior    

Páginas do artigo
   1. Introdução
   2. Primeiro programa... que não faz nada
   3. Agora sim
   4. Sinais
   5. Mais um exemplo
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Utilizando a função QSort em C

Liberando Memória ajustando o Tamanho das Strings em C

O ? Alternativo em C/C++

Estudo de ponteiros para GNU/Linux

Bibliotecas estáticas c/c++

  
Comentários
[1] Comentário enviado por eltondhiego em 09/07/2010 - 16:18h

Parabéns pelo artigo!! você poderia inclusive dar continuidade, ensinando novos passos ...

A propósito, me explica essa linha: atol(gtk_entry_get_text(GTK_ENTRY(entrada)));
Se eu estiver certo, a função atol transforma o valor contido em "entrada" para double ... e se fosse para um inteiro ou booleano como ficaria?

[2] Comentário enviado por fhendo em 09/07/2010 - 23:15h

Obrigado pelo comentário elton

O atol faz exatamente isso que você comentou. Ele converte para um double uma sequência de caracteres, que no caso dessa linha é a sequência de caracteres retornada pelo gtk_entry_get_text().
Se eu quisesse converter para um int eu usaria atoi(), no caso de ansi C eu não tenho o tipo bool, normalmente eu retornaria 0 ou 1 dentro de um small int. Espero ter ajudado um pouco

Vou tentar escrever mais alguns artigos

[3] Comentário enviado por leandrox em 10/07/2010 - 22:33h

Bom , Ótimo artigo!
Será minha introdução a essa biblioteca tão bem falada...
Valeu!

[4] Comentário enviado por vinipsmaker em 10/07/2010 - 22:55h

finalmente tive tempo de ler o artigo
e gostei dele, ele vai direto ao ponto (a interface gráfica)
eu tinha tentado aprender pelo manual oficial, mas ele exige que você aprenda uma linguagem de programação quase tão exotérica quanto whitespace ( http://en.wikipedia.org/wiki/Whitespace_%28programming_language%29 ), o GObject (como dizem alguns, "se c fosse apropriada para orientação a objetos, ninguém teria criado c++").

parabéns e obrigado pela contribuição

[5] Comentário enviado por gtuxed em 12/07/2010 - 23:28h

GTK com C no início parece meio "seco" demais, eu recomendaria começar com uma linguagem interpretada (tipo lua, python, perl, etc.).Caso você queira algo com mais desempenho ai sim, vamos para o C.

A minha maior dificuldade com GTK na época em que comecei a aprender foi quando tive que criar uma lista, tem umas implementações de estruturas de dados que acostumar a usar, no inicio achei meio estranho pois em shell script fazia meus aplicativos com lista em 2 segundos.No fim acabei deixando um pouco de lado interface gráfica, somente faço quando realmente é necessário, até porque geralmente o que faço é muito simples.

Para aqueles que já entenderam a lógica e querem alguma ferramenta que ajude na montagem da interface, vale a pena dar uma olhada no http://glade.gnome.org.

[6] Comentário enviado por gui.thcarlos em 17/01/2012 - 20:59h

Não sei se foi só comigo, mas no primeiro exemplo do teste.c tenho um erro de não achar o GtkWidget, vendo o segundo exemplo percebi que a linha #include <gtk/gtk.h> substitui a linha #include <stdio.h> do primeiro exemplo. Creio que o primeiro exemplo esteja com esse pequeno problema :D

[7] Comentário enviado por removido em 11/08/2014 - 12:07h

Ótimo artigo, eu uso a Ide Anjuta para desenvolvimento em gtk3.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts