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

[GTK] Problem z sygnałem "configure-event"

Ostatnio zmodyfikowano 2011-11-25 20:50
Autor Wiadomość
matek2305
Temat założony przez niniejszego użytkownika
[GTK] Problem z sygnałem "configure-event"
» 2011-11-25 17:48:57
Witam! Jest to mój pierwszy post na forum więc proszę o wyrozumiałość. Otóż zacząłem uczyć się GTK z dostępnego tutaj kursy i napotkałem mały (duży?) problem. Napisałem aplikację mającą dwa okno. Całe jedno okno jest wypełnione kontenerem Table który zawiera n x n widget'ów gtk entry. Do tego momentu wszystko działa super, przy zmianie wielkości okna widgety same dostosowują swoją wielkość tak, aby wypełnić całe okienko, o to mi właśnie chodziło. W drugim okienku jak narazie znajdują się dwa przycisk. Postanowiłem dodać sobie obsługę zdarzenia przesuwania głównego okna (pierwszego) tak aby drugie okno "jeździło za nim". Pod dodaniu obsługi sygnału:

g_signal_connect(G_OBJECT(oknoMacierzy), "configure-event", G_CALLBACK(polozenie), (gpointer)oknoInterfejsu);

wszystko działa tak jak powinno. Drugie okienko "podąża" za pierwszym. Problem pojawił się przy zmianie rozmiarów pierwszego okna. Widgety będące w gtk table nagle przestały dopasowywać się do rozmiarów okna;/ Nie jest to raczej wina treści funkcji "polozenie" ponieważ nawet gdy jest ona pusta problem nadal występuje. Jak tylko usunę powyższa linijkę to wszystko wraca do normy ale chciałbym żeby pozycja drugiego okienka zależała od pozycji pierwszego. Bardzo proszę o pomoc w tej sprawie. Z góry dziękuję i pozdrawiam.
P-44687
DejaVu
» 2011-11-25 17:50:56
No to chyba będziesz musiał poczekać aż autor tego kursu zabierze swój głos - gdzieś tu się błąka na forum ;p
P-44688
m4tx
» 2011-11-25 17:59:28
Oto zabieram głos. :P

Szczerze mówiąc nie miałem nigdy problemu opisanego przez Ciebie. Podaj jednak kod - zobaczę, może masz coś źle, może trzeba coś zmienić. Ogólnie zobaczę co da się zrobić.
P-44690
matek2305
Temat założony przez niniejszego użytkownika
» 2011-11-25 18:12:31
C/C++
#include <gtk/gtk.h>
#include <iostream>

using namespace std;

void polozenie( GtkWindow * okno, GdkEvent * zdarzenie, gpointer dane ) {
   
}

int main( int argc, char * argv[] )
{
    int n = 0;
    cout << "Podaj wymiar tabeli: ";
    cin >> n;
   
    GtkWidget * okno;
    GtkWidget * tabela;
    GtkWidget ** pole;
   
    pole = new GtkWidget *[ n * n ];
   
    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), 250, 250);
    gtk_window_set_title( GTK_WINDOW( okno ), "Macierz" );
   
    gtk_container_set_border_width( GTK_CONTAINER( okno ), 5 );
   
    tabela = gtk_table_new( n, n, TRUE );
    gtk_table_set_row_spacings( GTK_TABLE( tabela ), 2 );
    gtk_table_set_col_spacings( GTK_TABLE( tabela ), 2 );
   
    for( int i = 0; i <( n * n ); i++ ) {
        pole[ i ] = gtk_entry_new();
        gtk_widget_set_size_request( pole[ i ], 40, 40 );
    }
   
    for( int x = 0; x < n; x++ ) {
        for( int y = 0; y < n; y++ ) {
            gtk_table_attach_defaults( GTK_TABLE( tabela ), pole[( y * n ) + x ], x, x + 1, y, y + 1 );
        }
    }
   
    gtk_container_add( GTK_CONTAINER( okno ), tabela );
   
    g_signal_connect( G_OBJECT( okno ), "destroy", G_CALLBACK( gtk_main_quit ), NULL );
    g_signal_connect( G_OBJECT( okno ), "configure-event", G_CALLBACK( polozenie ), NULL );
   
    gtk_widget_show_all( okno );
   
    gtk_main();
   
    return 0;
}

Skompiluj sobie ten kod i jako wymiar podaj 1, potem usuń linijkę odpowiedzialną za sygnał "configure-event" i zrób to samo. W jednym przypadku widget wypełniał będzie całe okienko, w drugim nie.
P-44694
npHard
» 2011-11-25 19:21:32
Problem leży w tym, że callback "polozenie" wywoływany jest zarówno przy przesuwaniu okna jak i przy zmianie rozmiaru. Zdarzenie to samo z siebie nie propaguje więc jak zostanie wywołana Twoja funkcja to zmiana rozmiaru elementów wewnątrz okna nie będzie miała miejsca. Jak to naprawić? Zmusić sygnał(czy jak to tam się nazywa w gtk) aby dalej propagował! Jak to zrobić? Zwrócić z callback'a false!

Trzeba zmienić typ funkcji "polozenie" na gboolean i zwrócić false...

C/C++
gboolean polozenie( GtkWindow * okno, GdkEvent * zdarzenie, gpointer dane )
{
    return FALSE;
}
P-44700
matek2305
Temat założony przez niniejszego użytkownika
» 2011-11-25 20:48:21
Super! Wielkie dzięki, wszystko działa teraz jak należy ;) Przy okazji jeszcze chciałbym zapytać czy do funkcji callback można przesłać więcej niż jeden argument przy pomocy g_signal_connect?
P-44703
DejaVu
» 2011-11-25 20:50:29
1 temat = 1 problem. Oto jedna z naszych zasad... zamykam :)
P-44704
« 1 »
  Strona 1 z 1