Cum adaug un widget personalizat gtkmm la glade?

Scriu un widget personalizat utilizând gtkmm și nu am reușit să du-o să lucreze în poienă. (Widget-ul în sine este abia funcțional, funcționează și vreau să-l fac să funcționeze în glade înainte de a trece la pasul următor.) Glade găsește widget-ul, dar când încerc să-l pun într-o fereastră, poiana se prăbușește.

Pe baza sugestiilor pe care le-am găsit în diferite căutări, am adăugat acest cod de cod în fișierul sursă principal:

extern "C"
{
    GType date_chooser_get_type(void)
    {
        return DateChooser::get_type();
    }
}

Am o suspiciune că codul de mai sus nu este corect, dar nu găsesc nicio documentație gtkmm sau glade despre ce ar trebui să facă această funcție.

Bazându-mă pe documentația catalogului pentru gala , am creat următorul XML:

<?xml version="1.0" encoding="UTF-8"?>

  
    
  
  
    
  

Aceasta este în rădăcina directorului sursă al widgetului meu cu numele gtk-date-chooser.xml . Rulez glade în acel director folosind:

GLADE_CATALOG_SEARCH_PATH=. GLADE_MODULE_SEARCH_PATH=./.libs glade

Când fereastra apare, widget-ul meu apare într-un grup special "Date" așa cum este specificat în catalog, cu o pictogramă implicită. Dacă plasez o fereastră și apoi selectez widgetul pentru destinație de plasare în fereastră, poiana se prăbușește. Văd următoarele pe consola:

GladeUI-Message: 2 missing displayable value for GtkWidget::events
GladeUI-Message: No displayable values for property GtkTreeSelection::mode
GladeUI-Message: 1 missing displayable value for GtkCellRendererAccel::accel-mode
GladeUI-Message: 14 missing displayable value for GtkCellRendererAccel::accel-mods

(glade:23757): GladeUI-CRITICAL **: gwa_list_signals: assertion `real_type != 0' failed

(glade:23757): GLib-GObject-WARNING **: cannot retrieve class for invalid (unclassed) type `'

(glade:23757): GLib-GObject-CRITICAL **: g_object_class_list_properties: assertion `G_IS_OBJECT_CLASS (class)' failed

(glade:23757): GLib-GObject-WARNING **: cannot retrieve class for invalid (unclassed) type `'

