Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[GTK+] 3 problemy.

Ostatnio zmodyfikowano 2012-07-03 11:55
Autor Wiadomość
m4tx
» 2012-06-23 07:32:17
Gtk jednak nie jest takie proste jak mi się wydawało...
Jest proste, tylko Ty chyba C++ nie znasz... :)

W ogóle opisałeś tak ten swój problem, że w ogóle nie da się Ciebie zrozumieć. Możesz jakoś jaśniej?

Da się w gtk wprowadzić tekst enterem?
Co?
P-58952
Drraven
» 2012-06-23 08:18:01
C/C++
/ n - nowa linia
/ t - tabulator
P-58953
jankowalski25
» 2012-06-23 10:11:10
@Drraven Nie "/" tylko chyba "\".
P-58955
Drraven
» 2012-06-23 12:32:41
Coś mi nie chciało tego backslasha wyświetlić
P-58960
czosnek17
Temat założony przez niniejszego użytkownika
» 2012-06-23 14:44:52
Gtk jednak nie jest takie proste jak mi się wydawało...
Jest proste, tylko Ty chyba C++ nie znasz... :)
Jak by było proste to mój program by działał ;p

Da się w gtk wprowadzić tekst enterem?
Co?
No chodzi o to, że jak wpiszę tekst, to żebym nie musiał kliknąć na przycisk żeby go wczytać, tylko enter. Tak jak masz w Firefoxie w prawym górnym rogu pasek do szukania w Google to chyba nie klikasz na lupę jak chcesz coś wyszukać tylko enter.

W ogóle opisałeś tak ten swój problem, że w ogóle nie da się Ciebie zrozumieć. Możesz jakoś jaśniej?
Program ma działać tak:
1. Wpisuję jedną z 2 nazw samochodu.
2. Klikam przycisk.
3. Wyświetla się samochód, którego nazwę wpisałem. Nie otwiera się nowe okno.
4. Jeżeli nie ma takiej nazwy nic się nie dzieje.

Program działa tak:
Wpisuję nazwę klikam i nic się nie dzieje.

Obrazek się nie wyświetal, więc próbuję go wczytać na 2 sposoby. Oba sposoby nie działają, jeden daje warning.

warning: 'lamb' may be used uninitialized in this function
warning: 'maluch' may be used uninitialized in this function

Kod:
C/C++
#include<gtk/gtk.h>
#include<string>

using namespace std;

struct _wieledanych {
    GtkWidget * etykieta;
    GtkWidget * label;
    GtkWidget * maluch;
    GtkWidget * lamb;
    GtkWidget * okno;
   
};

void dalej( GtkButton * przycisk, gpointer * dane )
{
    string lamborg = "lamborghini";
    string malucht = "maluch";
   
   
    GtkWidget * kontener2;
    GtkWidget * okno;
    GtkWidget * etykieta;
    GtkWidget * lamb;
    GtkWidget * maluch;
    const gchar * tekst;
    string txt;
    struct _wieledanych * noweDane;
   
    noweDane =( struct _wieledanych * ) dane;
   
    tekst = gtk_entry_get_text( GTK_ENTRY( noweDane->etykieta ) );
    txt = tekst;
   
    if( txt == "lamborghini" || txt == "maluch" )
    {
        if( txt == "lamborghini" )
        {
            // 1 sposób
            lamb = gtk_image_new_from_file( "lamb.gif" ); // jeżeli używam tego nie ma warningów...
            gtk_container_add( GTK_CONTAINER( okno ), lamb ); // X
        }
       
        if( txt == "maluch" )
        {
            maluch = gtk_image_new_from_file( "obraz.gif" );
            gtk_container_add( GTK_CONTAINER( okno ), maluch ); // X
        }
       
    }
    else
    {
        etykieta = gtk_label_new( tekst );
        gtk_container_add( GTK_CONTAINER( kontener2 ), etykieta );
    }
}

