Oprettelse af en app (Vala + GTK 3) [3. del]

I denne del vil vi se, hvordan man opretter et andet vindue og designer det med GTK. Vi vil også se nogle funktioner som at tilføje spørgsmål og bruge de tre knapper (50%, fryse og videregive).

Toolbar og ToolButton

Opret en værktøjslinje:

app2

Oprettelse af en ToolButton, i dette tilfælde lægger vi et ikon (du kan som standard finde mange ikoner her) med «fra_stock (Gtk.Stock.IconName):

Optagelse fra 2013-12-07 23:26:52

Vi kan se, at i vores applikation har vi øverst en bjælke med to knapper, hvor vi bruger den første til at oprette nye spørgsmål og den anden til at importere spørgsmål (gennem en fil):

Optagelse fra 2013-11-08 00:30:32

Oprettelse af spørgsmål:
Den knap, vi oprettede tidligere (i værktøjslinjen), når vi klikker på den, åbner vi et nyt gtk-vindue, der giver os mulighed for at tilføje spørgsmål til vores database:

app1

For at oprette et nyt vindue opretter vi en ny klasse, som vi kalder spørgsmål, og hvordan vores App-klasse opretter et nyt vindue (this.window = new Gtk.Window ();)

Vi bruger et par komponenter til at oprette den grafiske grænseflade i rækkefølge;

-Mærke (spørgsmål)

- Indgang (hvor vi skriver spørgsmålet)

-Mærke (svar)

- 4 vandrette felter, der indeholder en indtastning (svaret) og en switch (for at vælge, om det er korrekt)

-Knap (for at fuldføre)

Vi kan se, hvordan det ser ud:

Optagelse fra 2013-12-08 01:07:08

For at gemme spørgsmålet bliver vi nødt til at hente teksten i posterne, de opnås med get_text (), som returnerer en streng.

app5

For at vide, om en switch er aktiv, kan vi bruge metoden get_active () som returnerer sandt, hvis det er tændt, og flasker, hvis det er slukket.

 50%, Frys og Pass-knapper:

 halvtreds%:

For 50% skal vi kun se på, hvilken der er den rigtige knap og fjerne 2, der ikke er korrekte. I dette tilfælde annullerer vi dem med set_sensitive (false).

app4

resultat:

app6

-Fryse:

Vi satte bjælken til 0 igen.

this.time_bar.set_fraction (0);

-Passere:

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

 Næste del (4):

I den næste rate vil vi se, hvordan vi forbedrer aspekter af vores applikation, såsom at spørgsmålene ikke altid vises i samme position, sæt et ikon i appen ...


Efterlad din kommentar

