Een app maken (Vala + GTK 3) [3e deel]

In dit deel zullen we zien hoe we een ander venster kunnen maken en dit met GTK kunnen ontwerpen. We zullen ook enkele functionaliteiten zien zoals het toevoegen van vragen en het gebruik van de drie knoppen (50%, stilzetten en passeren).

ToolBar en ToolButton

Maak een werkbalk:

app2

Een ToolButton maken, in dit geval zullen we een pictogram plaatsen (u kunt standaard veel pictogrammen vinden hier) met «from_stock (Gtk.Stock.IconName):

Leg vast van 2013-12-07 23:26:52

We kunnen zien dat we in onze applicatie een balk hebben met twee knoppen bovenaan, waar we de eerste zullen gebruiken om nieuwe vragen te maken en de tweede om vragen te importeren (via een bestand):

Leg vast van 2013-11-08 00:30:32

Vragen aanmaken:
Met de knop die we eerder hebben gemaakt (in de werkbalk) als we erop klikken, openen we een nieuw gtk-venster waarmee we vragen aan onze database kunnen toevoegen:

app1

Om een ​​nieuw venster te maken, zullen we een nieuwe klasse aanmaken, die we Vragen zullen noemen, en hoe onze App-klasse een nieuw venster zal aanmaken (this.window = new Gtk.Window ();)

We zullen een paar componenten gebruiken om de grafische interface op volgorde te maken;

-Label (vragen)

- Invoer (waar we de vraag zullen schrijven)

-Label (reacties)

- 4 horizontale vakken die een invoer (het antwoord) en een schakelaar bevatten (om te selecteren of dit de juiste is)

-Button (om te voltooien)

We kunnen zien hoe het eruit ziet:

Leg vast van 2013-12-08 01:07:08

Om de vraag op te slaan, moeten we de tekst van de items ophalen, ze worden verkregen met get_text () die een string retourneert.

app5

Om te weten of een switch actief is, kunnen we de bijbehorende methode gebruiken word actief () die true retourneert als het is ingeschakeld en flase als het is uitgeschakeld.

 50%, Freeze en Pass-knoppen:

 -vijftig%:

Voor 50% hoeven we alleen maar te kijken welke de juiste knop is en 2 die niet juist zijn te verwijderen, in dit geval annuleren we ze met set_sensitive (false).

app4

resultaat:

app6

-Bevriezen:

We zetten de lat weer op 0.

this.timebar.set_fraction (0);

-Voorbij gaan aan:

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

 Volgend deel (4):

In de volgende aflevering zullen we zien hoe we aspecten van onze applicatie kunnen verbeteren, zoals dat de vragen niet altijd op dezelfde positie verschijnen, een pictogram op de app plaatsen ...


Laat je reactie achter

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

*

