Зрілий інтерфейс на qt: пояснення до коду




Зрілий інтерфейс на Qt: пояснення до коду
В першу чергу згадаю допоміжні функції. Вони не належать до «гарячих клавішах» безпосередньо, але використовуються в механізмі збереження і завантаження поєднань клавіш, пов`язаних з меню.
gt; bool file_exists (const QString fileName) - перевіряє, чи існує вказаний файл на ім`я fileName.
gt; QString qstring_load (const QString fileName, const char * enc) - завантажує вміст текстового файлу з ім`ям fileName, у зазначеній кодуванні enc.
gt; bool qstring_save (const QString fileName, const QString data, const char * enc) - зберігає текстові дані data в файлі на ім`я fileName в кодуванні enc.
gt; QHash hash_load_keyval (const QString fname) - повертає у вигляді строкової хеш-таблиці вміст файлу fname. Останній має звичайний ini-подібний формат, де кожен рядок представлена як ключ = значення. Наступні дві функції знадобляться для віджета - поля введення, де користувач зможе задати поєднання клавіш (натиснути в поле вводу поєднання, яке відобразиться в поле введення у вигляді Модифікатори + Клавіша- наприклад, + ):
gt; QString mod_to_string (Qt :: KeyboardModifiers k) - отримує в якості параметра клавіші = модифікатори k і повертає їх назви, тобто «Alt», «Shift» тощо. Якщо модифікаторів кілька, то вони перераховуються, розділені знаком «плюс».
gt; QString keycode_to_string (int k) - повертає буквене позначення клавіатурного коду k. За ідеєю, цю функцію можна замінити вбудованої в Qt: QKeySequence (k) .toString (). Однак вона в певних випадках веде себе дивно.

Тепер про класи:
CShortcutEntry - це нащадок QLineEdit- віджет, за допомогою якого користувач може ввести і побачити поєднання клавіш. У функції keyPressEvent цього класу відбувається перетворення кодів модифікаторів і клавіш в текстове представлення виду:



+ +
CShortcuts - клас, який керує всім, що відноситься до «гарячих клавішах» і їх зв`язку з пунктами меню.
Примірник цього класу буде підключатися до примірника головного вікна, тому що саме він є власником пунктів меню, і з ним, цим вікном, ми і будемо працювати. В описі класу головного вікна оголосимо:
CShortcuts * shortcuts-

Потім в конструкторі класу головного вікна створимо екземпляр CShortcuts, «підключимо» до нього віджет головного вікна і завантажимо з файлу настройки гарячих клавіш:
shortcuts = new CShortcuts (this) - // this -
покажчик на головне вікно
shortcuts-gt; load_from_file (таке-то ім`я файлу);

Все, load_from_file бере на себе і завантаження зв`язків пунктів меню з гарячими клавішами, і «прохід» по пунктах меню з одночасним призначенням їм цих поєднань. Назва завантаженого файлу зберігається в поле CShortcuts :: fname і може бути використано пізніше.

Для збереження поточного набору гарячих клавіш в файл використовуємо:
CShortcuts :: save_to_file (const QString file_name)

Саме цей файл ми і завантажуємо в конструкторі головного вікна. Розберемо докладніше функцію завантаження - CShortcuts :: load_from_file. Перші рядки очевидні - перевірка на наявність файлу:
if (! file_exists (file_name)) return-

Відео: Qt - Створення призначених для користувача віджетів з нуля


Тепер треба завантажити файл з гарячими клавішами в хеш-таблицю. Файл має простий формат, де кожен рядок - «ім`я пункту меню = поєднання клавіш». Отже, оголосимо таблицю hash і завантажимо в неї файл:
QHash hash = hash_load_keyval (file_name) -

У наступному рядку ми отримуємо список всіх «дітей» віджета w (це передане в конструктор класу головне вікно), причому є екземплярами класу QAction, тобто пунктами меню:
QList a = w-gt; findChildren() -

Відео: оживляє інтерфейс адресного довідника на Qt 4 + VS 2010


Починається проходження по цьому списку (за всіма пунктами меню) в циклі: foreach (QAction * ac, a)
if (hash.contains (ac-gt; text ()))
{
if (ac-gt; shortcut (). isEmpty ())
ac-gt; setShortcut (QKeySequence
(Hash.value (ac-gt; text ()))) -
}
}

Для кожного пункту меню перевіряється:
gt; Чи міститься його назву в хеш-таблиці.
gt; Якщо так, то перевіряється, присвоєно чи цього пункту меню поєднання клавіш.
gt; Якщо немає, то йому задається поєднання клавіш, яке з хеш-таблиці.

Зрілий інтерфейс на Qt: пояснення до коду

Відео: Бібліотека Qt


