Empilhamento de widgets no Gtk +
-
21-08-2019 - |
Pergunta
Existe uma maneira em Gtk + para empilhar um widget em cima do outro - sem contar GtkFixed? não GtkFixed não funcionar bem por duas razões:. 1) Eu preciso de ordem Z, e 2) Eu preciso de um widget para alongar e preencher espaço fornecido
Solução
Eu não acho que há um recipiente adequado em GTK padrão. Eu subclasse Gtk :: fixa ... ele ainda é o mais próximo que você pode começar, e se você usar gtkmm então subclasse não deve ser muito difficult¹. Depois, você pode controlar as dimensões de todos os widgets, esticando uma criança selecionada para o espaço de preenchimento.
Para o controle do eixo Z provavelmente você vai precisar de manipular do widget janelas X - Verifique a documentação GDK no tópico da GDK windows². Lembro que em PyGTK cada elemento tem gtk.Widget.window propriedade, eu acho que o mesmo é para gtkmm. Isso pressupõe que todos os seus widgets filhos têm janelas X, então F. E. você vai precisar para embrulhar Gtk :: Etiqueta no interior Gtk :: EventBox.
http: // www. gtkmm.org/docs/gtkmm-2.4/docs/tutorial/html/chapter-customwidgets.html
Outras dicas
Eu tive esse problema exato usando um Gtk :: fixo (na verdade gtk.Fixed - pygtk - mas eu acho que é tudo a mesma coisa por baixo) e eu era capaz de lidar com isso com bastante facilidade através da manipulação da janela de cada widget
No meu caso, os widgets já são instâncias EventBox, e eu só precisava ter certeza de que o que eu estava arrastando em torno estava em cima, porque caso contrário, deslizou outros por baixo, que parecia completamente errado. A solução era tão simples como chamar "widget.window.raise_ ()" para aumentar a janela subjacente do widget quando o widget foi clicado para iniciar o arraste.
Então, eu estou basicamente apenas reafirmando que as obras resposta anterior, mas eu queria salientar que é realmente muito fácil. Parece que você pode precisar criar algumas EventBoxes para manter seus widgets, mas depois que ele deve funcionar.
Você pode ver o código que eu estava trabalhando em em http://github.com/divegeek/BlockHead
Eu era capaz de fazer exatamente isso -
exibição de um widget preenchendo todo o espaço, e depois outro em cima em um local fixo, tanto visíveis ao mesmo tempo
em gtk2 usando GtkFixed, trabalhar fora uma ordem adequada inserção (inserido pela primeira vez - bottom, última inserido - parte superior), e - mais importante !! - forçando GtkFixed ter a sua própria janela:
`f := gtk_fixed_new();
gtk_widget_set_has_window(f, 1);`
Se você não fizer set_has_window (f, 1), todas as janelas crianças será inserido em algum widget pai / janela (ver gtk_fixed_realize () in gtkfixed.c), e que pode criar ordem z confusão.