#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();
}
};