(glade:23757): Gtk-CRITICAL **: gtk_container_class_list_child_properties: assertion `GTK_IS_CONTAINER_CLASS (cclass)' failed
GladeUI-Message: Glade needs artwork; a default icon will be used for the following classes:
    DateChooser needs an icon named 'widget-gtk-date-chooser-date-chooser'
**
GladeUI:ERROR:glade-signal-model.c:800:glade_signal_model_iter_n_children: code should not be reached

Se pare că răspunsul la această întrebare (fără răspuns) ar putea oferi un indiciu, dar nu am gasit nici un raspuns pentru acea intrebare sau indicii care vor ajuta cu problema mea.

Versiuni pe care le folosesc:

  • Ubuntu: 12.04
  • gtkmm: 3.4.0-0ubuntu1
  • pâlnie: 3.12.0-0ubuntu1

(Aș fi dispus să testez soluții bazate pe versiunile de trunchi, sau pe Centos 6 sau Fedora 16.)

8
Am aceeasi problema. Se pare că se întâmplă deoarece noul tip nu este înregistrat corespunzător. Aceasta, la rândul său, depinde de a apela funcția Gtk :: Main :: init_gtkmm_internals() într-o funcție de inițializare a bibliotecii, iar acest lucru împiedică pornirile să pornească corect. Nu mi-am dat seama de ce, totuși.
adăugat autor Tom, sursa
Există, de asemenea, o discuție îndelungată despre acest subiect la adresa mail.gnome. org/archives/gtkmm-list/2006-Noiembrie/msg00132.ht & zwnj; ml , dar nu ajunge niciodată la o concluzie despre cum să includem Gtk - widget-uri într-un catalog. Cel mai bun lucru pe care l-am reușit este să las un container gol și să adaug widget-ul programabil.
adăugat autor Tom, sursa
Am găsit una dintre cele mai frustrante probleme pe care le-am întâlnit pentru a încerca să vânez, deoarece documentația pare să fi fost reorganizată și mutată într-un alt server de trei sau patru ori în ultimii doi ani. Deci, aproape fiecare articol pe care-l găsiți pe subiect spune "citiți documentația", completată cu o legătură moartă.
adăugat autor Tom, sursa
Am incercat exemplul pe care l-ai conectat - nu functioneaza, cel putin nu foloseste versiunile Ubuntu 12.04 ale bibliotecilor. Apelul către init_gtkmm_internals nu se întoarce niciodată.
adăugat autor Tom, sursa
Am aruncat o privire, dar nu am avut nici o șansă să încerc încă. Nu puteam vedea ce era diferit de ceea ce am încercat deja.
adăugat autor Tom, sursa
@ h3nr1x: Nu. Luați o privire la codul de mai sus - este foarte simplu.
adăugat autor bstpierre, sursa
@Tom: Vă mulțumim pentru indicatorul. Nu știu de ce nu am dat peste firul ăla în căutările mele. Ați urmat exemplul lui Oliver Nittka în acest mesaj ? O să încerc în seara asta.
adăugat autor bstpierre, sursa
Am al doilea comentariu despre documentație. Am avut în sfârșit o șansă de a compila exemplul legat mai sus și se pare că funcționează pentru mine pe Ubuntu 12.04 după ce am modificat makefile-ul pentru a folosi -fPIC în CXXFLAGS > -L. -simpledraw la sfârșitul liniilor de conectare în loc de a numi în mod explicit libsimpledraw.so aproape de început. (Și apoi rulează cu LD_LIBRARY_PATH = ./simpledraw_ctortest .)
adăugat autor bstpierre, sursa
Doh! Am scris asta prea devreme - exemplele compilează și rulează bine, dar poiana nu funcționează deloc.
adăugat autor bstpierre, sursa
@Tom: Legătura dvs. cu firul de mai sus a fost cel mai util lucru pe care l-am găsit. Dacă îl postați ca un răspuns cu un pic de comentariu, +200 este al tău, dacă cineva nu se încadrează cu o soluție ...
adăugat autor bstpierre, sursa
@Tom: Vezi răspunsul lui Szilárd Pfeiffer - rezolvă piesa de înregistrare de tip a puzzle-ului.
adăugat autor bstpierre, sursa
Am încercat și funcționează. Nu ați făcut încă o comparație apropiată, dar există unele detalii în crearea tipului pe care nu le-am făcut bine și exemplul legat mai sus a fost făcut fie.
adăugat autor bstpierre, sursa
Este widgetul personalizat dvs. Gtk :: DrawingArea (sau ar putea fi implementat ca atare)?
adăugat autor higuaro, sursa
Scriu un articol de blog despre subiect, sper că poate ajuta la rezolvarea problemei tale. Mă voi întoarce cu ea ca răspuns.
adăugat autor Szilárd Pfeiffer, sursa

1 răspunsuri

Pentru a adăuga un widget personalizat gtkmm la Glade sunt necesare următoarele:

  1. cel puțin o implementare de widget personalizată pură
  2. unele funcții suplimentare <=> Glade legate de widget-urile personalizate
  3. un fișier de catalog care descrie widget-urile personalizate la Glade
  4. o bibliotecă conține widget-urile personalizate și unele legate de Glade Funcții

Cel mai important lucru este faptul că Glade este scris în C nu în C ++ , așa că trebuie să putem împacheta un plan > C într-o C ++ și trebuie să înregistrăm această funcție de împachetare la GType în legătură cu widgetul personalizat. Arată ceva asemănător cu următorii:

#include "custom_widget.h"

GType CustomWidget::gtype = 0;

CustomWidget::CustomWidget (GtkEntry *gobj) :
  Gtk::Entry (gobj)
{
}

CustomWidget::CustomWidget() :
  Glib::ObjectBase ("customwidget")
{
}

Glib::ObjectBase *
CustomWidget::wrap_new (GObject *o)
{
  if (gtk_widget_is_toplevel (GTK_WIDGET (o)))
    {
      return new CustomWidget (GTK_ENTRY (o));
    }
  else
    {
      return Gtk::manage(new CustomWidget (GTK_ENTRY (o)));
    }
}

void
CustomWidget::register_type ()
{
  if (gtype)
    return;

  CustomWidget dummy;

  GtkWidget *widget = GTK_WIDGET (dummy.gobj ());

  gtype = G_OBJECT_TYPE (widget);

  Glib::wrap_register (gtype, CustomWidget::wrap_new);
}

Ar trebui să scrieți fișierul de catalog foarte atent. Numele trebuie să fie corecte (mai ales glade-widget-class ) pentru munca corectă.

<?xml version="1.0" encoding="UTF-8" ?>


  custom_widgets_glade_init

  
    
    
  

  
    
  


Nu este nimic de făcut, ci implementați funcția, care înregistrează widget-ul nostru ca parte a inițializării bibliotecii noastre Glade .

extern "C" void
custom_widgets_glade_init ()
{
  Gtk::Main::init_gtkmm_internals ();
  custom_widgets_register ();
}

Inițializarea internelor gtkmm este o necesitate deoarece custom_widgets_glade_init este apelată de la Glade care este scrisă în C < em> C ++ așa că inițializează numai GTK + .

Dacă sunteți interesat de acest subiect, puteți găsi postarea pe blog aici cu mai multe detalii.

5
adăugat
Suspin. După ce un lung timp mi-a bătut capul împotriva acestui lucru, mi-am dat seama că exemplul dat funcționează numai cu gtk-- 3.0, nu cu 2.4.
adăugat autor Tom, sursa
Din câte știu, funcționează cu gtkmm 2.x. Am terminat meu blog post cu comenzile corespunzătoare (compilație de cod, variabile de mediu legate de Glade ) și note.
adăugat autor Szilárd Pfeiffer, sursa