PDA

Visualizza la versione completa : [c++] interfaccie grafiche gtkmm + glade su windows


Kilin
28-08-2008, 15:31
Ciao a tutti...

Volevo smanettare un po' con le librerie grafiche per vedere che riesco a cavarne fuori.. Ho iniziato facendo delle semplici prove (a mano) usando un template di progetto per DevC++ che mi è stato passato (in pratica include da solo le directory e linka le librerie)...Fin qui comunque funziona tutto bene..

Una volta concluso che fare a mano interfaccie molto complesse è uno spreco di tempo, ho pensato di passare all'accoppiata gtkmm + glade, tool per disegnare le interfaccie in maniera grafica, che genera un file xml .glade caricato a tempo d'esecuzione.

Ho seguito la documentazione, che però è relativa a linux, così per linking ecc mi sono affidato al solito template di progetto... Ho disegnato una finestra con un bottone su glade, salvato il .glade, e fatto il seguente programma che semplicemente carica il file glade.
Ottengo però un errore a tempo d'esecuzione (si chiude come se avesse un segmentation fault)..


#include <cstdlib>
#include <iostream>
#include <libglademm.h>

using namespace std;

int main(int argc, char *argv[])
{
Glib::RefPtr<Gnome::Glade::Xml> refXml = Gnome::Glade::Xml::create("basic1.glade");

return 0;
}


c'è qualcuno che usa/ha usato con successo questa accoppiata sotto windows che puo' spiegarmi dove sbaglio? Con quel programma vorrei solo importare il .glade e visualizzare la finestra che ho disegnato con glade, poi per tutto il resto vedo io..

Vi ringrazio..

menphisx
28-08-2008, 16:55
Prova con:


int main (int argc, char **argv)
{
Gtk::Main kit(argc, argv);
Glib::RefPtr<Gnome::Glade::Xml> refXml;

#ifdef GLIBMM_EXCEPTIONS_ENABLED

try {

refXml = Gnome::Glade::Xml::create("simple.glade");

}
catch(const Gnome::Glade::XmlError& ex) {

std::cerr << ex.what() << std::endl;
return 1;

}

#else

std::auto_ptr<Gnome::Glade::XmlError> error;
refXml = Gnome::Glade::Xml::create("simple.glade", "", "", error);

if(error.get()) {
std::cerr << error->what() << std::endl;
return 1;
}

#endif

return 0;

}



:ciauz:

Kilin
28-08-2008, 17:01
Grazie della risposta!

Purtroppo ottengo questo errore col tuo main (semplicemente sostituito il mio col tuo, lasciando il resto uguale


variable `Gtk::Main kit' has initializer but incomplete type

:master: :ciauz:

Kilin
29-08-2008, 00:50
allora, aggiungendo l'inclusione del file gtkmm/main.h, non da errori, compila correttamente, ma non succede niente in esecuzione... anche se nel file glade ho impostato "Visible: yes" sulla finestra.. il codice è questo.. (comunque ti sarei grato se potessi spiegarmelo! come mai non basta come ho fatto io?)


#include <cstdlib>
#include <iostream>
#include <libglademm.h>
#include <gtkmm/main.h>
//using namespace std;

int main (int argc, char **argv)
{
Gtk::Main kit(argc, argv);
Glib::RefPtr<Gnome::Glade::Xml> refXml;

#ifdef GLIBMM_EXCEPTIONS_ENABLED

try {

refXml = Gnome::Glade::Xml::create("progetto1.glade");

}
catch(const Gnome::Glade::XmlError& ex) {

std::cerr << ex.what() << std::endl;
return 1;

}

#else

std::auto_ptr<Gnome::Glade::XmlError> error;
refXml = Gnome::Glade::Xml::create("progetto1.glade", "", "", error);

if(error.get()) {
std::cerr << error->what() << std::endl;
return 1;
}

#endif

return 0;

}

Kilin
29-08-2008, 01:45
bah ho fatto un sacco di prove ma ottengo uno sfracelo di errori in ogni caso.. ho provato a compilare pari pari un esempio trovato sul web, ma ottengo una paginata di errori...

vorrei ripartire da zero, reinstallare l'ambiente su windows, e capire passo passo come fare a far funzionare questa maledetta importazione del file glade.. chi mi aiuta a fare un po' di chiarezza?

vi ringrazio..

Kilin
29-08-2008, 04:53
Ho provato un altro codice che ho trovato in un esempio online, questo:


#include <libglademm/xml.h>
#include <gtkmm.h>

int main(int argc, char* argv[])
{
Gtk::Main kit(argc, argv);
Glib::RefPtr<Gnome::Glade::Xml> refXml = Gnome::Glade::Xml::create("progetto1.glade");
kit.run();
return 0;
}

Anche così compila, ma ora da un errore di runtime:


Microsoft Visual C++ Runtime Library
program ....project.exe
This application has requested the runtime to terminate it in an unusual way. Please contact...blabla.

E' un passo avanti o un passo indietro? :fagiano: :mame:

EDIT1: anche questo esempio, copiato pari pari in un progetto e compilato, non da errori ma non mostra niente... come mai...........
http://www.gtkmm.org/docs/gtkmm-2.4/docs/tutorial/html/sec-libglademm-accessing-widgets.html

EDIT2: se nel codice che ho linkato faccio eseguire sempre il corpo del try (lo tolgo dal blocco try e commento il catch) ottengo runtime error... Mi viene il dubbio che quando non si vede niente a tempo di compilazione è perchè c'è un errore, esce dal try e il catch scriverebbe sulla console (cerr)... ma questo template di progetto ha scritto nella descrizione "A GTK-- application (without console)"... puo' essere? In tal caso:
1- che cavolo d'errore puo' essere che me lo da su qualsiasi .glade che gli passo, anche quello preso dalla documentazione ufficiale? E' il mio ambiente?
2- come posso risolvere?

EDIT3: bingo: ho cambiato il tipo di progetto da win32 GUI a win32 console, per vedere hce stampava sulla console... e infatti da questo errore:


(simple.exe:4008): libglade-WARNING **: could not find glade file 'simple.glade'. Failed to load glade file 'simple.glade'

Il file però è nella stessa cartella! Dove lo cerca?? o_O

EDIT4: CI SIAMO QUASI: ho dato un'occhiata al reference della funzione create(),ed ho osservato questo:

static Glib::RefPtr<Xml> Gnome::Glade::Xml::create ( const std::string& filename,
const Glib::ustring& root = Glib::ustring(),
const Glib::ustring& domain = Glib::ustring()
) [static]
quel 'root' mi ha messo la pulce nell'orecchio, così ho provato a passargli l'indirizzo completo del file glade e... FUNZIONA! Resta da capire che valore vuole come root per fargli capire che è nella stessa cartella!

PS: mi scuso per questo post sconclusionato, è che ci sto lavorando di continuo e lo aggiorno per non far scervellare chi si mette a leggere su domande a cui mi sono già risposto... cancellare i passaggi mi sembra peggio... spero di non essere bacchettato dai mod :stordita:

Loading