*

  1. Verantwoordelijk voor de gegevens: Miguel Ángel Gatón
  2. Doel van de gegevens: Controle SPAM, commentaarbeheer.
  3. Legitimatie: uw toestemming
  4. Mededeling van de gegevens: De gegevens worden niet aan derden meegedeeld, behalve op grond van wettelijke verplichting.
  5. Gegevensopslag: database gehost door Occentus Networks (EU)
  6. Rechten: u kunt uw gegevens op elk moment beperken, herstellen en verwijderen.

  1.   f3niX zei

    Ik hou van de antwoorden ... haha ​​.. Groeten

  2.   panchomora zei

    Heel goed deze artikelen over vala .. ik hoop de anderen .. groeten

  3.   cr0t0 zei

    Ik wacht op uw bericht over Vala, ik hoop dat er veel leveringen zijn Proost!

  4.   ptru zei

    Leuk artikel, bedankt voor het delen.

  5.   Hiram zei

    Hallo,

    Ik heb je eerdere vermeldingen gevolgd voor het maken van deze app, het probleem komt nu dat ik probeer toegang te krijgen tot de vermeldingen van het nieuwe venster, ik doe het op deze manier, in de saveC-methode van de createQuestions-klasse (klasse die het venster maakt).

    openbare ongeldige saveC () {
    string str = vraagE.get_text ();
    stdout.printf ("Verdrag% s \ n", str);
    }

    Maar bij uitvoer krijg ik dit:
    (bu: 6196): Gtk-CRITICAL **: gtk_entry_get_text: assertion `GTK_IS_ENTRY (entry) 'mislukt

    Verdrag (null)

    Ik heb enkele voorbeelden gezien en in de definitie van de methoden die toegang krijgen tot de items, doen ze zoiets als dit:

    ongeldig on_activate (Gtk.Entry invoer) {
    naam = entry.get_text ();
    print ("\ nHallo" + naam + "! \ n \ n");
    }

    Maar ze hebben maar één vermelding en in dit voorbeeld zijn er 5, dus hier ben ik al verdwaald, je zou me beter kunnen begeleiden.

    1.    lolbimbo zei

      Welnu, wanneer u de vermeldingen maakt, geeft u ze niet dezelfde naam, om de tekst te krijgen die ze hebben, doet u:

      r1 = entry1.get_text();
      r2 = entry2.get_text();
      r3 = entry3.get_text();
      r4 = entry4.get_text();

      Als je wilt, leg dan een pastabin en ik zal ernaar kijken

      1.    Hiram zei

        lolbimbo als ik ze in feite met verschillende namen heb, maar ik gebruik er alleen een voor tests, omdat geen van hen de tekst retourneert die ik in het item heb ingevoerd, het stuurt me de bovenstaande foutmelding:

        Maar bij uitvoer krijg ik dit:
        (bu: 6196): Gtk-CRITICAL **: gtk_entry_get_text: assertion `GTK_IS_ENTRY (entry) 'mislukt

        Verdrag (null)

        Ik ben nog aan het onderzoeken ...

        Proost. !!

      2.    Hiram zei

        Hier klaar is de bron, groeten.
        http://pastebin.com/pZG8GbrY

    2.    lolbimbo zei

      Hallo Hiram, kijk, ik zal je vertellen hoe je het moet doen om het op te lossen, het eerste is dat we een nieuw venster aan het maken zijn (het is niet het hoofdvenster), en bij het aanroepen van het item (sorry voor de woorden) Ik weet niet waarom Die shit keert niet terug alsof het een item is, maar een Widget, maar ach, om het op te lossen hoef je alleen maar alle statische componenten die je hebt gemaakt in dynamisch te veranderen met var:

      var questionE = nieuwe Gtk.Entry ();

      dan werkt de functie en ontvang je de tekst in het item.

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

      Vergeet ten slotte niet om de regel waar u het item toevoegt te wijzigen om het weer te geven:

      askE.show ();

      Ik laat u de volledige code met de wijziging achter, zodat u kunt controleren of deze al werkt, dat wil zeggen als u alle elementen (in ieder geval de invoer) moet wijzigen om door te gaan met de toepassing.

      http://paste.desdelinux.net/5048

      groeten

      1.    Hiram zei

        Chale, hier weer last van, ik heb nog steeds problemen, de code die je me laat zien is prima, alleen gebeurt er iets in het geval:

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

        Het bevindt zich in de klasse Vragen en het werkt prima, maar als ik vanuit saveC naar binnen wil, compileert het niet, maar krijg ik de volgende foutmelding:

        bu01.vala: 50.38-50.50: error: Argument 1: kan niet converteren van `Questions.saveC 'naar` Gtk.Button.clicked'
        this.guardar.clicked.connect (this.guardarC);

        bu01.vala: 251.58-251.66: waarschuwing: Gtk.Stock is verouderd sinds 3.10
        bu01.vala: 260.59-260.67: waarschuwing: Gtk.Stock is verouderd sinds 3.10
        Compilatie mislukt: 1 fout (en), 2 waarschuwing (en)

        Ik wil denken dat het komt door de manier waarop ik de parameter passeer wanneer de klikgebeurtenis plaatsvindt:
        this.guardar.clicked.connect (this.guardarC);

        Bij voorbaat dank voor de feedback; hier laat ik de code achter die de fout veroorzaakt: http://pastebin.com/pLzExhrb

      2.    lolbimbo zei

        Ik heb het niet geprobeerd, maar ik denk dat het verwijderen van het argument uit de functie het zal weggooien.

        public void saveC (Gtk.Entry vraagtE) {
        string str = vraagE.get_text ();
        stdout.printf ("Verdrag% s \ n", str);
        }

        a:
        openbare ongeldige saveC () {
        string str = vraagE.get_text ();
        stdout.printf ("Verdrag% s \ n", str);
        }

      3.    Hiram zei

        lolbimbo, ik heb geprobeerd het argument te verwijderen en het werkt nog steeds niet,

        Ik probeer het probleem nog steeds te begrijpen, ik ben nieuw bij Vala en ik kan niet veel documentatie vinden, ik hoop de oplossing snel te vinden of wacht tot je het vierde deel xD vrijgeeft.

        Ik blijf proberen ...

        Groeten.