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

Gtk, g_signal_connect i funkcja z referencjami

Ostatnio zmodyfikowano 2014-01-22 23:54
Autor Wiadomość
matiko101
Temat założony przez niniejszego użytkownika
Gtk, g_signal_connect i funkcja z referencjami
» 2014-01-22 20:13:34
Witam ponownie ...

Już sobie nie radzę i mam prośbę.
Mógłby ktoś wskazać mi co jest źle w moim kodzie ?
Domyślam się, że w miejscach komentarzowych w kodzie.
Jak w takim razie przekazać referencje do funkcji wlaczenie_programu ?
Czytałem jeden z tematów tu na forum o g_signal_connect i gpointer, ale dalej nie rozumiem.

KOD:
C/C++
#include <gtk/gtk.h>
#include<fstream>
#include <string>
#include<windows.h>
#include <iostream>

int wlaczanie_programu( GtkButton * button, std::string sciezki_programy[ 6 ], std::string nazwy_programy[ 6 ] ) // pewnie tu jest zle
{
    gchar * tekst;
    tekst = g_strdup( gtk_button_get_label( button ) );
    std::cout << nazwy_programy[ 0 ] << "\n";
   
    if( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( button ) ) )
    {
        if( tekst == nazwy_programy[ 0 ] )
             system( std::string( "\"" + sciezki_programy[ 0 ] + "\"" ).c_str() );
       
        if( tekst == nazwy_programy[ 2 ] )
             system( std::string( "\"" + sciezki_programy[ 2 ] + "\"" ).c_str() );
       
    }
}

int wartosci_buttonow( GtkWidget * button[ 8 ], std::string nazwy_programy[ 6 ] )
{
    button[ 0 ] = gtk_toggle_button_new_with_label( nazwy_programy[ 0 ].c_str() );
    button[ 1 ] = gtk_toggle_button_new_with_label( nazwy_programy[ 1 ].c_str() );
    button[ 2 ] = gtk_toggle_button_new_with_label( nazwy_programy[ 2 ].c_str() );
    button[ 3 ] = gtk_toggle_button_new_with_label( nazwy_programy[ 3 ].c_str() );
    button[ 4 ] = gtk_toggle_button_new_with_label( nazwy_programy[ 4 ].c_str() );
    button[ 5 ] = gtk_toggle_button_new_with_label( nazwy_programy[ 5 ].c_str() );
    button[ 6 ] = gtk_toggle_button_new_with_label( "Zamknij" );
    button[ 7 ] = gtk_toggle_button_new_with_label( "Wlacz" );
}
int nazwy_buttonow( std::string nazwy_programy[ 6 ], std::string sciezki_programy[ 6 ] )
{
    std::fstream programy_plik;
    programy_plik.open( "programy.txt", std::ios::in );
    for( int i = 0; i != 6; i++ )
    {
        getline( programy_plik, nazwy_programy[ i ] );
    }
    std::fstream sciezki_plik;
   
    sciezki_plik.open( "sciezki.txt", std::ios::in );
    for( int i = 0; i != 6; i++ )
    {
        getline( sciezki_plik, sciezki_programy[ i ] );
    }
}
int zmien_wlacznik( GtkWidget * button )
{
    if( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( button ) ) )
         gtk_button_set_label( GTK_BUTTON( button ), "Wylacz" );
    else
         gtk_button_set_label( GTK_BUTTON( button ), "Wlacz" );
   
}

int polozenie_buttonow( GtkWidget * button[ 7 ], GtkWidget * kontener )
{
    for( int i = 0, j = 0; i != 8; i++ )
    {
        if( i < 3 )
        {
            gtk_widget_set_size_request( button[ i ], 99, 29 );
            gtk_fixed_put( GTK_FIXED( kontener ), button[ i ], 5, 55 + i * 30 );
        }
        else if( i == 6 )
        {
            gtk_widget_set_size_request( button[ i ], 200, 30 );
            gtk_fixed_put( GTK_FIXED( kontener ), button[ i ], 5, 145 );
        }
        else if( i == 7 )
        {
            gtk_widget_set_size_request( button[ i ], 50, 20 );
            gtk_fixed_put( GTK_FIXED( kontener ), button[ i ], 205, 5 );
        }
        else
        {
            gtk_widget_set_size_request( button[ i ], 99, 29 );
            gtk_fixed_put( GTK_FIXED( kontener ), button[ i ], 105, 55 + j * 30 );
            j++;
        }
    }
}

int main( int argc, char * argv[] )
{
    GtkWidget * okno;
    GtkWidget * kontener;
    GtkWidget * button[ 8 ];
    GtkWidget * tlo;
   
    std::string nazwy_programy[ 6 ];
    std::string sciezki_programy[ 6 ];
   
   
    gtk_init( & argc, & argv );
   
    okno = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    gtk_window_set_position( GTK_WINDOW( okno ), GTK_WIN_POS_CENTER );
    gtk_window_set_default_size( GTK_WINDOW( okno ), 260, 180 );
    gtk_window_set_title( GTK_WINDOW( okno ), "MENADZER" );
   
   
    kontener = gtk_fixed_new();
    gtk_container_add( GTK_CONTAINER( okno ), kontener );
   
    tlo = gtk_image_new_from_file( "tlo.bmp" );
    gtk_fixed_put( GTK_FIXED( kontener ), tlo, 0, 0 );
   
    nazwy_buttonow( nazwy_programy, sciezki_programy );
    wartosci_buttonow( button, nazwy_programy );
    polozenie_buttonow( button, kontener );
   
    g_signal_connect( G_OBJECT( okno ), "destroy", G_CALLBACK( gtk_main_quit ), NULL );
    g_signal_connect( button[ 7 ], "clicked", G_CALLBACK( zmien_wlacznik ), NULL );
   
    for( int i = 0; i != 6; i++ )
    {
        g_signal_connect( button[ i ], "clicked", G_CALLBACK( wlaczanie_programu ),( & i, sciezki_programy, nazwy_programy ) ); // pewnie tu jest zle
    }
    gtk_widget_show_all( okno );
    gtk_main();
   
    return 0;
}
P-102874
czosnek17
» 2014-01-22 22:03:24
Nigdy tak nie przekazywałem argumentów więc nie wiem co to
( & i, sciezki_programy, nazwy_programy )
zwraca i jak to odbierać. Ja bym zrobił klasę z widgetem, nazwą buttona, nazwą programu. Wtedy wystarczyłoby przesłać do g_signal obiekt tej klasy a nawet zrobić to już w konstruktorze przekazując this.
P-102891
matiko101
Temat założony przez niniejszego użytkownika
» 2014-01-22 22:26:28
Takie rozwiązanie wymusza raczej duże Zmiany w kodzie :(
Z tego co wiem gtk+ nie jest w pelni obiektowe jak np. Sfml
Więc myślę że można to zrobić jeszcze inaczej nie wymuszajac tylu zmian w moim kodzie

Sorry za błędy ale pisze na telefonie
P-102895
MrPoxipol
» 2014-01-22 23:54:30
Tak nie wygląda poprawna funkcja callbackowa gtk+.
Polecam zaznać się z tutorialem dostępnym na developers.gnome.org.
P-102903
« 1 »
  Strona 1 z 1