Creazione di un'app (Vala + GTK 3) [3a parte]

In questa parte vedremo come creare un'altra finestra e disegnarla con GTK. Vedremo anche alcune funzionalità come l'aggiunta di domande e l'utilizzo dei tre pulsanti (50%, blocca e passa).

ToolBar e ToolButton

Crea una barra degli strumenti:

app2

Creando un ToolButton, in questo caso metteremo un'icona (puoi trovare molte icone di default qui) con «from_stock (Gtk.Stock.IconName):

Cattura da 2013-12-07 23:26:52

Possiamo vedere che nella nostra applicazione abbiamo una barra con due pulsanti in alto, dove useremo il primo per creare nuove domande e il secondo per importare domande (tramite un file):

Cattura da 2013-11-08 00:30:32

Creazione di domande:
Il pulsante che abbiamo creato in precedenza (nella barra degli strumenti) quando ci clicchiamo sopra, apriremo una nuova finestra gtk che ci permetterà di aggiungere domande al nostro database:

app1

Per creare una nuova finestra creeremo una nuova classe, che chiameremo Domande, e come la nostra classe App creerà una nuova finestra (this.window = new Gtk.Window ();)

Useremo alcuni componenti per creare l'interfaccia grafica in ordine;

-Etichetta (Domande)

- Ingresso (dove scriveremo la domanda)

-Etichetta (risposte)

- 4 caselle orizzontali che conterranno una Entry (la risposta) e un Switch (da selezionare se è quella corretta)

-Pulsante (per completare)

Possiamo vedere come appare:

Cattura da 2013-12-08 01:07:08

Per salvare la domanda dovremo ottenere il testo delle entrate, si ottengono con get_text () che restituisce una stringa.

app5

Per sapere se è attivo uno Switch possiamo usare il suo metodo get_active () che restituisce true se è acceso e flase se è spento.

 Pulsanti 50%, Blocca e Passa:

 -fifty%:

Per il 50% dobbiamo solo guardare quale è il pulsante corretto e rimuovere 2 che non sono quello corretto, in questo caso li cancelliamo con set_sensitive (false).

app4

risultato:

app6

-Congelare:

Impostiamo nuovamente la barra su 0.

this.timebar.set_fraction (0);

-Passaggio:

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

 Parte successiva (4):

Nella prossima puntata vedremo come migliorare gli aspetti della nostra applicazione, come ad esempio che le domande non appaiono sempre nella stessa posizione, metti un'icona sull'app ...


Lascia un tuo commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *

*

