Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: Badman
Biblioteki C++

Tworzenie GUI - menu, pola tekstowe i etykiety

[lekcja] Rozdział 2. Opisuje jak korzystać z menu, z pola tekstowego (GtkEntry) oraz wyświetlać dane w kontrolce etykiety (GtkLabel).
W programie Glade utwórz nowy projekt, następnie utwórz okno ustawiając tytuł "Kurs Glade - 2". Kolejne czynności:
1. Utwórz pionową skrzynkę z 3 elementami.
2. W środkowym elemencie pionowej skrzynki utwórz poziomą skrzynkę z 2 elementami.

Zapisz projekt jako kurs2.ui

1. Utwórz pasek menu wstawiając go w 1 elemencie pinowej skrzynki.
2. Utwórz etykiete label1 w 1 elemencie poziomej skrzyni oraz utwórz etykiete label2 3 elemencie pinowej skrzynki.
3. Utwórz wejście tekstowe (GtkEntry) w 2 elemencie poziomej skrzyni.

1. W kontrolce label1 ustaw tekst "Wprowadź tekst".
2. W kontrolce label2 usuń zawartość, aby nie wyświetlała tekstu. Wykorzystamy go w programie do wyświetlania tekstu.

Ponieważ wykorzystamy tylko menu Plik usuń pozostałe:
Menu Edycja można usunąć dwoma sposobami:
1. Zaznacz lewym przyciskiem myszy menu Edycja, następnie wciśnij prawy klawisz mysz. Pojawi się menu, odszukaj w nim i zaznacz opcję Usuń.
2. Podobnie jak w pierwszym sposobie kliknij menu Edycja, z prawej strony zostanie podśietlone menuitem2. Usuń zaznaczone  menuitem2.
Postępuj analogicznie z Widok i Pomoc

Skojarzenie opcji menu Zakończ z funkcja gtk_main_quit:
1. Wybierz opcję Zakończ w menu Plik.
2. W zakładce Sygnały odszukaj sygnału activate i skojarz go z funkcją gtk_main_quit.
 

1. Wybierz entry1 w liście kontrolek \ widżetów, bądź poprostu kliknij lewym przyciskim na niej.
2. W zakładce Sygnały odszukaj sygnału activate i skojarz go z zapropowaną nazwą funkcji z listy rozwijanej on_entry1_activate


Zawartość pliku kurs2.ui po wykonaniu powyższych czynności powinna zawierać:

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <requires lib="gtk+" version="2.24"/>
  <!-- interface-naming-policy project-wide -->
  <object class="GtkWindow" id="window1">
    <property name="can_focus">False</property>
    <property name="title" translatable="yes">Kurs Glade - 2</property>
    <signal name="destroy" handler="gtk_main_quit" swapped="no"/>
    <child>
      <object class="GtkVBox" id="vbox1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <child>
          <object class="GtkMenuBar" id="menubar1">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <child>
              <object class="GtkMenuItem" id="menuitem1">
                <property name="use_action_appearance">False</property>
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="label" translatable="yes">_Plik</property>
                <property name="use_underline">True</property>
                <child type="submenu">
                  <object class="GtkMenu" id="menu1">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <child>
                      <object class="GtkImageMenuItem" id="imagemenuitem1">
                        <property name="label">gtk-new</property>
                        <property name="use_action_appearance">False</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_underline">True</property>
                        <property name="use_stock">True</property>
                      </object>
                    </child>
                    <child>
                      <object class="GtkImageMenuItem" id="imagemenuitem2">
                        <property name="label">gtk-open</property>
                        <property name="use_action_appearance">False</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_underline">True</property>
                        <property name="use_stock">True</property>
                      </object>
                    </child>
                    <child>
                      <object class="GtkImageMenuItem" id="imagemenuitem3">
                        <property name="label">gtk-save</property>
                        <property name="use_action_appearance">False</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_underline">True</property>
                        <property name="use_stock">True</property>
                      </object>
                    </child>
                    <child>
                      <object class="GtkImageMenuItem" id="imagemenuitem4">
                        <property name="label">gtk-save-as</property>
                        <property name="use_action_appearance">False</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_underline">True</property>
                        <property name="use_stock">True</property>
                      </object>
                    </child>
                    <child>
                      <object class="GtkSeparatorMenuItem" id="separatormenuitem1">
                        <property name="use_action_appearance">False</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                      </object>
                    </child>
                    <child>
                      <object class="GtkImageMenuItem" id="imagemenuitem5">
                        <property name="label">gtk-quit</property>
                        <property name="use_action_appearance">False</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_underline">True</property>
                        <property name="use_stock">True</property>
                        <signal name="activate" handler="gtk_main_quit" swapped="no"/>
                      </object>
                    </child>
                  </object>
                </child>
              </object>
            </child>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkHBox" id="hbox1">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <child>
              <object class="GtkLabel" id="label1">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="label" translatable="yes">Wprowadź tekst</property>
              </object>
              <packing>
                <property name="expand">True</property>
                <property name="fill">True</property>
                <property name="position">0</property>
              </packing>
            </child>
            <child>
              <object class="GtkEntry" id="entry1">
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="invisible_char">●</property>
                <property name="primary_icon_activatable">False</property>
                <property name="secondary_icon_activatable">False</property>
                <property name="primary_icon_sensitive">True</property>
                <property name="secondary_icon_sensitive">True</property>
                <signal name="activate" handler="on_entry1_activate" swapped="no"/>
              </object>
              <packing>
                <property name="expand">True</property>
                <property name="fill">True</property>
                <property name="position">1</property>
              </packing>
            </child>
          </object>
          <packing>
            <property name="expand">True</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="label2">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
          </object>
          <packing>
            <property name="expand">True</property>
            <property name="fill">True</property>
            <property name="position">2</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

