Створення програми (Vala + GTK 3) [3-а частина]

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

Панель інструментів та Панель інструментів

Створіть панель інструментів:

app2

Створюючи ToolButton, у цьому випадку ми поставимо піктограму (ти за замовчуванням знайдеш багато піктограм тут) з «from_stock (Gtk.Stock.IconName):

Захоплення з 2013-12-07 23:26:52

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

Захоплення з 2013-11-08 00:30:32

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

app1

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

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

-Етикетка (Запитання)

- Вступ (де ми напишемо питання)

-Етикетка (відповіді)

- 4 горизонтальних поля, які будуть містити Запис (відповідь) та Перемикач (щоб вибрати, чи правильно)

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

Ми можемо побачити, як це виглядає:

Захоплення з 2013-12-08 01:07:08

Для збереження запитання нам доведеться отримати текст записів, вони отримуються за допомогою get_text (), який повертає рядок.

app5

Щоб знати, чи активний комутатор, ми можемо використовувати його метод get_active (), яка повертає істину, якщо вона увімкнена, і спалахує, якщо вона вимкнена.

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

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

Для 50% нам залишається лише подивитися, яка правильна кнопка, і видалити 2 неправильних, у цьому випадку ми скасовуємо їх за допомогою set_sensitive (false).

app4

Результат:

app6

-Замерзання:

Ми знову встановили планку в 0.

this.timebar.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) {
    ім'я = entry.get_text ();
    print ("\ nПривіт" + ім'я + "! \ n \ n");
    }

    Але у них лише один запис, і в цьому прикладі їх 5, тож я вже загубився, ви могли б мене орієнтувати краще.

    1.    лолбімбо - сказав він

      Що ж, коли ви створюєте записи, ви не присвоюєте їм однакове ім'я, щоб отримати текст, який вони мають:

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

      Якщо хочете, покладіть пастебін, і я подивлюсь на нього

      1.    Хірам - сказав він

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

        Але на виході я отримую таке:
        (bu: 6196): Gtk-CRITICAL **: gtk_entry_get_text: твердження `GTK_IS_ENTRY (запис) 'не вдалося

        Договір (нульовий)

        Я все ще розслідую ...

        Ура. !!

      2.    Хірам - сказав він

        Готовий ось джерело, вітаю.
        http://pastebin.com/pZG8GbrY

    2.    лолбімбо - сказав він

      Привіт, Хіраме, дивись, я скажу тобі, як ти повинен це зробити, щоб це вирішити, перше, що ми створюємо нове вікно (воно не є головним), і при виклику запису (вибачте за слова) я не знаю, чому Це лайно не повертається так, ніби це запис, а віджет, але ей, для його вирішення потрібно просто змінити всі створені статичні компоненти на динамічні за допомогою var:

      var questionE = new 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 ());
        });

        Це всередині класу Питання, і це нормально, але коли ви хочете увійти з 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 запитуєE) {
        рядок str = questionE.get_text ();
        stdout.printf ("Договір% s \ n", str);
        }

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

      3.    Хірам - сказав він

        lolbimbo, я спробував видалити аргумент, але він все ще не працює,

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

        Я продовжую намагатися ...

        Привіт.