Perguntas frequentes

1. Lugar do gtkmm no mundo

O que é o GTK?

GTK é o kit de ferramentas de widgets GUI, escrito em C, que serve como base para o projeto GNOME, bem como para muitos aplicativos autônomos. GTK é a base sobre a qual o gtkmm é construído. Veja https://www.gtk.org.

Por que é chamado gtkmm?

gtkmm foi originalmente chamado de gtk-- porque GTK era originalmente chamado de GTK+ e tinha um + no nome. No entanto, como -- não é facilmente indexado por mecanismos de busca, o pacote geralmente era chamado de gtkmm, e foi com isso que ficamos.

Por que usar gtkmm ao invés de GTK?

  • gtkmm permite que você escreva código usando técnicas normais de C++ como encapsulamento, derivação e polimorfismo. Como um programador de C++, você provavelmente já percebeu que isso leva a um código mais claro e melhor organizado.
  • gtkmm tem mais segurança para tipos, então o compilador pode detectar erros que só seriam detectados em tempo de execução ao usar C. Esse uso de tipos específicos também torna a API mais clara porque você pode ver quais tipos devem ser usados ​​apenas observando a declaração de um método.
  • Herança pode ser usada para derivar novos widgets. A derivação de novos widgets no código GTK C é tão complicada e propensa a erros que quase nenhum codificador C faz isso. Como um desenvolvedor C++, você sabe que derivação é uma técnica essencial de Orientação a Objetos.
  • Instâncias de membros podem ser usadas, simplificando o gerenciamento de memória. Todos os widgets GTK C são tratados pelo uso de ponteiros. Como um codificador C++, você sabe que ponteiros devem ser evitados sempre que possível.
  • Menos código. O modelo de objeto GTK C usa nomes de função prefixados e macros de conversão. Por exemplo: gtk_button_set_text(GTK_BUTTON(button), "sometext"); gtkmm C++ o código é mais curto e claro. Por exemplo: button.set_text("sometext");
  • Não há necessidade de se preocupar com a política de contagem de referências do GTK.

Por que usar libsigc++? Por que não usar as funções de sinal do GTK?

  • Os sinais do GTK não são typesafe. O compilador não pode dizer se seu retorno de chamada tem o número ou tipo errado de argumentos ou valor de retorno.
  • Elas só podem ser usados ​​com funções ou métodos estáticos. Com libsigc++, os retornos de chamada (callbacks) também podem ser métodos de instância, usando os dados de membro de um objeto específico. Eles também podem ser métodos virtuais que você pode substituir em uma classe derivada.

Por que o GTK/GNOME não foi escrito em C++?

  • C é uma linguagem mais simples, por isso mais pessoas estão familiarizadas com ela, principalmente no Unix.
  • C pode ser encapsulado por qualquer outra linguagem, tornando a API disponível para mais desenvolvedores.
  • GTK e GNOME têm código C muito bem organizado, muito mais sensato do que a maioria do código C que encontramos. Isso se deve em parte à sua estrutura orientada a objetos baseada em C.

Por que não usar Qt se você gosta tanto de C++?

Os desenvolvedores do gtkmm tendem a preferir o gtkmm ao Qt porque o gtkmm faz as coisas de uma forma mais C++. O Qt se origina de uma época em que o C++ e a biblioteca padrão não eram padronizados ou bem suportados pelos compiladores. Portanto, ele duplica muitas coisas que agora estão na biblioteca padrão, como contêineres e informações de tipo. Mais significativamente, eles modificaram a linguagem C++ para fornecer sinais, de modo que as classes Qt não podem ser usadas facilmente com classes não Qt. O gtkmm foi capaz de usar o C++ padrão para fornecer sinais sem alterar a linguagem C++.

Além disso, o gtkmm e os outros módulos *mm permitem que você crie software que funciona mais de perto com o desktop do GNOME.

2. Quão bom é o gtkmm?

Em quais sistemas ele é executado?

gtkmm deve funcionar em qualquer sistema do tipo UNIX com os compiladores e bibliotecas apropriados instalados. O compilador GNU C++ (g++, parte do gcc) junto com o conjunto de ferramentas GNU (como encontrado em sistemas Linux e *BSD) compõem seu ambiente de construção padrão. Ele também pode ser construído e usado no Windows com as ferramentas de construção mingw ou MSVC.

Quão completo é ele?

gtkmm tenta oferecer toda a funcionalidade oferecida pelo GTK. Isso significa que você deve ser capaz de fazer qualquer coisa com gtkmm que seja suportada pelo GTK, e fazê-lo mais facilmente. Se algo não estiver coberto, então queremos saber sobre isso.

