GTK+/Visão geral dos widgets

Origem: Wikilivros, livros abertos por um mundo aberto.

Capítulo 6: Visão Geral dos Widgets

A forma comum para criarmos um widget em GTK são:

  1. gtk_*_new() - Uma das várias funções para se criar um widget. Sendo totalmente detalhada nesta seção.
  2. Conectar todos os sinais e eventos desejados usando assim, seu tratamento apropriado.
  3. Configurar os atributos de um widget.
  4. Empacotar um widget dentro de um container usando a chamada apropriada como, gtk_container_add() ou gtk_box_pack_start().
  5. gtk_widget_show() para exibir o widget.

gtk_widget_show() permite ao GTK saber que já configuramos os atributos de um widget, e que este está pronto pra ser exibido. Você também pode usar gtk_widget_hide fazendo este widget desaparecer. A ordem de exibição dos widgets não são importantes, mas sugerimos exibir a window por último assim a window inteira será exibida imediatamente ao invés de vermos widgets sendo formados um a um na tela. O filho de um widget (uma window também é um widget) não será exibida até que a própria window não é exibida com a função gtk_widget_show().

Casting[editar | editar código-fonte]

Você perceberá durante o desenvolvimento do GTK, o uso de um tipo de sistema de casting. Isto sempre é feito usando macros que ambos testam a habilidade do cast do item dado, e otimizar o cast. Alguns tipos comuns são vistos abaixo:

G_OBJECT (object)
GTK_WIDGET (widget)
GTK_OBJECT (object)
GTK_SIGNAL_FUNC (function)
GTK_CONTAINER (container)
GTK_WINDOW (window)
GTK_BOX (box)

Estes casts são todos usados em argumentos de funções. Você poderá constatar nos exemplos a seguir e poderá constantemente dizer quando usá-los, simplesmente olhando as declarações das várias funções.

Como você pode ver abaixo na hierarquia de classes, todos os GtkWidgets são derivados da clasee base GObject. Isso significa que você pode usar um widget em qualquer lugar que a função pedir um objeto - simplesmente usando a macro G_OBJECT().

Por exemplo:

g_signal_connect( G_OBJECT (button), "clicked",
                 G_CALLBACK (callback_function), callback_data);

Este cast de um botão para um objeto, e promovemos um cast para o ponteiro da função para uma callback.

Muitos widgets também são containers. Se você der uma olhada na hierarquia de classes abaixo, você verá que muitos widgets derivam de uma classe Container. Qualquer um desses widgets podem ser usados com a macro GTK_CONTAINER declarando ela em funções que requerem containers.

Infelizmente, estas macros não são totalmente abordadas neste tutorial, mas recomendamos olhar os "GTK headers files" ou a "GTK API reference manual". Isto pode ser muito educativo. Na verdade, não é difícil aprender como um widget funciona somente analisando as declarações de funções.

Hierarquia de um widget[editar | editar código-fonte]

Para sua referência, aqui está a árvore hierarquica de classes usada na implementação dos widgets (Widgets não declarados e classes auxiliares fora omitidas.)

GObject
 |  
 GtkObject
  +GtkWidget
  | +GtkMisc
  | | +GtkLabel
  | | | `GtkAccelLabel
  | | +GtkArrow
  | | `GtkImage
  | +GtkContainer
  | | +GtkBin
  | | | +GtkAlignment
  | | | +GtkFrame
  | | | | `GtkAspectFrame
  | | | +GtkButton
  | | | | +GtkToggleButton
  | | | | | `GtkCheckButton
  | | | | |   `GtkRadioButton
  | | | | `GtkOptionMenu
  | | | +GtkItem
  | | | | +GtkMenuItem
  | | | |   +GtkCheckMenuItem
  | | | |   | `GtkRadioMenuItem
  | | | |   +GtkImageMenuItem
  | | | |   +GtkSeparatorMenuItem
  | | | |   `GtkTearoffMenuItem
  | | | +GtkWindow
  | | | | +GtkDialog
  | | | | | +GtkColorSelectionDialog
  | | | | | +GtkFileSelection
  | | | | | +GtkFontSelectionDialog
  | | | | | +GtkInputDialog
  | | | | | `GtkMessageDialog
  | | | | `GtkPlug
  | | | +GtkEventBox
  | | | +GtkHandleBox
  | | | +GtkScrolledWindow
  | | | `GtkViewport
  | | +GtkBox
  | | | +GtkButtonBox
  | | | | +GtkHButtonBox
  | | | | `GtkVButtonBox
  | | | +GtkVBox
  | | | | +GtkColorSelection
  | | | | +GtkFontSelection
  | | | | `GtkGammaCurve
  | | | `GtkHBox
  | | |   +GtkCombo
  | | |   `GtkStatusbar
  | | +GtkFixed
  | | +GtkPaned
  | | | +GtkHPaned
  | | | `GtkVPaned
  | | +GtkLayout
  | | +GtkMenuShell
  | | | +GtkMenuBar
  | | | `GtkMenu
  | | +GtkNotebook
  | | +GtkSocket
  | | +GtkTable
  | | +GtkTextView
  | | +GtkToolbar
  | | `GtkTreeView
  | +GtkCalendar
  | +GtkDrawingArea
  | | `GtkCurve
  | +GtkEditable
  | | +GtkEntry
  | |   `GtkSpinButton
  | +GtkRuler
  | | +GtkHRuler
  | | `GtkVRuler
  | +GtkRange
  | | +GtkScale
  | | | +GtkHScale
  | | | `GtkVScale
  | | `GtkScrollbar
  | |   +GtkHScrollbar
  | |   `GtkVScrollbar
  | +GtkSeparator
  | | +GtkHSeparator
  | | `GtkVSeparator
  | +GtkInvisible
  | +GtkPreview
  | `GtkProgressBar
  +GtkAdjustment
  +GtkCellRenderer
  | +GtkCellRendererPixbuf
  | +GtkCellRendererText
  | +GtkCellRendererToggle
  +GtkItemFactory
  +GtkTooltips
  `GtkTreeViewColumn

Widgets sem janelas[editar | editar código-fonte]

Os widgets a seguir não tem janelas associadas. Se você quiser capturar eventos, você deverá usar o EventBox. Veja esta seção em EventBox widget.

GtkAlignment
GtkArrow
GtkBin
GtkBox
GtkButton
GtkCheckButton
GtkFixed
GtkImage
GtkLabel
GtkMenuItem
GtkNotebook
GtkPaned
GtkRadioButton
GtkRange
GtkScrolledWindow
GtkSeparator
GtkTable
GtkToolbar
GtkAspectFrame
GtkFrame
GtkVBox
GtkHBox
GtkVSeparator
GtkHSeparator

Promoveremos nossa exploração do GTK examinando cada widget em partes, criando uma simples e pequena função para demonstrar isso. Uma outra boa fonte é o testgtk, um programa que vem com o GTK. Podendo ser achado em tests/testgtk.c.

Notas e Referências[editar | editar código-fonte]

Capítulo traduzido do Original: Widget Overview