-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbutton.cpp
137 lines (105 loc) · 5.27 KB
/
button.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include "button.h"
#include <QDebug>
Button::Button()
{
setAcceptHoverEvents(true);//разрешаю оброботку движение курсора
setAcceptedMouseButtons(Qt::LeftButton);//включаю только левую кнопку миши
}
//---------------------------------------------------
QRectF Button::boundingRect() const
{
return QRectF(0,0, mWidth, mHeigth);
}
//------------------------------------------------------
void Button::paint (QPainter *painter,
const QStyleOptionGraphicsItem */*option*/,
QWidget */*wifget*/)
{
if (mHoper.getHoper())//если курсор на объекте меняю очертание на красный
{
painter->setPen(QColor("red"));
}
QList<QGraphicsItem*> l = scene()->items();//получаю список всех елементов на сцене
//пробегаю по списку елементов
foreach (QGraphicsItem *item ,l) {
if(item == this) continue;//если елемент вызывает самого себя
if(collidesWithItem(item))//проверяю объекты на стокновение
{
painter->setBrush(QBrush(Qt::green));//если объекты столкнулись закрашиваю
item->update();//обновляю елемент
}
}
painter -> drawPixmap(0, 0, mWidth, mHeigth, mPixmap);//ресую картинку на кнопке
painter -> drawRoundedRect(0, 0, mWidth, mHeigth, 5, 5);//ресую кнопку
}
//----------------------------------------------------------
void Button::hoverEnterEvent(QGraphicsSceneHoverEvent *)
{
//qWarning() << "Enter";
mHoper.setHoper(1);//если курсор на оъекте передаю флагу 1 и ставлю его в true
QGraphicsItem::update();//вызываю функцию изминения вида объекта для обозначения попадания курсора
}
//---------------------------------------------
void Button::hoverLeaveEvent(QGraphicsSceneHoverEvent *)
{
//qWarning() << "Leave";
mHoper.setHoper(0);//если курсор не на оъекте передаю флагу 0 и ставлю его в False
QGraphicsItem::update();//вызываю функцию изминения вида объекта для обозначения ухода курсора
}
//----------------------------------------------------
void Button::mousePressEvent(QGraphicsSceneMouseEvent *aEvent)
{
mIsMoving = false; //как только нажали кнопку мыши на обекте флаг движения усьанавливается в false
mStartPos = aEvent->pos();//при нажатии кнопки мыши передаю в переменную координаты позиции мышки с кнопкой
//qWarning() << "Press" << mStartPos;
}
//------------------------------------------------------------
void Button::mouseMoveEvent(QGraphicsSceneMouseEvent *aEvent)
{
if( mIsMovable)//если передвижение объекта включено
{
int distance = ((aEvent->pos()-mStartPos)).manhattanLength();//вычисляю на сколько был сдвинут объект
if(distance > QApplication::startDragDistance())//если объект сдвинут больше чем системные требования (более 8 пикселей)
{
QPointF nf = mapToScene(aEvent->pos()-mStartPos);//переводим координаты на кнопке в координаты не сцене
if(nf.x()<0 || nf.y()<0) return; // если координаты вне сцены выходим
if(nf.x()>800 || nf.y()>800) return;// если координаты вне сцены выходим
mIsMoving = true;//если объект переместился флаг устанавливаю в true
this->setPos(nf);//иначе устанавливаю навые координаты нашей кнопке
}
}
//qWarning() << "Move";
}
//------------------------------------------------------------
void Button::mouseReleaseEvent(QGraphicsSceneMouseEvent *aEvent)
{
if(!mIsMoving)//если после отпуска кнопки миши не было движения
{
emit btnMouseReleaseEven(aEvent->button());//возбуждаю сигнал
}
//qWarning() << "Relase";
}
//--------------------------------------------------------
void Button::setImage(QString aPach)
{
mPixmap.load(aPach);//записываю в переменную картинку по ее пути
//подстраиваю размер кнопки под картинку
mWidth = mPixmap.width();
mHeigth = mPixmap.height();
}
//-------------------------------------------
void Button::setGeometry(int aWidth, int aHeigth)
{
mWidth = aWidth;
mHeigth = aHeigth;
}
//------------------------------------------------
void Button::enableMouseMoving()
{
mIsMovable = true;
}
//---------------------------------------------
void Button::disableMouseMoving()
{
mIsMovable = false;
}