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:
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):
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:
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:
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:
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.
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.
Ergebnis:
-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 ...
Ich liebe die Antworten ... haha ... Grüße
Sehr gut diese Artikel über Vala .. Ich hoffe die anderen .. Grüße
Ich habe Ihren Eintrag bei Vala ausstehend, ich hoffe, es gibt viele Lieferungen. Prost!
Schöner Artikel, danke fürs Teilen.
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.
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
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.!!
Fertig hier ist die Quelle, Grüße.
http://pastebin.com/pZG8GbrY
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
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
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);
}
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.