App erstellen (Vala + GTK 3) [3. Teil]

In diesem Teil erfahren Sie, wie Sie ein weiteres Fenster erstellen und mit GTK gestalten. Wir werden auch einige Funktionen sehen, wie das Hinzufügen von Fragen und die Verwendung der drei Schaltflächen (50%, Einfrieren und Bestehen).

ToolBar und ToolButton

Erstellen Sie eine Symbolleiste:

app2

Wenn Sie einen ToolButton erstellen, wird in diesem Fall ein Symbol eingefügt (standardmäßig finden Sie viele Symbole hier) mit «from_stock (Gtk.Stock.IconName):

Aufnahme vom 2013-12-07 23:26:52

Wir können sehen, dass wir in unserer Anwendung eine Leiste mit zwei Schaltflächen oben haben, in der wir die erste zum Erstellen neuer Fragen und die zweite zum Importieren von Fragen (über eine Datei) verwenden:

Aufnahme vom 2013-11-08 00:30:32

Fragen erstellen:
Mit der Schaltfläche, die wir zuvor (in der Symbolleiste) erstellt haben, wenn wir darauf klicken, wird ein neues GTK-Fenster geöffnet, in dem wir Fragen zu unserer Datenbank hinzufügen können:

app1

Um ein neues Fenster zu erstellen, erstellen wir eine neue Klasse, die wir Fragen nennen, und wie unsere App-Klasse ein neues Fenster erstellt (this.window = new Gtk.Window ();)

Wir werden einige Komponenten verwenden, um die grafische Oberfläche der Reihe nach zu erstellen.

-Label (Fragen)

- Eintrag (wo wir die Frage schreiben werden)

-Label (Antworten)

- 4 horizontale Felder, die einen Eintrag (die Antwort) und einen Schalter enthalten (um auszuwählen, ob er korrekt ist)

-Knopf (zum Ausfüllen)

Wir können sehen, wie es aussieht:

Aufnahme vom 2013-12-08 01:07:08

Um die Frage zu speichern, müssen wir den Text der Einträge erhalten. Sie werden mit get_text () abgerufen, das eine Zeichenfolge zurückgibt.

app5

Um zu wissen, ob ein Switch aktiv ist, können wir seine Methode verwenden aktiv werden (), das true zurückgibt, wenn es eingeschaltet ist, und flase, wenn es ausgeschaltet ist.

 50%, Freeze- und Pass-Buttons:

 -fünfzig% :

Für 50% müssen wir nur schauen, welche Schaltfläche die richtige ist, und 2 entfernen, die nicht die richtige sind. In diesem Fall brechen wir sie mit set_sensitive (false) ab.

app4

Ergebnis:

app6

-Einfrieren:

Wir setzen die Messlatte wieder auf 0.

this.timebar.set_fraction (0);

-Bestehen:

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

 Nächster Teil (4):

In der nächsten Folge werden wir sehen, wie wir Aspekte unserer Anwendung verbessern können, z. B. dass die Fragen nicht immer an derselben Position erscheinen. Fügen Sie der App ein Symbol hinzu ...


Hinterlasse einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert mit *

*