*

  1. Responsabile dei dati: Miguel Ángel Gatón
  2. Scopo dei dati: controllo SPAM, gestione commenti.
  3. Legittimazione: il tuo consenso
  4. Comunicazione dei dati: I dati non saranno oggetto di comunicazione a terzi se non per obbligo di legge.
  5. Archiviazione dati: database ospitato da Occentus Networks (UE)
  6. Diritti: in qualsiasi momento puoi limitare, recuperare ed eliminare le tue informazioni.

  1.   f3niX suddetto

    Adoro le risposte ... haha ​​.. Saluti

  2.   pancomora suddetto

    Molto buoni questi articoli sulla vala .. spero anche gli altri .. saluti

  3.   cr0t0 suddetto

    Ho in attesa del tuo ingresso su Vala, spero che ci saranno molte consegne. Saluti!

  4.   pp suddetto

    Bell'articolo, grazie per la condivisione.

  5.   Hiram suddetto

    Ciao,

    Ho seguito le tue precedenti voci per la creazione di questa app, il problema viene ora che provo ad accedere agli ingressi della nuova finestra, lo faccio in questo modo, nel metodo saveC della classe createQuestions (classe che crea la finestra) .

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

    Ma in uscita ottengo questo:
    (bu: 6196): Gtk-CRITICAL **: gtk_entry_get_text: asserzione `GTK_IS_ENTRY (entry) 'non riuscita

    Trattato (null)

    Ho visto alcuni esempi e nella definizione dei metodi che accedono agli ingressi fanno qualcosa del genere:

    void on_activate (voce Gtk.Entry) {
    nome = entry.get_text ();
    print ("\ nCiao" + nome + "! \ n \ n");
    }

    Ma hanno solo una voce e in questo esempio ce ne sono 5, quindi qui mi sono già perso, potresti guidarmi meglio.

    1.    lolbimbo suddetto

      Ebbene, quando crei le voci non dai loro lo stesso nome, per ottenere il testo che hanno:

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

      Se vuoi, metti un pasticcino e io lo guarderò

      1.    Hiram suddetto

        lolbimbo se in effetti li ho con nomi diversi, ma ne sto usando uno solo per i test poiché nessuno di loro restituisce il testo che ho inserito nella voce, mi invia l'errore sopra menzionato:

        Ma in uscita ottengo questo:
        (bu: 6196): Gtk-CRITICAL **: gtk_entry_get_text: asserzione `GTK_IS_ENTRY (entry) 'non riuscita

        Trattato (null)

        Sto ancora indagando ...

        Saluti.!!

      2.    Hiram suddetto

        Pronta ecco la fonte, saluti.
        http://pastebin.com/pZG8GbrY

    2.    lolbimbo suddetto

      Ciao Hiram, guarda, ti dirò come devi farlo per risolverlo, la prima cosa succede perché stiamo creando una nuova finestra (non è quella principale), e quando chiami la voce, (scusa per le parole) Non so perché Quella merda non ritorna come se fosse una voce ma un Widget, ma ehi, per risolverlo devi solo cambiare tutti i componenti statici che hai creato in dinamici usando var:

      var questionE = new Gtk.Entry ();

      quindi la funzione funzionerà e riceverai il testo all'interno della voce.

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

      Infine, non dimenticare di cambiare la riga in cui aggiungi la voce per mostrarla:

      askE.show ();

      Vi lascio il codice completo con la modifica in modo che possiate controllare che già funzioni, cioè se dovete cambiare tutti gli elementi (almeno le voci) per proseguire con l'applicazione.

      http://paste.desdelinux.net/5048

      saluti

      1.    Hiram suddetto

        Chale, qui di nuovo da fastidio, continuo ad avere problemi, il codice che mi mostri va bene, succede solo qualcosa:

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

        È all'interno della classe Questions e funziona bene ma quando si desidera accedere da saveC, non si compila, mi genera questo errore:

        bu01.vala: 50.38-50.50: errore: argomento 1: impossibile convertire da `Questions.saveC 'a` Gtk.Button.clicked'
        this.guardar.clicked.connect (this.guardarC);
        ^^^^^^^^^^^^^
        bu01.vala: 251.58-251.66: avviso: Gtk.Stock è stato deprecato dalla 3.10
        bu01.vala: 260.59-260.67: avviso: Gtk.Stock è stato deprecato dalla 3.10
        Compilazione non riuscita: 1 errore / i, 2 avvertenze

        Voglio pensare che sia a causa del modo in cui passo il parametro quando si verifica l'evento clic:
        this.guardar.clicked.connect (this.guardarC);

        Grazie in anticipo per il feedback; qui lascio il codice che genera l'errore: http://pastebin.com/pLzExhrb

      2.    lolbimbo suddetto

        Non l'ho testato ma penso che rimuovere l'argomento dalla funzione lo getterà via.

        public void saveC (Gtk.Entry askE) {
        stringa str = questionE.get_text ();
        stdout.printf ("Trattato% s \ n", str);
        }

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

      3.    Hiram suddetto

        lolbimbo, ho provato a rimuovere l'argomento e ancora non funziona,

        Sto ancora cercando di capire il problema, sono nuovo di Vala e non riesco a trovare molta documentazione, spero di trovare presto la soluzione o aspetto che tu rilasci la quarta parte xD.

        Continuo a provare ...

        Saluti.