V této části uvidíme, jak vytvořit další okno a navrhnout ho pomocí GTK. Uvidíme také některé funkce, jako je přidávání otázek a používání tří tlačítek (50%, zmrazení a předání).
ToolBar a ToolButton
Vytvořit panel nástrojů:
Při vytváření ToolButton v tomto případě vložíme ikonu (ve výchozím nastavení najdete mnoho ikon zde) s «from_stock (Gtk.Stock.IconName):
Vidíme, že v naší aplikaci máme nahoře lištu se dvěma tlačítky, kde první použijeme k vytvoření nových otázek a druhou k importu otázek (prostřednictvím souboru):
Vytváření otázek:
Tlačítko, které jsme dříve vytvořili (na panelu nástrojů), když na něj klikneme, otevřeme nové okno gtk, které nám umožní přidávat otázky do naší databáze:
Chcete-li vytvořit nové okno, vytvoříme novou třídu, kterou budeme nazývat Dotazy, a jak naše třída aplikace vytvoří nové okno (this.window = new Gtk.Window ();)
K vytvoření grafického rozhraní v pořádku použijeme několik komponent;
-Štítek (Dotazy)
- Vstup (kde budeme psát otázku)
-Label (odpovědi)
- 4 vodorovná pole, která budou obsahovat Vstup (odpověď) a Přepínač (vybrat, zda je správný)
-Tlačítko (k dokončení)
Vidíme, jak to vypadá:
Chcete-li uložit otázku, budeme muset získat text záznamů, které se získají pomocí metody get_text (), která vrací řetězec.
Abychom věděli, zda je přepínač aktivní, můžeme použít jeho metodu get_active () který vrací true, pokud je zapnutý, a flase, pokud je vypnutý.
50%, tlačítka Freeze a Pass:
-padesáti% :
U 50% se musíme pouze podívat, které tlačítko je správné, a odstranit 2, které nejsou správné, v tomto případě je zrušíme pomocí set_sensitive (false).
výsledek:
-Zmrazit:
Znovu jsme nastavili lištu na 0.
this.time_bar.set_fraction (0);
-Složit:
button3.clicked.connect (() => {
this.bd_select_preguntas ();
this.next_pregunta();
});
Další část (4):
V příštím pokračování uvidíme, jak vylepšit aspekty naší aplikace, například to, že se otázky nebudou vždy zobrazovat na stejné pozici, umístit na aplikaci ikonu ...
Miluji odpovědi ... haha .. Zdravím
Velmi dobré tyto články o vala .. doufám, že ostatní .. pozdravy
Čekám na váš vstup na Valu, doufám, že bude mnoho dodávek. Na zdraví!
Pěkný článek, děkuji za sdílení.
Dobrý den,
Sledoval jsem vaše předchozí položky pro vytvoření této aplikace, problém přichází teď, když se snažím získat přístup k záznamům nového okna, dělám to tak, metodou saveC třídy createQuestions (třída, která vytváří okno) .
public void saveC () {
řetězec str = questionE.get_text ();
stdout.printf ("Smlouva% s \ n", str);
}
Ale na výstupu dostanu toto:
(bu: 6196): Gtk-CRITICAL **: gtk_entry_get_text: assertion `GTK_IS_ENTRY (entry) 'failed
Smlouva (null)
Viděl jsem několik příkladů a v definici metod, které přistupují k záznamům, dělají něco takového:
void on_activate(Gtk.Entry entry) {
jméno = záznam.get_text ();
print ("\ nAhoj" + jméno + "! \ n \ n");
}
Ale mají pouze jeden vstup a v tomto příkladu je 5, takže tady jsem už ztracen, mohl byste mě lépe vést.
Když vytvoříte záznamy, nedáte jim stejný název, abyste získali text, který mají:
r1 = záznam1.get_text ();
r2 = záznam2.get_text ();
r3 = záznam3.get_text ();
r4 = záznam4.get_text ();
Pokud chcete, vložte pastebin a já se na to podívám
lolbimbo, pokud je ve skutečnosti mám s různými jmény, ale používám pouze jeden pro testy, protože žádný z nich nevrací text, který jsem vložil do položky, pošle mi chybu uvedenou výše:
Ale na výstupu dostanu toto:
(bu: 6196): Gtk-CRITICAL **: gtk_entry_get_text: assertion `GTK_IS_ENTRY (entry) 'failed
Smlouva (null)
Stále vyšetřuji ...
Na zdraví.!!
Připraven je zdroj, pozdravy.
http://pastebin.com/pZG8GbrY
Ahoj Hirame, podívej, řeknu ti, jak to musíš udělat, abys to vyřešil, první věc, která se stane, protože vytváříme nové okno (není to hlavní), a při volání záznamu (omlouvám se za slova) nevím proč Že hovno se nevrátí, jako by to byl záznam, ale Widget, ale hej, k jeho vyřešení stačí změnit všechny statické komponenty, které jste vytvořili, na dynamické pomocí var:
var questionE = new Gtk.Entry ();
pak funkce bude fungovat a obdržíte text uvnitř položky.
save.clicked.connect (() => {
// řetězec str = this.questionE.get_text ();
stdout.printf ("Smlouva% s \ n", askE.get_text ());
});
Nakonec nezapomeňte změnit řádek, kam přidáte položku, aby se zobrazila:
askE.show ();
Nechám vám kompletní kód s úpravou, abyste mohli zkontrolovat, zda již funguje, to znamená, pokud musíte změnit všechny prvky (alespoň položky), abyste mohli pokračovat v aplikaci.
http://paste.desdelinux.net/5048
pozdravy
Chale, tady se znovu trápím, stále mám problémy, kód, který mi ukážeš, je v pořádku, jen se něco stane v případě:
save.clicked.connect (() => {
// řetězec str = this.questionE.get_text ();
stdout.printf ("Smlouva% s \ n", askE.get_text ());
});
Je to uvnitř třídy Questions a funguje to dobře, ale když chcete vstoupit z saveC, nezkompiluje mi to hodí tuto chybu:
bu01.vala: 50.38-50.50: chyba: Argument 1: Nelze převést z `Questions.saveC 'na` Gtk.Button.clicked'
this.guardar.clicked.connect (this.guardarC);
^^^^^^^^^^^^^^
bu01.vala: 251.58-251.66: varování: Gtk.Stock je zastaralý od 3.10
bu01.vala: 260.59-260.67: varování: Gtk.Stock je zastaralý od 3.10
Kompilace se nezdařila: 1 chyba (y), 2 varování (y)
Chci si myslet, že je to kvůli způsobu, jakým předávám parametr, když dojde k události kliknutí:
this.guardar.clicked.connect (this.guardarC);
Předem děkujeme za zpětnou vazbu; zde nechávám kód, který vyvolá chybu: http://pastebin.com/pLzExhrb
Nezkoušel jsem to, ale myslím, že odstranění argumentu z funkce to vyhodí.
public void saveC (Gtk.Entry askE) {
řetězec str = questionE.get_text ();
stdout.printf ("Smlouva% s \ n", str);
}
a:
public void saveC () {
řetězec str = questionE.get_text ();
stdout.printf ("Smlouva% s \ n", str);
}
lolbimbo, pokusil jsem se odstranit argument a stále to nefunguje,
Stále se snažím porozumět problému, jsem pro Valu nový a nemohu najít mnoho dokumentace, doufám, že brzy najdu řešení nebo počkám, až vydáte čtvrtou část xD.
Stále se snažím ...
Zdravím.