Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсач(пример).doc
Скачиваний:
6
Добавлен:
28.03.2016
Размер:
4.57 Mб
Скачать

2.2. Інструменти та механізми малювання.

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

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

Суб’єктом малювання (художником) може бути екземпляр класу Qpainter, а інструментами малювання – відповідно екземпляри класів Pen (перо) та Brush (пензель). Палітра кольорів, для зв’язування з інструментами малювання, формується програмістом за допомогою класу Qcolor, а стиль ліній штриховки та накреслення – за допомогою класу Qstyle.

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

Техніку малювання проілюструємо нижче на прикладах відображення графічних примітивів, або їх найпростіших комбінацій

2.3. Графічні примітиви та їх відтворення.

Лінії.

Найпростішим елементом компютерної графіки є відрізок прямої лінії. Зразок, який ми спробуємо відтворити програмно, зображено на малюнку

Програма, яка створює наведену картинку, повністю наведена на наступній сторінці.

#include <QApplication> // клас для генерації застосунку

#include <QPainter>

#include <QWidget>

class Lines : public Qwidget // Об’ява класу для малювання ліній

{

public:

Lines(QWidget *parent = 0); // Об’ява конструктора класу

protected:

void paintEvent(QPaintEvent *event);

};

Lines::Lines(QWidget *parent)

: QWidget(parent)

{

}

void Lines::paintEvent(QPaintEvent *event)

{

QPen pen(Qt::black, 2, Qt::SolidLine);

QPainter painter(this);

painter.setPen(pen);

painter.drawLine(20, 40, 250, 40);

pen.setStyle(Qt::DashLine);

painter.setPen(pen);

painter.drawLine(20, 80, 250, 80);

pen.setStyle(Qt::DashDotLine);

painter.setPen(pen);

painter.drawLine(20, 120, 250, 120);

pen.setStyle(Qt::DotLine);

painter.setPen(pen);

painter.drawLine(20, 160, 250, 160);

pen.setStyle(Qt::DashDotDotLine);

painter.setPen(pen);

painter.drawLine(20, 200, 250, 200);

QVector<qreal> dashes;

qreal space = 4;

dashes << 1 << space << 5 << space;

pen.setStyle(Qt::CustomDashLine);

pen.setDashPattern(dashes);

painter.setPen(pen);

painter.drawLine(20, 240, 250, 240);

}

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

{

QApplication app(argc, argv);

Lines window;

window.setWindowTitle("Lines");

window.show();

return app.exec();

}

Ця програма малює шість ліній у полі екземпляра Qwidget за допомогою олівця, створеного інструкцією

QPen pen(Qt::black, 2, Qt::SolidLine);

Ми створили об’єкт класу QPen для малювання суцільної лінії чорного кольору, товщиною 2 пікселі. товщиною та чорного кольору. Цей олівець звязується з екземпляром painter класу QPainter для малювання ліній та контурів фігур. За допомогою інструкцій

QPainter painter(this);

painter.drawLine(20, 40, 250, 40);

ми намалювали першу лінію. Чотири параметри є координатами двох точок кінців відрізка у вікні.

Наступний код

pen.setStyle(Qt::DashLine);

встановлює інший (переривистий) стиль лінії.

Кольори.

Колір – це об’єкт, який відображає комбінацію червоного, зеленого та синього (RGB) відтінків різної інтенсивності. Відтінки складових кольорів схеми RGB приймають значення від 0 до 255.

У наступному прикладі ми намалюємо дев’ять квадратів, зафарбованих різними кольорами. Це буде ілюстративним прикладом промальовування прямокутників суцільним пером та зафарбовування замкнутих областей пензлем вибраного кольору

#include <QApplication>

#include <QApplication>

#include <QPainter>

#include <QWidget>

class Colors : public QWidget

{

public:

Colors (QWidget *parent = 0);

protected:

void paintEvent (QPaintEvent *event);

};

Colors::Colors (QWidget *parent)

: QWidget (parent)

{

}

void Colors::paintEvent (QPaintEvent *event)

{

QPainter painter(this);

painter.setPen(QColor(“#d4d4d4”));

painter.setBrush(QBrush(“#c56c00”));

painter.drawRect(10, 15, 90, 60);

painter.setBrush(QBrush(“#1ac500”));

painter.drawRect(130, 15, 90, 60);

painter.setBrush(QBrush(“#539e47”));

painter.drawRect(250, 15, 90, 60);

painter.setBrush(QBrush(“#004fc5”));

painter.drawRect(10, 105,90, 60);

painter.setBrush(QBrush(“#c50024”));

painter.drawRect(130, 105, 90, 60);

painter.setBrush(QBrush(“#9e4757”));

painter.drawRect(250, 105, 90, 60);

painter.setBrush(QBrush(“#5f3b00”));

painter.drawRect(10, 195, 90, 60);

painter.setBrush(QBrush(“#4c4c4c”));

painter.drawRect(130, 195, 90, 60);

painter.setBrush(QBrush(“#785f36”));

painter.drawRect(250, 195, 90, 60);

}

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

{

QApplication app(argc, argv);

Colors window;

window.setWindowTitle(“Colors”);

window.show();

return app.exec();

}

Тут для контурів прямокутників вибрано сірий колір.

painter.setBrush(QBrush(“#c56c00”));

painter.drawRect(10, 15, 90, 60);

Клас QBrush визначає візерунок-наповнювач фігур, які малюються QPainter. Метод drawRect()малює прямокутники. Він малює прямокутник з верхнього лівого кутка на позначці x, y та заданими висотою і шириною. Для того, щоб визначити колір, ми використовуємо шістнадцяткову систему числення.

Візерунок

Наступний приклад схожий до попереднього, за винятком характеру зафарбовування замкнутих областей Цього разу ми заповнимо прямокутники елементами штрихування (візерунками) різних стилів. Стиль штриховки, із стандартного переліку, як і колір заповнення у попередньому прикладі, присвоюється пензлю художника

#include <QApplication>

#include <QApplication>

#include <QPainter>

#include <QWidget>

class Brushes : public QWidget

{

public:

Brushes(QWidget *parent = 0);

protected:

void paintEvent(QpaintEvent *event);

};

Brushes::Brushes(QWidget *parent)

: QWidget (parent)

{

}

void Brushes::paintEvent(QPaintEvent *event)

{