int main( int argc, char * argv[] )
{
    GtkWidget * okno;
    GtkWidget * ptxt;
    GtkWidget * napis;
    GtkWidget * kontener;
    GtkWidget * linia;
    GtkWidget * napis2;
    GtkWidget * przycisk;
    GtkWidget * lam;
    GtkWidget * mal;
    struct _wieledanych wieleDanych;
   
   
    gtk_init( & argc, & argv );
    okno = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    gtk_window_set_title( GTK_WINDOW( okno ), "Kurs GTK+" );
    gtk_window_set_position( GTK_WINDOW( okno ), GTK_WIN_POS_CENTER );
    gtk_window_set_default_size( GTK_WINDOW( okno ), 300, 150 );
   
    gtk_window_set_default_size( GTK_WINDOW( okno ), 300, 200 );
   
    przycisk = gtk_button_new_with_label( "dalej" );
    gtk_widget_set_size_request( przycisk, 10, 20 );
   
   
    kontener = gtk_vbox_new( FALSE, 1 );
    gtk_container_add( GTK_CONTAINER( okno ), kontener );
   
    napis2 = gtk_label_new( " ~samochód~ " );
   
    lam = gtk_image_new_from_file( "lamb.gif" );
    // 2 sposób. Powoduje warningi. Zazneczyłem linie tych warningów X
    mal = gtk_image_new_from_file( "obraz.gif" );
   
    gtk_container_add( GTK_CONTAINER( kontener ), napis2 );
    linia = gtk_hseparator_new();
    gtk_box_pack_start( GTK_BOX( kontener ), linia, FALSE, TRUE, 17 );
   
    napis = gtk_label_new( NULL );
    gtk_container_add( GTK_CONTAINER( kontener ), napis );
   
    ptxt = gtk_entry_new();
    gtk_container_add( GTK_CONTAINER( kontener ), ptxt );
   
    gtk_box_pack_start( GTK_BOX( kontener ), przycisk, FALSE, FALSE, 0 );
   
    wieleDanych.etykieta = ptxt;
    wieleDanych.label = napis2;
    wieleDanych.lamb = lam;
    wieleDanych.maluch = mal;
   
    g_signal_connect( przycisk, "clicked", G_CALLBACK( dalej ), & wieleDanych );
   
    g_signal_connect( G_OBJECT( okno ), "destroy", G_CALLBACK( gtk_main_quit ), NULL );
    gtk_widget_show_all( okno );
    gtk_main();
    return 0;
}
P-58973
Badman
» 2012-06-24 12:13:34
Ehh, Gtk+ jest stosunkowo proste, spróbuj swoich sił z WinAPI, to szybko powrócisz do Gtk+ :)
Nie dysponuje w tej chwili żadnym kompilatorem, ale wizualnie to mogę stwierdzić:

1. Nie zostaje wczytany plik graficzny, przyczyny:
a) pliki pobierane są z katalogu , z którego został uruchomiony program, a faktycznie znajdują się w innym. Spróbuj podać pełną ścieżkę do pliku z grafiką.
b) wersja biblioteki, którą używasz nie została skompilowana ze wsparciem dla formatu GIF, spróbuj wczytać jakiś plik w PNG.

W obu przypadkach możesz zadeklarować zmienne z przypisaniem do NULL i sprawdzić czy są różne od NULL po wczytaniu. Jeżeli są różne oznacza to, że grafika została wczytana.
C/C++
[...]
GtkWidget * lamb = NULL;
GtkWidget * maluch = NULL;
[...]
lamb = gtk_image_new_from_file( "lamb.gif" );

if( lamb == NULL )
{
    // Oznacza, że plik nie został wczytany
}
else
{
    // Plik wczytany
}

2. W funkcji dalej dodajesz obraz do okna, lecz nie widzę abyś tworzył nowe okno, lub dodawał obraz do poprzedniego okna. Codzi o to:
gtk_container_add( GTK_CONTAINER( okno ), lamb );

Wskaźnik okno wskazuję na jakiś przypadkowy adres w pamięci, więc przy założeniu że grafika została prawidłowo wczytana to nie ma prawa się pojawić.


Co do reakcji GtkEntry na klawisz enter, to skojarz sygnał activate:
C/C++
g_signal_connect( ptxt, "activate", G_CALLBACK( dalej ), & wieleDanych );

P-59019
czosnek17
Temat założony przez niniejszego użytkownika
» 2012-06-26 18:32:35
Obrazki udaje się wczytać. Dodałem okno do struktury i program się nie kompiluje. Są 2 błędy:
expected primary-expression before '.' token

C/C++
#include<gtk/gtk.h>
#include<string>

using namespace std;

struct wieledanych {
    GtkWidget * etykieta;
    GtkWidget * label;
    GtkWidget * maluch;
    GtkWidget * lamb;
    GtkWidget * oknox;
   
};