GLib contém classes com funcionalidade similar às classes C++ padrão, por exemplo GThread e GTree. Tais classes GLib não são envoltas em glibmm.

O gtkmm usa contêineres C++ padrão, como std::string e std::vector?

Sim, acreditamos em reutilizar o código padrão C++ sempre que possível. Isso pode não ser óbvio a princípio porque o gtkmm tem Glib::ustring que tem quase a mesma interface que std::string. Glib::ustring existe porque o padrão do C++ não suporta bem strings codificadas em UTF8.

Como o gtkmm se compara ao Qt?

  • gtkmm usa C++ puro. Qt requer extensões para C++ que são analisadas pelo pré-processador moc.
  • gtkmm usa std::string, std::vector, iteradores, etc. O Qt tem seus próprios contêineres específicos do Qt.
  • Com o gtkmm, o gerenciamento de memória normal C++ pode ser usado. O Qt exige que todos os widgets sejam tratados como ponteiros e que a exclusão de widgets seja delegada aos widgets pais.
  • O arranjo de widgets parece ser mais fácil no gtkmm. No Qt, Containers e Layouts são classes separadas, e widgets filhos devem ser adicionados a ambos.
  • A API do gtkmm tende a ser mais explícita. O comportamento das classes Qt geralmente depende dos efeitos implícitos de construtores substituídos.

3. Mais informações

Onde é possível discutir sobre gtkmm?

Veja a página de Discussão.

Qual documentação existe para o gtkmm?

Veja a página de Documentação.

Onde posso encontrar algum código de exemplo?

Veja o diretório examples no módulo gtkmm-documentation. A maioria deles aparece no livro do gtkmm.

4. Usando o gtkmm

Quais argumentos do compilador devo usar para compilar um programa gtkmm?

Veja a documentação de referência

Como posso obter o objeto GTK de um objeto gtkmm?

Se você precisar de alguma funcionalidade GTK que não seja suportada pelo gtkmm, você pode chamar o método gobj() na classe relevante, que retornará um ponteiro para o objeto C GTK simples. Você pode então operar diretamente neste objeto C como faria em qualquer programa GTK.

Como posso encapsular um widget GTK em uma instância gtkmm?

Glib::wrap() lhe dará um ponteiro para um objeto gtkmm. É uma função sobrecarregada, então lhe dará uma instância da classe apropriada.

Posso usar exceções do C++ com gtkmm?

Sim, mas há restrições. Como o C simples não sabe o que é uma exceção C++, você pode usar exceções no seu código gtkmm, desde que não haja funções C na sua pilha de chamadas entre o lançador e o receptor. Isso significa que você tem que capturar sua exceção localmente.

Você será avisado em tempo de execução sobre exceções não capturadas, e você pode especificar um manipulador diferente para exceções não capturadas. Alguns métodos gtkmm usam exceções para relatar erros. Os tipos de exceção que podem ser lançados estão listados na documentação de referência desses métodos.

Como posso usar Cambalache ou Glade com gtkmm?

Veja o capítulo Gtk::Builder no livro do gtkmm. Cambalache substitui o aplicativo Glade. Glade não pode ser usado com GTK4/gtkmm4.

O que Gtk::make_managed<T>(args) faz?

Isso significa que O widget do contêiner excluirá este widget filho. Use-o se não quiser se preocupar sobre quando excluir widgets alocados dinamicamente.

Como posso aprender sobre como organizar widgets? Estou confuso com as opções de empacotamento.

Cambalache é uma ótima maneira de ver o que pode ser feito com widgets GTK e GNOME. Use Cambalache para explorar a escolha de widgets e ver como eles podem ser colocados juntos.

Estou acostumado com MFC (Microsoft Foundation Class Library). Onde estão o Document e o View?

Document/View (que é uma versão do padrão de design de software Model–View–Controller (MVC)) não é suportado diretamente pelo GTK. No entanto, as classes Gtk::TextView e Gtk::ListView são divididas em model e view.

Como carrego imagens para usar com o gtkmm?

Use Gdk::Pixbuf e/ou Gtk::Image. Ambos são fáceis de usar e suportam uma ampla variedade de tipos de arquivos de imagem.

O gtkmm é thread-safe?

Nem GTK nem gtkmm são seguros para threads (thread-safe). Todo código GUI deve ser executado na mesma thread. Se seu programa pode se beneficiar do uso de múltiplas threads, dê uma olhada no capítulo de Programas multithread no livro do gtkmm.