Tworzenie aplikacji (Vala + GTK 3) [część trzecia]

W tej części zobaczymy, jak stworzyć kolejne okno i zaprojektować je za pomocą GTK. Zobaczymy też kilka funkcjonalności, takich jak dodawanie pytań i używanie trzech przycisków (50%, zamrożenie i przekazanie).

ToolBar i ToolButton

Utwórz ToolBar:

aplikacja2

Tworząc ToolButton, w tym przypadku umieścimy ikonę (domyślnie możesz znaleźć wiele ikon tutaj) z «from_stock (Gtk.Stock.IconName):

Przechwytywanie z 2013 12:07:23

Widzimy, że w naszej aplikacji mamy u góry pasek z dwoma przyciskami, gdzie pierwszego użyjemy do tworzenia nowych pytań, a drugiego do importu pytań (poprzez plik):

Przechwytywanie z 2013 11:08:00

Tworzenie pytań:
Przycisk, który stworzyliśmy wcześniej (na pasku narzędzi) po kliknięciu na niego, otworzy się nowe okno gtk, które pozwoli nam dodać pytania do naszej bazy danych:

aplikacja1

Aby utworzyć nowe okno, utworzymy nową klasę, którą nazwiemy Pytania, oraz w jaki sposób nasza klasa App utworzy nowe okno (this.window = new Gtk.Window ();)

Użyjemy kilku komponentów, aby stworzyć interfejs graficzny w kolejności;

-Label (pytania)

- Wejście (gdzie napiszemy pytanie)

-Label (odpowiedzi)

- 4 poziome pola, które będą zawierać wpis (odpowiedź) i przełącznik (aby wybrać, czy jest poprawny)

-Przycisk (do zakończenia)

Widzimy, jak to wygląda:

Przechwytywanie z 2013 12:08:01

Aby zapisać pytanie, będziemy musieli uzyskać tekst wpisów, uzyskuje się je za pomocą funkcji get_text (), która zwraca ciąg.

aplikacja5

Aby wiedzieć, czy Switch jest aktywny, możemy użyć jego metody get_active (), która zwraca wartość true, jeśli jest włączona, i flase, jeśli jest wyłączona.

 50%, przyciski Freeze i Pass:

 -fifty%:

Dla 50% musimy tylko sprawdzić, który przycisk jest prawidłowy i usunąć 2, które nie są poprawne, w tym przypadku anulujemy je za pomocą set_sensitive (false).

aplikacja4

Wynik:

aplikacja6

-Zamrażać:

Ponownie ustawiamy poprzeczkę na 0.

this.time_bar.set_fraction (0);

-Przechodzić:

button3.clicked.connect (() => {
this.bd_select_preguntas ();
this.next_pregunta();
});

 Następna część (4):

W kolejnej odsłonie zobaczymy, jak ulepszyć aspekty naszej aplikacji, takie jak to, że pytania nie zawsze pojawiają się w tej samej pozycji, umieść ikonę na aplikacji ...


12 komentarzy, zostaw swoje

Zostaw swój komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

*