Звичайно, може знадобитися і іншу поведінку функції - наприклад, щоб поєднання клавіш задавалося в будь-якому випадку, навіть якщо пункт уже має закріплене за ним поєднання. Тоді буде потрібно відповідним чином виправити код.

Залишилося розглянути, як дати користувачеві можливість самому призначити поєднання клавіш вибраного пункту меню. Тут все досить просто - знадобляться два вид-жета. Перший - вже описане вище строкове поле введення CShortcutEntry (CShortcutEntry * ent_shtcut), в якому:
gt; Користувач зможе вводити поєднання клавіш.
gt; При виборі пункту меню в списку, в полі введення буде відображатися поєднання клавіш, призначений пункту меню (якщо поєднання взагалі призначено).

Другий віджет - екземпляр QListWidget (QListWidget * lv_menuitems). У нього буде виводитися список з назвами пунктів меню. Щоб отримати такий список, досить скористатися функцією CShortcuts :: captions_iterate (), яка заповнює внутрішній для CShortcuts список (QStringList captions). Щоб оновити вміст QListWidget, треба буде викликати приблизно такий код:
shortcuts-gt; captions_iterate () -
lv_menuitems-gt; clear ();
lv_menuitems-gt; addItems (shortcuts-gt; captions) -

Тепер необхідно пов`язати вибір пункту меню в списку з відображенням поєднання клавіш в віджеті CShortcutEntry:
connect (lv_menuitems, SIGNAL (currentItemChanged
(QListWidgetItem *,
QListWidgetItem *)),
this, SLOT (slot_lv_menuitems_currentItemChanged
(QListWidgetItem *, QListWidgetItem *))) -

Сам обробник виглядає так:
void класс_главного_окна :: slot_lv_menuitems_currentItemChanged
(QListWidgetItem * current, QListWidgetItem * previous)
{
QAction * a = shortcuts-gt; find_by_caption (current-gt; text ());
if (a)
ent_shtcut-gt; setText (a-gt; shortcut (). toString ());
}

Тут видно знаходження пункту меню (покажчика на екземпляр QAction) по його назві - точніше, з напису на пункті меню. За це відповідає функція:
QAction * CShortcuts :: find_by_caption (const QString text);

Існує ще ряд утілітних функцій:
gt; QAction * CShortcuts :: find_by_shortcut (const QString shcut) - - знайти пункт меню за поєднанням гарячих клавіш.
gt; QKeySequence find_seq_by_caption (const QString text) - - знайти поєднання клавіш по напису пункту меню.
gt; void set_new_shortcut (const QString menuitem, const QString shcut) - - задати пункту меню з написом menuitem нове поєднання клавіш shcut. Параметрами цієї функції будуть служити обраний в списку пункт меню і поєднання клавіш з віджета CShortcutEntry. Виклик set_new_shortcut зручно помістити в обробник натискання будь-якої клавіші (наприклад, «Поставити»), після натискання на яку буде задаватися поєднання клавіш для обраного пункту меню.

Таким чином, у вас є все необхідне для оснащення своєї програми можливістю призначати «гарячі клавіші» з боку користувача. Єдиний недолік наведеного движка - йде прив`язка до конкретної мови інтерфейсу. Якщо ви призначили поєднання клавіш при російській інтерфейсі, а потім переключили на англійську, то «росіяни» призначення не будуть підхоплені. Але втілення «універсального» движка ускладнило б завдання - наприклад, можна було б для пунктів меню генерувати коди і ці коди пов`язувати з клавішами.

Зрілий інтерфейс на Qt: пояснення до коду


ІНШЕ

Gnome shell: звичайний режим фото

Gnome shell: звичайний режим

Відео: GNOME 3.22 | GNOME Shell Shelltile Extension Перехід між вікнами по + Переходити в режим огляду тільки для…

Ultimate ++: theide фото

Ultimate ++: theide

Відео: N ++: Sigma Structure Symphony (SU-B-17-04) All Gold При кожному запуску TheIDE відкривається вікно вибору…

Використання nepomuk фото

Використання nepomuk

NEPOMUK в Dolphin На рис. вище я червоним кольором зазначив і пошукове поле, і функції додавання коментарів і позначок.…

Неясності з phonon фото

Неясності з phonon

Від труднощів збірки перейдемо до неясним місцях у використанні Phonon. Phonon підтримує ті мультимедійні формати, які…

Робота з shotwell фото

Робота з shotwell

Відео: Перша робота програмістом C ++ Shotwell після імпорту з F-Spot Можна здійснити і імпорт з F-Spot: «Файл -…

Бесіди про qt: qsettings і xml фото

Бесіди про qt: qsettings і xml

Клас QSettings служить Qt-програмістам вірою і правдою, коли потрібно зберегти або завантажити будь-які налаштування…

» » Зрілий інтерфейс на qt: пояснення до коду