void dalej( GtkButton * przycisk, gpointer * dane )
{
    string lamborg = "lamborghini";
    string malucht = "maluch";
   
    GtkWidget * lamb = NULL;
    GtkWidget * maluch = NULL;
    const gchar * wcz = "wczytany";
    const gchar * niewcz = "niewczytany";
    GtkWidget * kontener2;
    GtkWidget * etykieta;
    GtkWidget * oknox;
   
    const gchar * tekst = "nowa etykieta";
    string txt;
    struct wieledanych * noweDane;
    GtkWidget * etykieta3;
    const gchar * txt3;
   
    etykieta = gtk_label_new( NULL );
   
    noweDane =( struct wieledanych * ) dane;
   
    etykieta = gtk_label_new( tekst );
    gtk_container_add( GTK_CONTAINER( kontener2 ), etykieta );
    //gtk_container_add( GTK_CONTAINER( noweDane.oknox ), etykieta );
    //gtk_widget_show( etykieta );
   
    tekst = gtk_entry_get_text( GTK_ENTRY( etykieta ) );
    txt = tekst;
   
   
    if( txt == "lamborghini" || txt == "maluch" )
    {
        if( txt == "lamborghini" )
        {
            // 1 sposób
            gtk_container_add( GTK_CONTAINER( wieledanych.oknox ), lamb ); //  tutaj błąd
        }
       
        if( txt == "maluch" )
        {
           
            gtk_container_add( GTK_CONTAINER( wieledanych.oknox ), maluch ); //  tutaj błąd
        }
    }
   
}

int main( int argc, char * argv[] )
{
   
    GtkWidget * ptxt;
    GtkWidget * napis;
    GtkWidget * kontener;
    GtkWidget * linia;
    GtkWidget * napis2;
    GtkWidget * przycisk;
    GtkWidget * lam;
    GtkWidget * mal;
    GtkWidget * lamb;
    GtkWidget * maluch;
    GtkWidget * okno;
    const gchar * tekstt = "TAK.";
    const gchar * tekstt2 = "NIE.";
    struct wieledanych wieleDanych;
   
   
    gtk_init( & argc, & argv );
    okno = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    gtk_window_set_title( GTK_WINDOW( okno ), "Kurs GTK+" );
    gtk_window_set_position( GTK_WINDOW( okno ), GTK_WIN_POS_CENTER );
    gtk_window_set_default_size( GTK_WINDOW( okno ), 300, 150 );
   
    gtk_window_set_default_size( GTK_WINDOW( okno ), 300, 200 );
   
    przycisk = gtk_button_new_with_label( "dalej" );
    gtk_widget_set_size_request( przycisk, 10, 20 );
   
    lamb = gtk_image_new_from_file( "lamb.png" ); // nie ma warningów
    maluch = gtk_image_new_from_file( "obraz.png" );
   
    kontener = gtk_vbox_new( FALSE, 1 );
    gtk_container_add( GTK_CONTAINER( okno ), kontener );
   
   
   
    napis2 = gtk_label_new( " ~samochód~ " );
   
    //lam = gtk_image_new_from_file( "lamb.png" );
    // 2 sposób. Powoduje warningi. Zazneczyłem linie tych warningów X
    //mal = gtk_image_new_from_file( "obraz.png" );
   
    lamb = gtk_image_new_from_file( "lamb.png" ); // nie ma warningów
    maluch = gtk_image_new_from_file( "obraz.png" );
   
    if( lamb == NULL )
    {
        // Oznacza, że plik nie został wczytany
        gtk_label_set_text( GTK_LABEL( napis2 ), tekstt2 );
    }
    else
    {
        // Plik wczytany
        gtk_label_set_text( GTK_LABEL( napis2 ), tekstt );
    }
   
   
    gtk_container_add( GTK_CONTAINER( kontener ), napis2 );
    linia = gtk_hseparator_new();
    gtk_box_pack_start( GTK_BOX( kontener ), linia, FALSE, TRUE, 17 );
   
    napis = gtk_label_new( NULL );
    gtk_container_add( GTK_CONTAINER( kontener ), napis );
   
    ptxt = gtk_entry_new();
    gtk_container_add( GTK_CONTAINER( kontener ), ptxt );
   
    gtk_box_pack_start( GTK_BOX( kontener ), przycisk, FALSE, FALSE, 0 );
   
    wieleDanych.etykieta = ptxt;
    wieleDanych.label = napis2;
    wieleDanych.lamb = lam;
    wieleDanych.maluch = mal;
    wieleDanych.oknox = okno;
   
    g_signal_connect( przycisk, "clicked", G_CALLBACK( dalej ), & wieleDanych );
   
    g_signal_connect( G_OBJECT( okno ), "destroy", G_CALLBACK( gtk_main_quit ), NULL );
    gtk_widget_show_all( okno );
    gtk_main();
    return 0;
}
P-59167
m4tx
» 2012-06-26 19:00:16
struct wieledanych * noweDane;
Jesteś pewien? :)

A co do błędów - może powiesz, w których linijkach występują? :)
P-59170
1 2 « 3 » 4 5
Poprzednia strona Strona 3 z 5 Następna strona