Din e-mailadresse vil ikke blive offentliggjort. Obligatoriske felter er markeret med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Control SPAM, management af kommentarer.
  3. Legitimering: Dit samtykke
  4. Kommunikation af dataene: Dataene vil ikke blive kommunikeret til tredjemand, undtagen ved juridisk forpligtelse.
  5. Datalagring: Database hostet af Occentus Networks (EU)
  6. Rettigheder: Du kan til enhver tid begrænse, gendanne og slette dine oplysninger.

  1.   f3niX sagde han

    Jeg elsker svarene ... haha ​​.. Hilsner

  2.   panchomora sagde han

    Meget gode disse artikler om vala .. Jeg håber de andre .. hilsner

  3.   CR0T0 sagde han

    Jeg afventer dit indlæg på Vala, jeg håber der vil være mange leveringer. Hilsen!

  4.   pptru sagde han

    Dejlig artikel, tak for deling.

  5.   Hiram sagde han

    Hej,

    Jeg har fulgt dine tidligere poster for oprettelsen af ​​denne app, problemet kommer nu, hvor jeg prøver at få adgang til posterne i det nye vindue, jeg gør det på denne måde i saveC-metoden i createQuestions-klassen (klasse, der opretter vinduet) .

    offentlig ugyldig gemmeC () {
    streng str = spørgsmålE.get_text ();
    stdout.printf ("Traktat% s \ n", str);
    }

    Men på output får jeg dette:
    (bu: 6196): Gtk-CRITICAL **: gtk_entry_get_text: påstand `GTK_IS_ENTRY (post) 'mislykkedes

    Traktat (null)

    Jeg har set nogle eksempler, og i definitionen af ​​metoderne, der får adgang til posterne, gør de noget som dette:

    ugyldigt on_activate (Gtk.Entry entry) {
    navn = entry.get_text ();
    udskriv ("\ nHej" + navn + "! \ n \ n");
    }

    Men de har kun en post, og i dette eksempel er der 5, så her er jeg allerede tabt, du kan guide mig bedre.

    1.    lolbimbo sagde han

      Når du opretter posterne, giver du dem ikke det samme navn, for at få den tekst, du har, gør du:

      r1 = indgang1.get_tekst ();
      r2 = indgang2.get_tekst ();
      r3 = indgang3.get_tekst ();
      r4 = indgang4.get_tekst ();

      Hvis du vil, skal du lægge en pastebin, så ser jeg på den

      1.    Hiram sagde han

        lolbimbo hvis jeg faktisk har dem med forskellige navne, men jeg bruger kun en til tests, da ingen af ​​dem returnerer den tekst, som jeg indsatte i posten, sender den mig ovennævnte fejl:

        Men på output får jeg dette:
        (bu: 6196): Gtk-CRITICAL **: gtk_entry_get_text: påstand `GTK_IS_ENTRY (post) 'mislykkedes

        Traktat (null)

        Jeg undersøger stadig ...

        Skål. !!

      2.    Hiram sagde han

        Klar her er kilden, hilsner.
        http://pastebin.com/pZG8GbrY

    2.    lolbimbo sagde han

      Hej Hiram, se, jeg fortæller dig, hvordan du skal gøre det for at løse det, det første, dette sker, fordi vi opretter et nyt vindue (det er ikke det vigtigste), og når vi kalder posten, ( undskyld ordene) Jeg ved ikke, hvorfor den lort ikke vender tilbage som om det var en post, men en widget, men hej, for at løse det skal du bare ændre alle de statiske komponenter, du oprettede, til dynamisk ved hjælp af var:

      var questionE = ny Gtk.Entry ();

      så fungerer funktionen, og du modtager teksten inde i posten.

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

      Endelig glem ikke at ændre linjen, hvor du tilføjer posten for at vise den:

      askE.show ();

      Jeg efterlader dig den komplette kode med ændringen, så du kan kontrollere, at den allerede fungerer, det vil sige, hvis du skal ændre alle elementerne (i det mindste posterne) for at fortsætte med applikationen.

      http://paste.desdelinux.net/5048

      hilsen

      1.    Hiram sagde han

        Chale, her gider jeg igen, jeg har stadig problemer, koden du viser mig er fin, kun der sker noget i tilfælde:

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

        Det er inden for spørgsmålsklassen, og det fungerer fint, men når du ønsker at komme ind fra saveC, kompilerer det ikke, det kaster mig denne fejl:

        bu01.vala: 50.38-50.50: fejl: Argument 1: Kan ikke konvertere fra `Questions.saveC 'til` Gtk.Button.clicked'
        this.guardar.clicked.connect (this.guardarC);
        ^^^^^^^^^^^^^^
        bu01.vala: 251.58-251.66: advarsel: Gtk.Stock er udfaset siden 3.10
        bu01.vala: 260.59-260.67: advarsel: Gtk.Stock er udfaset siden 3.10
        Kompilering mislykkedes: 1 fejl, 2 advarsler

        Jeg vil tænke, det er på grund af den måde, jeg sender parameteren, når klikhændelsen opstår:
        this.guardar.clicked.connect (this.guardarC);

        På forhånd tak for feedbacken; her efterlader jeg koden, der kaster fejlen: http://pastebin.com/pLzExhrb

      2.    lolbimbo sagde han

        Jeg har ikke prøvet det, men jeg tror, ​​at fjernelse af argumentet fra funktionen vil smide det væk.

        offentlig ugyldig gemmeC (Gtk.Entry spørger E) {
        streng str = spørgsmålE.get_text ();
        stdout.printf ("Traktat% s \ n", str);
        }

        a:
        offentlig ugyldig gemmeC () {
        streng str = spørgsmålE.get_text ();
        stdout.printf ("Traktat% s \ n", str);
        }

      3.    Hiram sagde han

        lolbimbo, jeg har prøvet at fjerne argumentet, og det fungerer stadig ikke,

        Jeg prøver stadig at forstå problemet, jeg er ny i Vala og kan ikke finde meget dokumentation, jeg håber snart at finde løsningen eller vente på, at du frigiver den fjerde del xD.

        Jeg fortsætter med at prøve ...

        Greetings.