Zawartość pliku funkcje_zwrotne.h:
C/C++
#include <gtk/gtk.h>

extern GtkWidget * label;

void on_entry1_activate( GtkEntry * entry, gpointer data );

Zawartość pliku funkcje_zwrotne.c:
C/C++
#include "funkcje_zwrotne.h"

void on_entry1_activate( GtkEntry * entry, gpointer data )
{
    const gchar * tekst;
    gchar * wypisz;
   
    /* Czyszczenie zawrtości label2 */
    gtk_label_set_text( GTK_LABEL( label ), wypisz );
   
    /* Pobranie łańcucha tekstowego z entry1 */
    tekst = gtk_entry_get_text( entry );
   
    /* Utworzenie łańcucha tekstowego z tekstem 'Wpisano tekst: ' wraz zawartością pobraną z entry1 */
    wypisz = g_strdup_printf( "Wpisano tekst: %s", tekst );
   
    /* Ustawienie tekstu wskazujacego w wypisz w label2 */
    gtk_label_set_text( GTK_LABEL( label ), wypisz );
   
    /* Zwolnienie pamięci przydzielonej przez funkcję g_strdup_printf */
    g_free( wypisz );
}

Zawartość pliku main.c:
C/C++
#include <gtk/gtk.h>
#include "funkcje_zwrotne.h"

#define UI_FILE "kurs2.ui"

/* Zmienne globalne */

GtkWidget * label;

GtkWidget * utworz_okno( void )
{
    GtkWidget * okno;
    GtkBuilder * builder;
    GError * error = NULL;
   
    /* Tworzy obiekt buildera */
    builder = gtk_builder_new();
    /* Wczytuje zawartość interfejsu i sprawdza ewentualne błędy */
    if( !gtk_builder_add_from_file( builder, UI_FILE, & error ) )
    {
        g_warning( "Nie można wczytać plilu buildera: %s", error->message );
        g_error_free( error );
    }
   
    /* Łączy sygnały zawarte w pliku interfejsu z odpowiednimi funkcjami */
    gtk_builder_connect_signals( builder, NULL );
   
    /* Pobiera obiekt z nazwą "window1" */
    okno = GTK_WIDGET( gtk_builder_get_object( builder, "window1" ) );
   
    /* Pobiera obiekt z nazwą "label2" */
    label = GTK_WIDGET( gtk_builder_get_object( builder, "label2" ) );
   
   
    /* Obiekt buildera nie będzie już nam potrzebny, więc go "zwalniamy" */
    g_object_unref( builder );
   
    return okno;
}

int
main( int argc, char * argv[] )
{
    GtkWidget * okno;
   
   
    gtk_set_locale();
    gtk_init( & argc, & argv );
   
    okno = utworz_okno();
    gtk_widget_show( okno );
   
    gtk_main();
    return 0;
}
Poprzedni dokument Następny dokument
Podstawy obsługi programu Glade Tworzenie GUI - kontrolki GtkCheckButton i GtkRadioButton