Centralizar um botao numa VBOX no Gtkmm...

Iniciado por Natureba, 23 de Maio de 2009, 18:23

tópico anterior - próximo tópico

Natureba

pessoal...

To com um problema em GTKmm... eu adicionei uma VBOX na tela e dei um:

vbox->pack_end(botao,Gtk::PACK_SHRINK);

Ele adiciona esse botao normalmente, mas o botao ocupa a VBox inteira... eu queria deixar ele do tamanho normal e centralizado...

tentei usar:

botao->set_alignment(Gtk::ALIGN_CENTER,Gtk::ALIGN_CENTER);

o que funciona com qualquer WIDGET menos BUTTON, pois BUTTON tem esse método sobrescrito...
Alguem sabe como eu faço para usar a set_alignment da classe Gtk::Alignment ao inves do set_alignment da classe Gtk::Button???

Valeu.
Abs.

Darcamo

Faz tempo que brinquei um pouco com a gtkmm, e não lembro mais dos detalhes, mas não seria mais fácil usar o glade?

Eu fazia a interface toda no glade e apenas implementava e ligava os callbacks no código. O que não dava para fugir do código é quando precisava criar uma treeview, já que não dava pra criar no glade. Eu precisava criar a treeview e o treemodel para ela tudo em código mesmo. As demais partes da GUI eu organizava tudo no glade e só carregava as widgets no código para poder fazer as ligações dos callbacks.

Natureba

#2
Cara...

Eu acho que o glade foi descontinuado...
Ele ainda existe e talz, mas ele não gera mais código pelo que ouvi falar...(ou será que isso é soh no Windows?)
O próprio Gtkmm quando instalado não vem mais com o glade...xP
Até agora eu tava fazendo tudo no dedo msm... hehehehe...

Vou dar uma xeretada aqui ver se eu descubro...
Vlw...

Darcamo

Gerar código pelo glade é algo que está descontinuado faz muito tempo e não é recomendado.
Não é isso que eu quis dizer.

Na verdade você faz a interface no glade e ele cria um arquivo xml quando você salva. No seu programa você abre esse arquivo xml usando funções específicas para isso (biblioteca libglademm) e cria um objeto "glade xml". Com esse objeto você pode pegar uma referência para as widgets que você fez no glade para então conectar os callbacks ou fazer qualquer outra mudança que queira.

Essa abordagem é muito interessante porque você não precisa recompilar a cada mudança que faça na interface e o código fica mais simples já que muita coisa referente a interface gráfica não precisa ser explicitamente escrita em código.

Aqui tem um artigo em português muito interessante sobre o glade
http://www.cin.ufpe.br/~cinlug/wiki/index.php/Mantendo_A_Sanidade_Com_O_Glade

Na documentação da gtkmm também tem uma seção sobre o uso do glade com a gtkmm
http://www.gtkmm.org/docs/gtkmm-2.4/docs/tutorial/html/chapter-libglademm.html#sec-libglademm-headers-and-linking

Natureba

#4
Citação de: Darcamo online 27 de Maio de 2009, 22:57
Gerar código pelo glade é algo que está descontinuado faz muito tempo e não é recomendado.
Não é isso que eu quis dizer.

Na verdade você faz a interface no glade e ele cria um arquivo xml quando você salva. No seu programa você abre esse arquivo xml usando funções específicas para isso (biblioteca libglademm) e cria um objeto "glade xml". Com esse objeto você pode pegar uma referência para as widgets que você fez no glade para então conectar os callbacks ou fazer qualquer outra mudança que queira.

Essa abordagem é muito interessante porque você não precisa recompilar a cada mudança que faça na interface e o código fica mais simples já que muita coisa referente a interface gráfica não precisa ser explicitamente escrita em código.

Aqui tem um artigo em português muito interessante sobre o glade
http://www.cin.ufpe.br/~cinlug/wiki/index.php/Mantendo_A_Sanidade_Com_O_Glade

Na documentação da gtkmm também tem uma seção sobre o uso do glade com a gtkmm
http://www.gtkmm.org/docs/gtkmm-2.4/docs/tutorial/html/chapter-libglademm.html#sec-libglademm-headers-and-linking

puuutz mano... q legal!!! curti mesmo...
mas infelizmente eu to no final de um projeto em GTK, que preciso entregar na facul sexta feira e acho q n vai mais dar tempo de fazer isso...xP
hehehehe... mas vou dar uma olhada nisso sim... valeuzao...

Cara.. Aproveitando o tópico, não sei se você vai saber me ajudar, mas é o seguinte:
No windows, meu código compila direitinho, mas na hora de rodar da akeles erros classicos do windows por causa de um acesso indevido na memória...

Acontece que eu descobri que esse erro é relativo à quantidade de eventos q eu to fazendo...
Assim, adicionei 6 botoes na minha tela... Quando eu dou o signal_clicked.connect() em todos eles, da esse erro...
Se eu fizer isso em soh 4 deles não da... não interessa a ordem, quais botoes eu uso, nada...
não sei por que quando eu faço o quinto signal_clicked.connect(sigc::mem_fun *etc*) esse mem_fun está acessando alguma área ilegal da memória...

VC sabe o que pode ser?

Valeu.
Abs.

Darcamo

Pra responder essa pergunta só debugando mesmo.
Será que você não está tentando conectar duas vezes o mesmo botão? (ter dois "*etc*"s que na verdade apontam para o mesmo objeto)

Você pode mandar imprimir os ponteiros com cout para ver se realmente são ponteiros diferentes.