Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Void valueChanged(int newVal);



private:

int value;

};

Тепер покажемо, як сигнал одного об’єкта можна підключити до слота іншого:

Counter src, dst;

QObject::connect(&src, SIGNAL(valueChanged(int)),

&dst, SLOT(setValue(int)));

Тепер перейдемо до написання тестової програми в середовищі Qt Creator. Обираємо меню File — New file of project. Обираємо Qt Console Application, вказуємо назву проекту та місце розташування каталогу проекту. Отримаємо проект з одним вихідним файлом main.cpp із заготовкою Qt-програми:

#include <QCoreApplication>

int main(int argc, char *argv[])

{

QCoreApplication a(argc, argv);

return a.exec();

}

Таким чином, виконання передається об’єкту QCoreApplication, що реалізує цикл обробки повідомлень у консольних програмах. Додамо код з лічильниками:

Результат виконання:

Загалом, для цього прикладу можна було б скористатись створенням порожнього проекту без QCoreApplication з його циклом обробки повідомлень, що запускається після виконання корисних дій. Оскльки нас більше цікавить графічний інтерфейс, створимо новий проект Qt Gui Application та проілюструємо створення елементів керування інтерфейсу користувача. Проект за замовчанням містить наступні файли:

Файл з розширенням “ui” зберігає опис елементів інтерфейсу користувача на формі. Він доступний для редагування в графічному режимі. Додамо на форму поле-лічильник та слайдер:

Знизу справа знаходиться редактор властивостей елементів керування (віджетів), знизу по центру (на одній із закладинок) редактор слотів та сигналів. Зверху знаходиться стрічка з перемикачами режимів редагування та упорядкування віджетів на формі. Пов’яжемо лічильник та слайдер так, щоб зміна значення в одному з них автоматично змінювала значення і в іншому. Для цього перейдемо в режим редагування сигналів та перетягнемо мишею стрілочку з одного віджета на інший.

Кінцевий результат поєднання сигналів та слотів:


Результат виконання:

Перехід до виконання роботи

Передумовою вдалого виконання роботи є сумлінне та якісне виконання лабораторних робіт, оскільки в цьому випадку значна частина коду вже є готова.

Класи, що мають бути попередньо розроблені

Нехай вже розроблені наступні класи, що описують поведінку деяких геометричних фігур. Тоді для виконання роботи необхідно: а) доповнити класи функціональністю, що пов’язана з малюванням фігур у вікні за допомогою засобів конкретної бібліотеки, б) розробити інтерфейс користувача та пов’язати його з готовими класами фігур.

У якості приклада візьмемо набір класів, що описують прямокутник. Код, наведений в додатку В-1, покликаний проілюструвати та нагадати деякі підходи, застосовні в ООП, а тому не є ані лаконічним, ані оптимальним.

Коротко прокоментуємо цей тестовий код. Керування способом відображення фігури покладається на класи DrawingStyle, Color, ColorChannel. У якості моделі кольору обрано поширену модель RGBA, де кожний канал позначений дійсним числом від 0 до 1 (максимальне значення), про виконання цього обмеження дбають перевантажені оператори класу ColorChannel. Клас DrawingStyle також може включати, окрім даних про кольори, дані про стилі ліній чи фону тощо.

Для роботи з координатами описано шаблонний клас Vector, що є узагальненням на довільну розмірність та тип даних для збереження координат. У якості внутрішнього контейнера для даних використовується стандартний контейнер valarray, що зручний для виконання по елементних операцій над усім його вмістом. Шаблонний клас Vector для випадку дробових координат та двомірного простору (тривимірні графічні редактори не розглядаються) позначений як Vector2D.

Ієрархія наслідування графічних примітивів показана ланцюжком Figure (операції зі зміни стилів відображення) --- Shape (додані операції зі зміни геометрії, абстрактний шаблонний клас, що наслідується від нешаблонного) --- Rectangle (нешаблонний клас, що наслідується від шаблонного та реалізує усі нереалізовані на вищих рівнях ієрархії операції). У якості вибіркового набору операцій для фігур обрано задання обмежуючого прямокутника по 2 точкам, пересування та перевірка довільної точки на потрапляння всередину фігури.

Підходи до розширення класів

Класи, описані у додатку В-1, є прикладом реалізації логіки поведінки об’єктів без прив’язки до конкретної графічної бібліотеки. При потребі включити цю логіку у графічний редактор виникає проблема прив’язки до процедур графічної бібліотеки. Цю проблему можна вирішити просто шляхом довизначення недостаючих методів по всій існуючій ієрархії наслідування, що, однак робить логіку залежною від конкретних інструментальних засобів та часто не є прийнятним. Втім, в рамках даної роботи таке вирішення проблеми може бути допустимим.

Якщо поставити за мету зберегти незалежність розроблених класів від інструментарію, то одним з можливих варіантів є наслідування за схемою, показаною на рисунку.

