Créer une application (Vala + GTK 3) [3e partie]

Dans cette partie, nous verrons comment créer une autre fenêtre et la concevoir avec GTK. Nous verrons également quelques fonctionnalités telles que l'ajout de questions et l'utilisation des trois boutons (50%, geler et passer).

ToolBar et ToolButton

Créez une barre d'outils:

app2

En créant un ToolButton, dans ce cas nous mettrons une icône (vous pouvez trouver de nombreuses icônes par défaut ici !) avec «from_stock (Gtk.Stock.IconName):

Capture du 2013/12/07 23:26:52

Nous pouvons voir que dans notre application nous avons une barre avec deux boutons en haut, où nous utiliserons le premier pour créer de nouvelles questions et le second pour importer des questions (via un fichier):

Capture du 2013/11/08 00:30:32

Créer des questions:
Le bouton que nous avons créé précédemment (dans la barre d'outils) lorsque nous cliquons dessus, nous allons ouvrir une nouvelle fenêtre gtk qui nous permettra d'ajouter des questions à notre base de données:

app1

Pour créer une nouvelle fenêtre, nous allons créer une nouvelle classe, que nous appellerons Questions, et comment notre classe App créera une nouvelle fenêtre (this.window = new Gtk.Window ();)

Nous utiliserons quelques composants pour créer l'interface graphique dans l'ordre;

-Étiquette (questions)

- Entrée (où nous écrirons la question)

-Étiquette (réponses)

- 4 cases horizontales qui contiendront une entrée (la réponse) et un interrupteur (pour sélectionner si c'est la bonne)

-Bouton (pour terminer)

On peut voir à quoi ça ressemble:

Capture du 2013/12/08 01:07:08

Pour enregistrer la question nous devrons obtenir le texte des entrées, elles sont obtenues avec get_text () qui renvoie une chaîne.

app5

Pour savoir si si un Switch est actif, nous pouvons utiliser sa méthode soit actif () qui renvoie true s'il est activé et flase s'il est désactivé.

 Boutons 50%, Freeze et Pass:

 -cinquante% :

Pour 50%, il suffit de regarder quel est le bon bouton et de supprimer 2 qui ne sont pas corrects, dans ce cas nous les annulons avec set_sensitive (false).

app4

Résultat:

app6

-Geler:

Nous remettons la barre à 0.

this.timebar.set_fraction (0);

-Passer:

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

 Partie suivante (4):

Dans le prochain épisode, nous verrons comment améliorer certains aspects de notre application, tels que le fait que les questions n'apparaissent pas toujours à la même position, mettre une icône sur l'application ...


Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont marqués avec *

*

*

  1. Responsable des données: Miguel Ángel Gatón
  2. Finalité des données: Contrôle du SPAM, gestion des commentaires.
  3. Légitimation: votre consentement
  4. Communication des données: Les données ne seront pas communiquées à des tiers sauf obligation légale.
  5. Stockage des données: base de données hébergée par Occentus Networks (EU)
  6. Droits: à tout moment, vous pouvez limiter, récupérer et supprimer vos informations.

  1.   f3niX dit

    J'adore les réponses ... haha ​​.. Salutations

  2.   Panchomora dit

    Très bien ces articles sur vala .. j'espère que les autres .. salutations

  3.   cr0t0 dit

    J'attends votre entrée sur Vala, j'espère qu'il y a beaucoup de livraisons. À votre santé!

  4.   pptru dit

    Bel article, merci pour le partage.

  5.   Hiram dit

    Salut,

    J'ai suivi vos entrées précédentes pour la création de cette application, le problème vient maintenant que j'essaye d'accéder aux entrées de la nouvelle fenêtre, je le fais de cette façon, dans la méthode saveC de la classe createQuestions (classe qui crée la fenêtre) .

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

    Mais en sortie, j'obtiens ceci:
    (bu: 6196): Gtk-CRITICAL **: gtk_entry_get_text: l'assertion `GTK_IS_ENTRY (entrée) 'a échoué

    Traité (nul)

    J'ai vu quelques exemples et dans la définition des méthodes qui accèdent aux entrées, ils font quelque chose comme ceci:

    void on_activate (entrée Gtk.Entry) {
    nom = entrée.get_text ();
    print ("\ nBonjour" + nom + "! \ n \ n");
    }

    Mais ils n'ont qu'une seule entrée et dans cet exemple il y en a 5, donc là je suis déjà perdu, vous pourriez mieux me guider.

    1.    lolbimbo dit

      Eh bien, lorsque vous créez les entrées, vous ne leur donnez pas le même nom, pour obtenir le texte qu'elles ont, vous faites:

      r1 = entrée1.get_text ();
      r2 = entrée2.get_text ();
      r3 = entrée3.get_text ();
      r4 = entrée4.get_text ();

      Si tu veux, mets un pastebin et je vais le regarder

      1.    Hiram dit

        lolbimbo si en fait je les ai avec des noms différents, mais que je n'en utilise qu'un pour les tests car aucun d'eux ne renvoie le texte que j'ai mis dans l'entrée, cela m'envoie l'erreur mentionnée ci-dessus:

        Mais en sortie, j'obtiens ceci:
        (bu: 6196): Gtk-CRITICAL **: gtk_entry_get_text: l'assertion `GTK_IS_ENTRY (entrée) 'a échoué

        Traité (nul)

        J'enquête toujours ...

        À votre santé.!!

      2.    Hiram dit

        Prêt voici la source, salutations.
        http://pastebin.com/pZG8GbrY

    2.    lolbimbo dit

      Salut Hiram, regardez, je vais vous dire comment vous devez le faire pour le résoudre, la première chose que cela se produit parce que nous créons une nouvelle fenêtre (ce n'est pas la principale), et lors de l'appel de l'entrée, ( désolé pour les mots) Je ne sais pas pourquoi Cette merde ne revient pas comme s'il s'agissait d'une entrée mais d'un widget, mais bon, pour le résoudre, il vous suffit de changer tous les composants statiques que vous avez créés en dynamiques en utilisant var:

      var questionE = new Gtk.Entry ();

      alors la fonction fonctionnera et vous recevrez le texte à l'intérieur de l'entrée.

      save.clicked.connect (() => {
      // chaîne str = this.questionE.get_text ();
      stdout.printf ("Traité% s \ n", askE.get_text ());
      });

      Enfin, n'oubliez pas de changer la ligne où vous ajoutez l'entrée pour l'afficher:

      askE.show ();

      Je vous laisse le code complet avec la modification afin que vous puissiez vérifier que cela fonctionne déjà, c'est-à-dire si vous devez changer tous les éléments (au moins les entrées) pour continuer avec l'application.

      http://paste.desdelinux.net/5048

      salutations

      1.    Hiram dit

        Chale, ici encore dérangé, je continue d'avoir des problèmes, le code que vous me montrez va bien, il se passe seulement quelque chose dans l'événement:

        save.clicked.connect (() => {
        // chaîne str = this.questionE.get_text ();
        stdout.printf ("Traité% s \ n", askE.get_text ());
        });

        C'est à l'intérieur de la classe Questions et ça marche bien mais quand on veut entrer depuis saveC, ça ne compile pas, ça me lance cette erreur:

        bu01.vala: 50.38-50.50: erreur: Argument 1: Impossible de convertir de `Questions.saveC 'en` Gtk.Button.clicked'
        this.guardar.clicked.connect (this.guardarC);
        ^^^^^^^^^^^^^
        bu01.vala: 251.58-251.66: avertissement: Gtk.Stock est obsolète depuis la 3.10
        bu01.vala: 260.59-260.67: avertissement: Gtk.Stock est obsolète depuis la 3.10
        Échec de la compilation: 1 erreur (s), 2 avertissement (s)

        Je veux penser que c'est à cause de la façon dont je passe le paramètre lorsque l'événement de clic se produit:
        this.guardar.clicked.connect (this.guardarC);

        Merci d'avance pour les commentaires; ici je laisse le code qui jette l'erreur: http://pastebin.com/pLzExhrb

      2.    lolbimbo dit

        Je ne l'ai pas essayé mais je pense que supprimer l'argument de la fonction le rejettera.

        public void saveC (Gtk.Entry demandeE) {
        string str = questionE.get_text ();
        stdout.printf ("Traité% s \ n", str);
        }

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

      3.    Hiram dit

        lolbimbo, j'ai essayé de supprimer l'argument et cela ne fonctionne toujours pas,

        J'essaie toujours de comprendre le problème, je suis nouveau sur Vala et je ne trouve pas beaucoup de documentation, j'espère trouver la solution bientôt ou attendre que vous publiiez la quatrième partie xD.

        Je continue d'essayer ...

        Salutations.