Criando um aplicativo (Vala + GTK 3) [3ª parte]

Nesta parte, veremos como criar outra janela e projetá-la com GTK. Veremos também algumas funcionalidades como adicionar perguntas e usar os três botões (50%, congelar e passar).

ToolBar e ToolButton

Crie uma barra de ferramentas:

app2

Criando um ToolButton, neste caso iremos colocar um ícone (você pode encontrar muitos ícones por padrão clique aqui) com «from_stock (Gtk.Stock.IconName):

Captura de 2013/12/07 23:26:52

Podemos ver que em nosso aplicativo temos no topo uma barra com dois botões, onde usaremos o primeiro para criar novas questões e o segundo para importar questões (através de um arquivo):

Captura de 2013/11/08 00:30:32

Criando perguntas:
O botão que criamos anteriormente (na barra de ferramentas) ao clicar nele, abriremos uma nova janela gtk que nos permitirá adicionar perguntas ao nosso banco de dados:

app1

Para criar uma nova janela, criaremos uma nova classe, que chamaremos de Perguntas, e como nossa classe App criará uma nova janela (this.window = new Gtk.Window ();)

Usaremos alguns componentes para criar a interface gráfica em ordem;

-Label (perguntas)

- Entrada (onde escreveremos a pergunta)

-Label (respostas)

- 4 caixas horizontais que conterão uma entrada (a resposta) e um interruptor (para selecionar se está correto)

-Botão (para completar)

Podemos ver como fica:

Captura de 2013/12/08 01:07:08

Para salvar a questão, teremos que obter o texto das entradas, elas são obtidas com get_text () que retorna uma string.

app5

Para saber se um switch está ativo, podemos usar seu método get_active () que retorna verdadeiro se estiver ativado e piscar se estiver desativado.

 50%, botões Congelar e Passar:

 -cinquenta% :

Para 50% só temos que olhar qual é o botão correto e remover 2 que não estão corretos, neste caso cancelamos com set_sensitive (false).

app4

resultado:

app6

-Congelar:

Definimos a barra para 0 novamente.

this.timebar.set_fraction (0);

-Passar:

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

 Próxima parte (4):

No próximo capítulo veremos como melhorar aspectos do nosso aplicativo, como por exemplo, que as perguntas nem sempre apareçam na mesma posição, coloque um ícone no aplicativo ...


Deixe um comentário

Seu endereço de email não será publicado. Campos obrigatórios são marcados com *

*

*

  1. Responsável pelos dados: Miguel Ángel Gatón
  2. Finalidade dos dados: Controle de SPAM, gerenciamento de comentários.
  3. Legitimação: Seu consentimento
  4. Comunicação de dados: Os dados não serão comunicados a terceiros, exceto por obrigação legal.
  5. Armazenamento de dados: banco de dados hospedado pela Occentus Networks (UE)
  6. Direitos: A qualquer momento você pode limitar, recuperar e excluir suas informações.

  1.   f3niX dito

    Eu amo as respostas ... haha ​​.. Saudações

  2.   panchomora dito

    Muito bons esses artigos sobre vala .. Espero os outros .. saudações

  3.   cr0t0 dito

    Estou aguardando sua entrada no Vala, espero que haja muitas entregas. Felicidades!

  4.   ptru dito

    Bom artigo, obrigado por compartilhar.

  5.   Hiram dito

    Olá,

    Eu segui suas entradas anteriores para a criação deste aplicativo, o problema surge agora que eu tento acessar as entradas da nova janela, eu faço dessa forma, no método saveC da classe createQuestions (classe que cria a janela) .

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

    Mas na saída, recebo o seguinte:
    (bu: 6196): Gtk-CRITICAL **: gtk_entry_get_text: asserção `GTK_IS_ENTRY (entrada) 'falhou

    Tratado (nulo)

    Eu vi alguns exemplos e na definição dos métodos que acessam as entradas eles fazem algo assim:

    void on_activate (entrada Gtk.Entry) {
    nome = entrada.get_texto ();
    print ("\ nOlá" + nome + "! \ n \ n");
    }

    Mas eles só têm uma entrada e neste exemplo são 5, então aqui estou eu já perdido, vocês poderiam me orientar melhor.

    1.    lolbimbo dito

      Bem, quando você cria as entradas, você não dá a elas o mesmo nome, para obter o texto que elas têm você faz:

      r1 = entrada1.get_text ();
      r2 = entrada2.get_text ();
      r3 = entrada3.get_text ();
      r4 = entrada4.get_text ();

      Se você quiser, coloque um pastebin e eu vou dar uma olhada

      1.    Hiram dito

        lolbimbo se de fato os tenho com nomes diferentes, mas só estou usando um para testes, pois nenhum deles retorna o texto que coloquei na entrada, me envia o erro citado acima:

        Mas na saída, recebo o seguinte:
        (bu: 6196): Gtk-CRITICAL **: gtk_entry_get_text: asserção `GTK_IS_ENTRY (entrada) 'falhou

        Tratado (nulo)

        Ainda estou investigando ...

        Felicidades.!!

      2.    Hiram dito

        Pronto aqui está a fonte, saudações.
        http://pastebin.com/pZG8GbrY

    2.    lolbimbo dito

      Oi Hiram, olha, vou te dizer como você tem que fazer pra resolver, a primeira coisa é que estamos criando uma nova janela (não é a principal), e ao chamar o verbete, (desculpem o palavras) Essa merda não retorna como se fosse uma entrada, mas um widget, mas hey, para resolver isso você só precisa mudar todos os componentes estáticos que você criou para dinâmico usando var:

      var questionE = new Gtk.Entry ();

      então a função funcionará e você receberá o texto dentro da entrada.

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

      Finalmente, não se esqueça de alterar a linha onde você adiciona a entrada para mostrá-la:

      askE.show ();

      Deixo-vos o código completo com a modificação para que possam verificar se já funciona, ou seja, se é necessário alterar todos os elementos (pelo menos as entradas) para continuar com a aplicação.

      http://paste.desdelinux.net/5048

      lembranças

      1.    Hiram dito

        Chale, aqui atrapalhando de novo, continuo tendo problemas, o código que você me mostra está bom, só acontece alguma coisa no evento:

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

        Está dentro da classe Questions e está tudo bem, mas ao querer entrar do saveC, ele não compila, me lança este erro:

        bu01.vala: 50.38-50.50: erro: Argumento 1: Não é possível converter de `Questions.saveC 'para` Gtk.Button.clicked'
        this.guardar.clicked.connect (this.guardarC);
        ^^^^^^^^^^^^^^
        bu01.vala: 251.58-251.66: aviso: Gtk.Stock foi descontinuado desde 3.10
        bu01.vala: 260.59-260.67: aviso: Gtk.Stock foi descontinuado desde 3.10
        A compilação falhou: 1 erro (s), 2 aviso (s)

        Quero pensar que é por causa da maneira como passo o parâmetro quando ocorre o evento de clique:
        this.guardar.clicked.connect (this.guardarC);

        Agradecemos antecipadamente o feedback; deixo aqui o código que gera o erro: http://pastebin.com/pLzExhrb

      2.    lolbimbo dito

        Não tentei, mas acho que remover o argumento da função irá jogá-lo fora.

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

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

      3.    Hiram dito

        lolbimbo, eu tentei remover o argumento e ainda não funciona,

        Ainda estou tentando entender o problema, sou novo na Vala e não consigo encontrar muita documentação, espero encontrar a solução logo ou aguardo vocês lançarem a quarta parte xD.

        Eu continuo tentando ...

        Saudações.