*

  1. Odpowiedzialny za dane: Miguel Ángel Gatón
  2. Cel danych: kontrola spamu, zarządzanie komentarzami.
  3. Legitymacja: Twoja zgoda
  4. Przekazywanie danych: Dane nie będą przekazywane stronom trzecim, z wyjątkiem obowiązku prawnego.
  5. Przechowywanie danych: baza danych hostowana przez Occentus Networks (UE)
  6. Prawa: w dowolnym momencie możesz ograniczyć, odzyskać i usunąć swoje dane.

  1.   f3niX powiedział

    Uwielbiam odpowiedzi ... haha ​​.. Pozdrowienia

  2.   panchomora powiedział

    Bardzo dobre te artykuły o Valie .. Mam nadzieję, że inni .. Pozdrawiam

  3.   cr0t0 powiedział

    Czekam na twój wpis na Vala, mam nadzieję, że będzie wiele dostaw. Twoje zdrowie!

  4.   ptru powiedział

    Ładny artykuł, dzięki za udostępnienie.

  5.   Hiram powiedział

    Cześć,

    Śledziłem Twoje poprzednie wpisy dotyczące tworzenia tej aplikacji, problem pojawia się teraz, gdy próbuję uzyskać dostęp do wpisów nowego okna, robię to w ten sposób, w metodzie saveC klasy createQuestions (klasa, która tworzy okno).

    public void saveC () {
    string str = questionE.get_text ();
    stdout.printf ("Traktat% s \ n", str);
    }

    Ale na wyjściu otrzymuję to:
    (bu: 6196): Gtk-CRITICAL **: gtk_entry_get_text: asercja `GTK_IS_ENTRY (wpis) 'nie powiodła się

    Traktat (null)

    Widziałem kilka przykładów iw definicji metod, które uzyskują dostęp do wpisów, robią coś takiego:

    void on_activate (wpis Gtk.Entry) {
    nazwa = entry.get_text ();
    print ("\ nHello" + name + "! \ n \ n");
    }

    Ale mają tylko jeden wpis, aw tym przykładzie jest ich 5, więc tutaj już się zgubiłem, mógłbyś mnie lepiej prowadzić.

    1.    lolbimbo powiedział

      Cóż, kiedy tworzysz wpisy, nie nadajesz im tej samej nazwy, aby uzyskać tekst, który mają:

      r1 = wpis1.get_text ();
      r2 = wpis2.get_text ();
      r3 = wpis3.get_text ();
      r4 = wpis4.get_text ();

      Jeśli chcesz, włóż pastebin, a ja mu się przyjrzę

      1.    Hiram powiedział

        lolbimbo jeśli w rzeczywistości mam je z różnymi nazwami, ale używam tylko jednej do testów, ponieważ żaden z nich nie zwraca tekstu, który umieściłem we wpisie, wysyła mi wspomniany powyżej błąd:

        Ale na wyjściu otrzymuję to:
        (bu: 6196): Gtk-CRITICAL **: gtk_entry_get_text: asercja `GTK_IS_ENTRY (wpis) 'nie powiodła się

        Traktat (null)

        Wciąż prowadzę dochodzenie ...

        Twoje zdrowie.!!

      2.    Hiram powiedział

        Gotowe tutaj jest źródło, pozdrawiam.
        http://pastebin.com/pZG8GbrY

    2.    lolbimbo powiedział

      Cześć Hiram, słuchaj, powiem ci jak masz to zrobić, żeby to rozwiązać, pierwszą rzeczą jest to, że tworzymy nowe okno (nie jest to główne) i dzwoniąc na wpis (przepraszam za słów) Nie wiem, dlaczego to gówno nie wraca tak, jakby to był wpis, ale Widget, ale hej, aby go rozwiązać, wystarczy zmienić wszystkie statyczne komponenty, które utworzyłeś, na dynamiczne za pomocą var:

      var pytanieE = nowy Gtk.Entry ();

      wtedy funkcja będzie działać i otrzymasz tekst wewnątrz wpisu.

      save.clicked.connect (() => {
      // string str = this.questionE.get_text ();
      stdout.printf ("Traktat% s \ n", askE.get_text ());
      });

      Na koniec nie zapomnij zmienić wiersza, w którym dodajesz wpis, aby go pokazać:

      askE.show ();

      Zostawiam Ci cały kod z modyfikacją, abyś mógł sprawdzić, czy już działa, czyli czy musisz zmienić wszystkie elementy (przynajmniej wpisy), aby kontynuować aplikację.

      http://paste.desdelinux.net/5048

      pozdrowienia

      1.    Hiram powiedział

        Chale, tu znowu zawracam głowę, ciągle mam problemy, kod, który mi pokazujesz jest w porządku, tylko coś się dzieje:

        save.clicked.connect (() => {
        // string str = this.questionE.get_text ();
        stdout.printf ("Traktat% s \ n", askE.get_text ());
        });

        Znajduje się w klasie Pytania i działa dobrze, ale gdy chcę wejść z saveC, nie kompiluje się, wyrzuca mi ten błąd:

        bu01.vala: 50.38-50.50: error: Argument 1: Nie można przekonwertować z „Question.saveC” na „Gtk.Button.clicked”
        this.guardar.clicked.connect (this.guardarC);
        ^^^^^^^^^^^^^
        bu01.vala: 251.58-251.66: ostrzeżenie: Gtk.Stock jest przestarzały od 3.10
        bu01.vala: 260.59-260.67: ostrzeżenie: Gtk.Stock jest przestarzały od 3.10
        Kompilacja nie powiodła się: 1 błąd (y), 2 ostrzeżenia (a)

        Chcę myśleć, że dzieje się tak z powodu sposobu, w jaki przekazuję parametr, gdy występuje zdarzenie kliknięcia:
        this.guardar.clicked.connect (this.guardarC);

        Z góry dziękuję za informację zwrotną; tu zostawiam kod który wyrzuca błąd: http://pastebin.com/pLzExhrb

      2.    lolbimbo powiedział

        Nie testowałem tego, ale myślę, że usunięcie argumentu z funkcji spowoduje jego odrzucenie.

        public void saveC (Gtk.Entry asksE) {
        string str = questionE.get_text ();
        stdout.printf ("Traktat% s \ n", str);
        }

        a:
        public void saveC () {
        string str = questionE.get_text ();
        stdout.printf ("Traktat% s \ n", str);
        }

      3.    Hiram powiedział

        lolbimbo, próbowałem usunąć argument i nadal nie działa,

        Wciąż próbuję zrozumieć problem, jestem nowy w Vali i nie mogę znaleźć zbyt wielu dokumentów, mam nadzieję, że wkrótce znajdę rozwiązanie lub czekam na wydanie czwartej części xD.

        Wciąż próbuje ...

        Pozdrowienia.