Головна ідея наступна: створюється альтернативний базовий клас для фігур QtShape, що вміють прорисовувати себе самих засобами конкретної бібліотеки, шляхом наслідування базового класа абстрактних фігур Shape. Тоді конкретні фігури мають наслідуватись як від абстрактних фігур, так і від нового базового класу. Має місце множинне наслідування ромбовидного типу. Слід зазначити, що для кінцевих конкретних класів фігур слід визначити усі віртуальні методи, за потреби просто перенаправляючи виклики до відповідних методів базових класів. Без цього звернення до методів «на протилежній вершині ромба» є проблемним. Слід також зазначити, що даний прийом діє і для мов, які не підтримують множинне наслідування: наслідування частково замінюється композицією. Іншим виходом може бути застосування деяких патернів проектування, таких як Visitor. Код-доповнення класів графічних примітивів для випадку Qt наведено в додатку В-2.

Розробка інтерфейсу користувача

Одним з питань розробки інтерфейсу користувача редактора є організація рисування на поверхні вікна (робочої області малюнку). Qt дозволяє створювати власні віджети як похідні від класу QWidget, перевизначаючи в них ряд методів, таких як mousePressEvent, mouseMoveEvent, mouseReleaseEvent та paintEvent, що викликаються у випадках натискання кнопки миші, її переміщення над віджетом, відпускання кнопки миші та необхідності перемалювати вміст віджету на екрані (перемалювання можна ініціювати методом update()). У додатку В-3 наведено код віджету CanvasWidget, що дозволяє рисувати на своїй поверхні прямокутники, виділяти та пересувати їх. Для того, щоб додати цей віджет на головне вікно програми, слід перетягнути туди QWidget, після чого «просунути» його до CanvasWidget (команда «Promote to» з контекстного меню). Результат роботи програми:

Додаток А. Варіанти графічних примітивів для реалізації в редакторі

Таблиця 1. Типи об’єктів та дії над ними

  Назва графічного примітиву (та його первинні атрибути) Креслення Вторинні (обчислювані) атрибути
  Прямокутник (верхній лівий та правий нижній кути)   Центр, довжина, ширина, решта вершин
  Овал (верхній лівий та правий нижній кути обмежуючого прямокутника)     Центр
  Сегмент кола (верхній лівий та правий нижній кути прямокутника, в який вписане коло, дві керуючі точки)   Центр, радіус, кути початку та кінця дуги
  Сектор кола (верхній лівий та правий нижній кути прямокутника, в який вписане коло, дві керуючі точки)   Центр, радіус кути початку та кінця дуги
  Ромб (верхній лівий та правий нижній кути обмежуючого прямокутника)   Центр, вершини
  Паралелограм (верхній лівий та правий нижній кути обмежуючого прямокутника, контрольна точка) Центр, вершини
  Трапеція (верхній лівий та правий нижній кути обмежуючого прямокутника, контрольна точка) Центр, вершини
  Правильний багатокутник (верхній лівий та правий нижній кути прямокутника, в який вписане коло, що описує багатокутник, кількість кутів) Центр, вершини
  Багатокутна зірка (верхній лівий та правий нижній кути прямокутника, в який вписане коло, що описує зірку, кількість променів, коефіцієнт довжини променів) Центр, усі кути
  Неправильний багатокутник (набір точок)     Центр, верхній лівий та правий нижній кути обмежуючого прямокутника
  Дуга (верхній лівий та правий нижній кути прямокутника, в який вписане коло, дві керуючі точки)   Центр, радіус, кути початку та кінця дуги
  Ламана (набір точок)     Центр, верхній лівий та правий нижній кути обмежуючого прямокутника
  Стрілка (координати початку, кінця, коефіцієнт довжини наконечника) Вершини наконечника
  Зигзаг (координати початку, кінця, кількість кроків)   Усі точки
  Лінійчата зірка (верхній лівий та правий нижній кути прямокутника, в який вписане коло, що описує зірку, кількість променів)   Початок та кінець усіх променів

Таблиця 2. Варіанти завдань

№ вар. ЛР №1 ЛР №2 № вар. ЛР №1 ЛР №2
    1,15     1,15
    2,14     1,14
    1,13     2,13
    2,12     1,12
    1,11     2,11
    2,15     1,15
    1,14     2,14
    2,13     1,13
    2,12     2,12
    1,11     2,11
    2,15     1,15
    1,14     2,14
    2,13     1,13
    1,12     2,12
    2,11     1,11

Додаток Б. Форми документів для оформлення курсової роботи

Б-1: Титульна сторінка

Б-2: Лист завдання

Б-3: Рамка для першої сторінки змісту

Міністерство освіти і науки, МОЛОДІ тА СПОрту України

Національний технічний університет України

“Київський політехнічний інститут”

ННК «ІПСА»

(назва факультету, інституту)

Кафедра системного проектування

(назва кафедри)





Дата публикования: 2015-03-26; Прочитано: 176 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.01 с)...