Код описания класса MyDrawObject

#include <QtGui>

#include <QPainterPath>

class MyDrawObject: public QWidget

{

public:

QPainterPath p;

bool is_in_figure;

MyDrawObject(QWidget*& Parent):QWidget(Parent)

{

is_in_figure=false;

// при наведении на фигуру картинка будет выделяться

// разрешить захват мыши

setMouseTracking(true);

// составим фигуру из линий.

// 2 3

// # # 9

// #1######

// # # 10

// # # 13

// ########

// # # 14

// 17 16

p.moveTo(30,30); //1

p.lineTo(30,20); //2

p.lineTo(40,20); //3

p.lineTo(40,30); //4

//

// для рисования дуги эллипса указывается точки ограничивающего праямоугольника и градусы начала и конца дуги

p.arcTo(40,20, // верхний левый угол

20, +20, // длина ширина

180,180

); //5 // градусы начало и конец

p.lineTo(60,20); //6

p.lineTo(70,20); //7

p.lineTo(70,30); //8

p.lineTo(80,30); //9

p.lineTo(80,40); //10

p.lineTo(70,40); //11

p.lineTo(70,60); //12

p.lineTo(80,60); //13

p.lineTo(80,70); //14

p.lineTo(70,70); //15

p.lineTo(70,80); //16

p.lineTo(60,80); //17

p.lineTo(60,70); //18

// для рисования дуги указывается точки ограничивающего праямоугольника и точки задающие градусы начала и конца дуги

p.arcTo(

40,80-20, // верхний левый угол

20,20, // длина и ширина

0,180); // градусы начало и конец

p.lineTo(40,80);

p.lineTo(30,80);

p.lineTo(30,70);

p.lineTo(20,70);

p.lineTo(20,60);

p.lineTo(30,60);

p.lineTo(30,40);

p.lineTo(20,40);

p.lineTo(20,30);

p.lineTo(30,30);

// поддержка русского языка

QTextCodec* codec = QTextCodec::codecForName("Windows-1251");

QTextCodec::setCodecForCStrings(codec);

}

void paintEvent (QPaintEvent * pe)

{

QPainter painter(this);

// пунктирная линия

painter.setPen(QPen(QColor(255,0,0), 3, Qt::DashLine, Qt::RoundCap, Qt::RoundJoin));

painter.drawLine(0, 0, 600, 0);

// пример вивода текста

painter.drawText(0, painter.fontMetrics().height()+1,QString("Пример вывода текста"));

// выбирать цвет обводки фигуры в зависимости от знания

// находится ли курсор мыши внутри фигуры

QColor color;

if(is_in_figure)

color=QColor(255,255,0);

else

color=QColor(255,0,0);

// сплошная линия для обводки по пути P

painter.setPen(QPen(color, 3, Qt::SolidLine, Qt::RoundCap,

Qt::RoundJoin));

// для перехода цвета из одного в другой - используем класс линейный градиент

// указываем две точки A(x,y) -B(x,y) между которыми будет проходить перетекание цвета,

// цвет постоянен по перпендикуляру к отрезку AB

QLinearGradient gradient(0, 20, 0, 80);

// цвет при точке A

gradient.setColorAt(0.0, QColor(0,255,0));

// цвет при точке B

gradient.setColorAt(1.0, QColor(0,0,255));

painter.setBrush(gradient);

painter.drawPath(p);

}

// событие мыши

void mouseMoveEvent (QMouseEvent * me)

{

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

// если путь составленный из линий содержит точку курсора

is_in_figure= p.contains(me->pos());

// перисовать элемент экранной формы

this->update();

}

};


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: