Создание приложения (Vala + GTK 3) [3-я часть]

В этой части мы увидим, как создать еще одно окно и спроектировать его с помощью GTK. Мы также увидим некоторые функции, такие как добавление вопросов и использование трех кнопок (50%, заморозить и пройти).

ToolBar и ToolButton

Создайте ToolBar:

app2

Создавая ToolButton, в этом случае мы поместим иконку (по умолчанию вы можете найти много иконок здесь) с «from_stock (Gtk.Stock.IconName):

Захват от 2013 12:07:23

Мы видим, что в нашем приложении у нас есть панель с двумя кнопками вверху, где мы будем использовать первую для создания новых вопросов, а вторую для импорта вопросов (через файл):

Захват от 2013 11:08:00

Создание вопросов:
Кнопка, которую мы создали ранее (на панели инструментов), когда мы нажимаем на нее, мы откроем новое окно gtk, которое позволит нам добавлять вопросы в нашу базу данных:

app1

Чтобы создать новое окно, мы создадим новый класс, который мы будем называть Вопросы, и как наш класс App создаст новое окно (this.window = new Gtk.Window ();)

Мы будем использовать несколько компонентов для создания графического интерфейса по порядку;

-Label (Вопросы)

- Запись (куда мы будем писать вопрос)

-Этикетка (ответы)

- 4 горизонтальных поля, которые будут содержать Entry (ответ) и Switch (чтобы выбрать, правильный ли он)

-Кнопка (для завершения)

Мы видим, как это выглядит:

Захват от 2013 12:08:01

Чтобы сохранить вопрос, нам нужно будет получить текст записей, они получаются с помощью get_text (), который возвращает строку.

app5

Чтобы узнать, активен ли коммутатор, мы можем использовать его метод get_active (), которая возвращает истину, если она включена, и мигает, если она выключена.

 Кнопки 50%, Freeze и Pass:

 -пятьдесят% :

Для 50% нам нужно только посмотреть, какая кнопка правильная, и удалить 2 неправильных, в этом случае мы отменяем их с помощью set_sensitive (false).

app4

Результат:

app6

-Замораживание:

Снова устанавливаем полоску на 0.

this.time_bar.set_fraction (0);

-Проходить:

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

 Следующая часть (4):

В следующей части мы увидим, как улучшить некоторые аспекты нашего приложения, например, чтобы вопросы не всегда располагались в одном и том же месте, поместите значок в приложение ...


Оставьте свой комментарий

Ваш электронный адрес не будет опубликован. Обязательные для заполнения поля помечены *

*