*

  1. Verantwortlich für die Daten: Miguel Ángel Gatón
  2. Zweck der Daten: Kontrolle von SPAM, Kommentarverwaltung.
  3. Legitimation: Ihre Zustimmung
  4. Übermittlung der Daten: Die Daten werden nur durch gesetzliche Verpflichtung an Dritte weitergegeben.
  5. Datenspeicherung: Von Occentus Networks (EU) gehostete Datenbank
  6. Rechte: Sie können Ihre Informationen jederzeit einschränken, wiederherstellen und löschen.

  1.   f3niX sagte

    Ich liebe die Antworten ... haha ​​... Grüße

  2.   Panchomora sagte

    Sehr gut diese Artikel über Vala .. Ich hoffe die anderen .. Grüße

  3.   cr0t0 sagte

    Ich habe Ihren Eintrag bei Vala ausstehend, ich hoffe, es gibt viele Lieferungen. Prost!

  4.   pptru sagte

    Schöner Artikel, danke fürs Teilen.

  5.   Hiram sagte

    Hallo,

    Ich habe Ihre vorherigen Einträge für die Erstellung dieser App befolgt. Das Problem tritt nun auf, da ich versuche, auf die Einträge des neuen Fensters zuzugreifen. Ich mache dies auf diese Weise in der saveC-Methode der createQuestions-Klasse (Klasse, die das Fenster erstellt).

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

    Aber bei der Ausgabe bekomme ich folgendes:
    (bu: 6196): Gtk-CRITICAL **: gtk_entry_get_text: Behauptung `GTK_IS_ENTRY (Eintrag) 'fehlgeschlagen

    Vertrag (null)

    Ich habe einige Beispiele gesehen und in der Definition der Methoden, die auf die Einträge zugreifen, tun sie ungefähr so:

    void on_activate (Gtk.Entry-Eintrag) {
    name = eintrag.get_text ();
    print ("\ nHallo" + Name + "! \ n \ n");
    }

    Aber sie haben nur einen Eintrag und in diesem Beispiel gibt es 5, also bin ich hier schon verloren, du könntest mich besser führen.

    1.    Lolbimbo sagte

      Wenn Sie die Einträge erstellen, geben Sie ihnen nicht den gleichen Namen, um den Text zu erhalten, den Sie haben:

      r1 = Eintrag1.get_text ();
      r2 = Eintrag2.get_text ();
      r3 = Eintrag3.get_text ();
      r4 = Eintrag4.get_text ();

      Wenn Sie möchten, legen Sie einen Pastebin und ich werde es mir ansehen

      1.    Hiram sagte

        lolbimbo Wenn ich sie tatsächlich mit unterschiedlichen Namen habe, aber nur einen für Tests verwende, da keiner von ihnen den Text zurückgibt, den ich in den Eintrag eingegeben habe, wird mir der oben erwähnte Fehler gesendet:

        Aber bei der Ausgabe bekomme ich folgendes:
        (bu: 6196): Gtk-CRITICAL **: gtk_entry_get_text: Behauptung `GTK_IS_ENTRY (Eintrag) 'fehlgeschlagen

        Vertrag (null)

        Ich untersuche immer noch ...

        Prost.!!

      2.    Hiram sagte

        Fertig hier ist die Quelle, Grüße.
        http://pastebin.com/pZG8GbrY

    2.    Lolbimbo sagte

      Hallo Hiram, schau, ich werde dir sagen, wie du es tun musst, um es zu lösen. Das erste ist, dass wir ein neues Fenster erstellen (es ist nicht das Hauptfenster), und wenn ich den Eintrag aufrufe (Entschuldigung für die Worte), weiß ich nicht warum Diese Scheiße kehrt nicht zurück, als wäre es ein Eintrag, sondern ein Widget, aber hey, um sie zu lösen, müssen Sie nur alle statischen Komponenten, die Sie mit var erstellt haben, in dynamisch ändern:

      var questionE = new Gtk.Entry ();

      dann funktioniert die Funktion und Sie erhalten den Text innerhalb des Eintrags.

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

      Vergessen Sie nicht, die Zeile zu ändern, in der Sie den Eintrag hinzufügen, um ihn anzuzeigen:

      askE.show ();

      Ich überlasse Ihnen den vollständigen Code mit der Änderung, damit Sie überprüfen können, ob er bereits funktioniert, dh ob Sie alle Elemente (zumindest die Einträge) ändern müssen, um mit der Anwendung fortzufahren.

      http://paste.desdelinux.net/5048

      Grüße

      1.    Hiram sagte

        Chale, hier drüben wieder störend, ich habe immer wieder Probleme, der Code, den Sie mir zeigen, ist in Ordnung, nur etwas passiert in dem Fall:

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

        Es befindet sich in der Questions-Klasse und funktioniert einwandfrei. Wenn Sie jedoch von saveC aus eingeben möchten, wird es nicht kompiliert. Es gibt folgenden Fehler aus:

        bu01.vala: 50.38-50.50: Fehler: Argument 1: Konvertierung von "Questions.saveC" in "Gtk.Button.clicked" nicht möglich
        this.guardar.clicked.connect (this.guardarC);
        ^^^^^^^^^^^^
        bu01.vala: 251.58-251.66: Warnung: Gtk.Stock ist seit 3.10 veraltet
        bu01.vala: 260.59-260.67: Warnung: Gtk.Stock ist seit 3.10 veraltet
        Kompilierung fehlgeschlagen: 1 Fehler, 2 Warnung (en)

        Ich möchte glauben, dass dies daran liegt, wie ich den Parameter beim Auftreten des Klickereignisses übergebe:
        this.guardar.clicked.connect (this.guardarC);

        Vielen Dank im Voraus für das Feedback; Hier lasse ich den Code, der den Fehler auslöst: http://pastebin.com/pLzExhrb

      2.    Lolbimbo sagte

        Ich habe es nicht ausprobiert, aber ich denke, dass das Entfernen des Arguments aus der Funktion es wegwerfen wird.

        public void saveC (Gtk.Entry fragt nach E) {
        Zeichenfolge str = questionE.get_text ();
        stdout.printf ("Vertrag% s \ n", str);
        }

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

      3.    Hiram sagte

        lolbimbo, ich habe versucht, das Argument zu entfernen und es funktioniert immer noch nicht.

        Ich versuche immer noch, das Problem zu verstehen, ich bin neu bei Vala und ich kann nicht viel Dokumentation finden. Ich hoffe, bald die Lösung zu finden oder darauf zu warten, dass Sie den vierten Teil xD veröffentlichen.

        Ich versuche es weiter ...

        Grüße.