*

  1. Ответственный за данные: Мигель Анхель Гатон
  2. Назначение данных: контроль спама, управление комментариями.
  3. Легитимация: ваше согласие
  4. Передача данных: данные не будут переданы третьим лицам, кроме как по закону.
  5. Хранение данных: база данных, размещенная в Occentus Networks (ЕС)
  6. Права: в любое время вы можете ограничить, восстановить и удалить свою информацию.

  1.   f3niX сказал

    Я люблю ответы ... ха-ха .. Приветствую

  2.   панхомора сказал

    Очень хорошие эти статьи про вала .. надеюсь остальным .. привет

  3.   cr0t0 сказал

    Жду вашей записи о Вале, надеюсь, доставок будет много. Ура!

  4.   пптру сказал

    Хорошая статья, спасибо, что поделились.

  5.   Хирам сказал

    Привет,

    Я следил за вашими предыдущими записями при создании этого приложения, проблема возникает сейчас, когда я пытаюсь получить доступ к записям нового окна, я делаю это таким образом, в методе saveC класса createQuestions (класс, который создает окно) .

    public void saveC () {
    строка str = questionE.get_text ();
    stdout.printf ("Договор% s \ n", str);
    }

    Но на выходе получаю вот что:
    (bu: 6196): Gtk-CRITICAL **: gtk_entry_get_text: утверждение `GTK_IS_ENTRY (запись) 'не выполнено

    Договор (недействительный)

    Я видел несколько примеров, и в определении методов, которые обращаются к записям, они делают что-то вроде этого:

    void on_activate (запись Gtk.Entry) {
    имя = запись.get_text ();
    print ("\ nHello" + name + "! \ n \ n");
    }

    Но у них только одна запись, а в этом примере их 5, так что я уже потерялся, вы могли бы помочь мне лучше.

    1.    лолбимбо сказал

      Ну, когда вы создаете записи, вы не даете им одинаковое имя, чтобы получить текст, который у них есть, вы делаете:

      r1 = запись1.get_text();
      r2 = запись2.get_text();
      r3 = запись3.get_text();
      r4 = запись4.get_text();

      Если хочешь, ставь пастебин и я посмотрю

      1.    Хирам сказал

        lolbimbo, если на самом деле у меня есть они с разными именами, но я использую только один для тестов, поскольку ни один из них не возвращает текст, который я ввел в запись, он отправляет мне ошибку, упомянутую выше:

        Но на выходе получаю вот что:
        (bu: 6196): Gtk-CRITICAL **: gtk_entry_get_text: утверждение `GTK_IS_ENTRY (запись) 'не выполнено

        Договор (недействительный)

        Я все еще расследую ...

        Ура !!

      2.    Хирам сказал

        Готов вот источник, привет.
        http://pastebin.com/pZG8GbrY

    2.    лолбимбо сказал

      Привет, Хирам, послушай, я расскажу тебе, как это нужно сделать, чтобы решить эту проблему, первое, что это происходит, потому что мы создаем новое окно (оно не является основным), и при вызове записи ( извините за слова) Я не знаю, почему Это дерьмо не возвращается, как если бы это была запись, а виджет, но эй, чтобы решить эту проблему, вам просто нужно изменить все статические компоненты, которые вы создали, на динамические, используя var:

      var questionE = новый Gtk.Entry ();

      тогда функция будет работать, и вы получите текст внутри записи.

      save.clicked.connect (() => {
      // строка str = this.questionE.get_text ();
      stdout.printf ("Договор% s \ n", askE.get_text ());
      });

      Наконец, не забудьте изменить строку, в которой вы добавляете запись, чтобы показать ее:

      askE.show ();

      Я оставляю вам полный код с модификацией, чтобы вы могли убедиться, что он уже работает, то есть если вы должны изменить все элементы (по крайней мере, записи), чтобы продолжить работу с приложением.

      http://paste.desdelinux.net/5048

      привет

      1.    Хирам сказал

        Чале, вот опять беспокойство, у меня все еще возникают проблемы, код, который вы мне показываете, в порядке, только что-то происходит в случае:

        save.clicked.connect (() => {
        // строка str = this.questionE.get_text ();
        stdout.printf ("Договор% s \ n", askE.get_text ());
        });

        Он находится внутри класса Questions и отлично работает, но когда вы хотите войти из saveC, он не компилируется, он выдает мне эту ошибку:

        bu01.vala: 50.38-50.50: ошибка: аргумент 1: невозможно преобразовать из `Questions.saveC 'в` Gtk.Button.clicked'
        this.guardar.clicked.connect (this.guardarC);
        ^^^^^^^^^^^^^
        bu01.vala: 251.58-251.66: предупреждение: Gtk.Stock устарел с 3.10
        bu01.vala: 260.59-260.67: предупреждение: Gtk.Stock устарел с 3.10
        Ошибка компиляции: 1 ошибка (и), 2 предупреждения (и)

        Я хочу думать, что это из-за того, как я передаю параметр, когда происходит событие щелчка:
        this.guardar.clicked.connect (this.guardarC);

        Заранее благодарим вас за отзыв; здесь я оставляю код, который выдает ошибку: http://pastebin.com/pLzExhrb

      2.    лолбимбо сказал

        Я не тестировал, но думаю, что удаление аргумента из функции отбросит его.

        public void saveC (Gtk.Entry asksE) {
        строка str = questionE.get_text ();
        stdout.printf ("Договор% s \ n", str);
        }

        a:
        public void saveC () {
        строка str = questionE.get_text ();
        stdout.printf ("Договор% s \ n", str);
        }

      3.    Хирам сказал

        lolbimbo, я попытался удалить аргумент, но он все еще не работает,

        Я все еще пытаюсь понять проблему, я новичок в Vala и не могу найти много документации, я надеюсь найти решение в ближайшее время или подожду, пока вы выпустите четвертую часть xD.

        Я продолжаю пытаться ...

        Привет.