├── FlowChartTools
├── FlowChartTools.pro
├── FlowChartTools.pro.user
├── class_Button
│ ├── button_graph.cpp
│ └── button_graph.h
├── class_Charts
│ ├── chart_base.cpp
│ ├── chart_base.h
│ ├── chart_diamond.cpp
│ ├── chart_diamond.h
│ ├── chart_ellipse.cpp
│ ├── chart_ellipse.h
│ ├── chart_label.cpp
│ ├── chart_label.h
│ ├── chart_line.cpp
│ ├── chart_line.h
│ ├── chart_plaintext.cpp
│ ├── chart_plaintext.h
│ ├── chart_rect.cpp
│ ├── chart_rect.h
│ ├── chart_roundrect.cpp
│ ├── chart_roundrect.h
│ ├── chart_trapezoid.cpp
│ └── chart_trapezoid.h
├── comdef.h
├── flowchart.cpp
├── flowchart.h
├── img
│ ├── MainIco.png
│ ├── Round.png
│ ├── Rounded_Rectangle.png
│ ├── arrow0.png
│ ├── arrow1.png
│ ├── arrow2.png
│ ├── arrow3.png
│ ├── diamond.png
│ ├── file_add.png
│ ├── file_delete.png
│ ├── file_open.png
│ ├── file_save.png
│ ├── line.png
│ ├── rectangle.png
│ ├── settings.png
│ └── trapezoid.png
├── main.cpp
├── mainwindow.cpp
├── mainwindow.h
├── mainwindow.ui
├── res.qrc
└── test1.fct
├── README.md
├── doc
└── 流程图设计工具.docx
└── images
├── 0.jpg
├── 1.png
├── 2.png
├── 3.jpg
├── 4.jpg
├── img
└── x.gif
/FlowChartTools/FlowChartTools.pro:
--------------------------------------------------------------------------------
1 | #-------------------------------------------------
2 | #
3 | # Project created by QtCreator 2018-10-14T16:24:42
4 | #
5 | #-------------------------------------------------
6 |
7 | QT += core gui
8 |
9 | greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
10 |
11 | TARGET = FlowChartTools
12 | TEMPLATE = app
13 |
14 | # The following define makes your compiler emit warnings if you use
15 | # any feature of Qt which has been marked as deprecated (the exact warnings
16 | # depend on your compiler). Please consult the documentation of the
17 | # deprecated API in order to know how to port your code away from it.
18 | DEFINES += QT_DEPRECATED_WARNINGS
19 |
20 | # You can also make your code fail to compile if you use deprecated APIs.
21 | # In order to do so, uncomment the following line.
22 | # You can also select to disable deprecated APIs only up to a certain version of Qt.
23 | #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
24 |
25 | CONFIG += c++11
26 |
27 |
28 | SOURCES += \
29 | main.cpp \
30 | mainwindow.cpp \
31 | flowchart.cpp \
32 | class_Charts/chart_rect.cpp \
33 | class_Charts/chart_diamond.cpp \
34 | class_Charts/chart_roundrect.cpp \
35 | class_Charts/chart_ellipse.cpp \
36 | class_Charts/chart_label.cpp \
37 | class_Charts/chart_base.cpp \
38 | class_Charts/chart_plaintext.cpp \
39 | class_Charts/chart_line.cpp \
40 | class_Charts/chart_trapezoid.cpp
41 |
42 | HEADERS += \
43 | mainwindow.h \
44 | flowchart.h \
45 | class_Charts/chart_rect.h \
46 | class_Charts/chart_diamond.h \
47 | class_Charts/chart_base.h \
48 | comdef.h \
49 | class_Charts/chart_roundrect.h \
50 | class_Charts/chart_ellipse.h \
51 | class_Charts/chart_label.h \
52 | class_Charts/chart_plaintext.h \
53 | class_Charts/chart_line.h \
54 | class_Charts/chart_trapezoid.h
55 |
56 | FORMS += \
57 | mainwindow.ui
58 |
59 | # Default rules for deployment.
60 | qnx: target.path = /tmp/$${TARGET}/bin
61 | else: unix:!android: target.path = /opt/$${TARGET}/bin
62 | !isEmpty(target.path): INSTALLS += target
63 |
64 | RESOURCES += \
65 | res.qrc
66 |
--------------------------------------------------------------------------------
/FlowChartTools/FlowChartTools.pro.user:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | EnvironmentId
7 | {bd546608-772f-476b-b548-fe809acb5ec6}
8 |
9 |
10 | ProjectExplorer.Project.ActiveTarget
11 | 1
12 |
13 |
14 | ProjectExplorer.Project.EditorSettings
15 |
16 | true
17 | false
18 | true
19 |
20 | Cpp
21 |
22 | CppGlobal
23 |
24 |
25 |
26 | QmlJS
27 |
28 | QmlJSGlobal
29 |
30 |
31 | 2
32 | UTF-8
33 | false
34 | 4
35 | false
36 | 80
37 | true
38 | true
39 | 1
40 | true
41 | false
42 | 0
43 | true
44 | true
45 | 0
46 | 8
47 | true
48 | 0
49 | true
50 | true
51 | true
52 | false
53 |
54 |
55 |
56 | ProjectExplorer.Project.PluginSettings
57 |
58 |
59 | -fno-delayed-template-parsing
60 |
61 | true
62 |
63 |
64 |
65 | ProjectExplorer.Project.Target.0
66 |
67 | Desktop Qt 5.11.2 MSVC2017 64bit
68 | Desktop Qt 5.11.2 MSVC2017 64bit
69 | qt.qt5.5112.win64_msvc2017_64_kit
70 | 0
71 | 0
72 | 0
73 |
74 | E:/SoftwareDesign/build-FlowChartTools-Desktop_Qt_5_11_2_MSVC2017_64bit-Debug
75 |
76 |
77 | true
78 | qmake
79 |
80 | QtProjectManager.QMakeBuildStep
81 | true
82 |
83 | false
84 | false
85 | true
86 |
87 |
88 | true
89 | Make
90 |
91 | Qt4ProjectManager.MakeStep
92 |
93 | false
94 |
95 |
96 |
97 | 2
98 | Build
99 |
100 | ProjectExplorer.BuildSteps.Build
101 |
102 |
103 |
104 | true
105 | Make
106 |
107 | Qt4ProjectManager.MakeStep
108 |
109 | true
110 | clean
111 |
112 |
113 | 1
114 | Clean
115 |
116 | ProjectExplorer.BuildSteps.Clean
117 |
118 | 2
119 | false
120 |
121 | Debug
122 | Debug
123 | Qt4ProjectManager.Qt4BuildConfiguration
124 | 2
125 | true
126 |
127 |
128 | E:/SoftwareDesign/build-FlowChartTools-Desktop_Qt_5_11_2_MSVC2017_64bit-Release
129 |
130 |
131 | true
132 | qmake
133 |
134 | QtProjectManager.QMakeBuildStep
135 | false
136 |
137 | false
138 | false
139 | true
140 |
141 |
142 | true
143 | Make
144 |
145 | Qt4ProjectManager.MakeStep
146 |
147 | false
148 |
149 |
150 |
151 | 2
152 | Build
153 |
154 | ProjectExplorer.BuildSteps.Build
155 |
156 |
157 |
158 | true
159 | Make
160 |
161 | Qt4ProjectManager.MakeStep
162 |
163 | true
164 | clean
165 |
166 |
167 | 1
168 | Clean
169 |
170 | ProjectExplorer.BuildSteps.Clean
171 |
172 | 2
173 | false
174 |
175 | Release
176 | Release
177 | Qt4ProjectManager.Qt4BuildConfiguration
178 | 0
179 | true
180 |
181 |
182 | E:/SoftwareDesign/build-FlowChartTools-Desktop_Qt_5_11_2_MSVC2017_64bit-Profile
183 |
184 |
185 | true
186 | qmake
187 |
188 | QtProjectManager.QMakeBuildStep
189 | true
190 |
191 | false
192 | true
193 | true
194 |
195 |
196 | true
197 | Make
198 |
199 | Qt4ProjectManager.MakeStep
200 |
201 | false
202 |
203 |
204 |
205 | 2
206 | Build
207 |
208 | ProjectExplorer.BuildSteps.Build
209 |
210 |
211 |
212 | true
213 | Make
214 |
215 | Qt4ProjectManager.MakeStep
216 |
217 | true
218 | clean
219 |
220 |
221 | 1
222 | Clean
223 |
224 | ProjectExplorer.BuildSteps.Clean
225 |
226 | 2
227 | false
228 |
229 | Profile
230 | Profile
231 | Qt4ProjectManager.Qt4BuildConfiguration
232 | 0
233 | true
234 |
235 | 3
236 |
237 |
238 | 0
239 | 部署
240 |
241 | ProjectExplorer.BuildSteps.Deploy
242 |
243 | 1
244 | Deploy Configuration
245 |
246 | ProjectExplorer.DefaultDeployConfiguration
247 |
248 | 1
249 |
250 |
251 | false
252 | false
253 | 1000
254 |
255 | true
256 |
257 | false
258 | false
259 | false
260 | false
261 | true
262 | 0.01
263 | 10
264 | true
265 | 1
266 | 25
267 |
268 | 1
269 | true
270 | false
271 | true
272 | valgrind
273 |
274 | 0
275 | 1
276 | 2
277 | 3
278 | 4
279 | 5
280 | 6
281 | 7
282 | 8
283 | 9
284 | 10
285 | 11
286 | 12
287 | 13
288 | 14
289 |
290 | 2
291 |
292 | FlowChartTools
293 |
294 | Qt4ProjectManager.Qt4RunConfiguration:E:/SoftwareDesign/FlowChartTools/FlowChartTools.pro
295 | true
296 |
297 | FlowChartTools.pro
298 |
299 | E:/SoftwareDesign/build-FlowChartTools-Desktop_Qt_5_11_2_MSVC2017_64bit-Debug
300 | 3768
301 | false
302 | true
303 | false
304 | false
305 | true
306 |
307 | 1
308 |
309 |
310 |
311 | ProjectExplorer.Project.Target.1
312 |
313 | Desktop Qt 5.11.2 MinGW 32bit
314 | Desktop Qt 5.11.2 MinGW 32bit
315 | qt.qt5.5112.win32_mingw53_kit
316 | 1
317 | 0
318 | 0
319 |
320 | E:/SoftwareDesign/build-FlowChartTools-Desktop_Qt_5_11_2_MinGW_32bit-Debug
321 |
322 |
323 | true
324 | qmake
325 |
326 | QtProjectManager.QMakeBuildStep
327 | true
328 |
329 | false
330 | false
331 | false
332 |
333 |
334 | true
335 | Make
336 |
337 | Qt4ProjectManager.MakeStep
338 |
339 | false
340 |
341 |
342 |
343 | 2
344 | Build
345 |
346 | ProjectExplorer.BuildSteps.Build
347 |
348 |
349 |
350 | true
351 | Make
352 |
353 | Qt4ProjectManager.MakeStep
354 |
355 | true
356 | clean
357 |
358 |
359 | 1
360 | Clean
361 |
362 | ProjectExplorer.BuildSteps.Clean
363 |
364 | 2
365 | false
366 |
367 | Debug
368 | Debug
369 | Qt4ProjectManager.Qt4BuildConfiguration
370 | 2
371 | true
372 |
373 |
374 | E:/SoftwareDesign/build-FlowChartTools-Desktop_Qt_5_11_2_MinGW_32bit-Release
375 |
376 |
377 | true
378 | qmake
379 |
380 | QtProjectManager.QMakeBuildStep
381 | false
382 |
383 | false
384 | false
385 | true
386 |
387 |
388 | true
389 | Make
390 |
391 | Qt4ProjectManager.MakeStep
392 |
393 | false
394 |
395 |
396 |
397 | 2
398 | Build
399 |
400 | ProjectExplorer.BuildSteps.Build
401 |
402 |
403 |
404 | true
405 | Make
406 |
407 | Qt4ProjectManager.MakeStep
408 |
409 | true
410 | clean
411 |
412 |
413 | 1
414 | Clean
415 |
416 | ProjectExplorer.BuildSteps.Clean
417 |
418 | 2
419 | false
420 |
421 | Release
422 | Release
423 | Qt4ProjectManager.Qt4BuildConfiguration
424 | 0
425 | true
426 |
427 |
428 | E:/SoftwareDesign/build-FlowChartTools-Desktop_Qt_5_11_2_MinGW_32bit-Profile
429 |
430 |
431 | true
432 | qmake
433 |
434 | QtProjectManager.QMakeBuildStep
435 | true
436 |
437 | false
438 | true
439 | true
440 |
441 |
442 | true
443 | Make
444 |
445 | Qt4ProjectManager.MakeStep
446 |
447 | false
448 |
449 |
450 |
451 | 2
452 | Build
453 |
454 | ProjectExplorer.BuildSteps.Build
455 |
456 |
457 |
458 | true
459 | Make
460 |
461 | Qt4ProjectManager.MakeStep
462 |
463 | true
464 | clean
465 |
466 |
467 | 1
468 | Clean
469 |
470 | ProjectExplorer.BuildSteps.Clean
471 |
472 | 2
473 | false
474 |
475 | Profile
476 | Profile
477 | Qt4ProjectManager.Qt4BuildConfiguration
478 | 0
479 | true
480 |
481 | 3
482 |
483 |
484 | 0
485 | 部署
486 |
487 | ProjectExplorer.BuildSteps.Deploy
488 |
489 | 1
490 | Deploy Configuration
491 |
492 | ProjectExplorer.DefaultDeployConfiguration
493 |
494 | 1
495 |
496 |
497 | false
498 | false
499 | 1000
500 |
501 | true
502 |
503 | false
504 | false
505 | false
506 | false
507 | true
508 | 0.01
509 | 10
510 | true
511 | 1
512 | 25
513 |
514 | 1
515 | true
516 | false
517 | true
518 | valgrind
519 |
520 | 0
521 | 1
522 | 2
523 | 3
524 | 4
525 | 5
526 | 6
527 | 7
528 | 8
529 | 9
530 | 10
531 | 11
532 | 12
533 | 13
534 | 14
535 |
536 | 2
537 |
538 | FlowChartTools
539 |
540 | Qt4ProjectManager.Qt4RunConfiguration:E:/SoftwareDesign/FlowChartTools/FlowChartTools.pro
541 | true
542 |
543 | FlowChartTools.pro
544 |
545 | E:/SoftwareDesign/build-FlowChartTools-Desktop_Qt_5_11_2_MinGW_32bit-Release
546 | 3768
547 | false
548 | true
549 | false
550 | false
551 | true
552 |
553 | 1
554 |
555 |
556 |
557 | ProjectExplorer.Project.TargetCount
558 | 2
559 |
560 |
561 | ProjectExplorer.Project.Updater.FileVersion
562 | 18
563 |
564 |
565 | Version
566 | 18
567 |
568 |
569 |
--------------------------------------------------------------------------------
/FlowChartTools/class_Button/button_graph.cpp:
--------------------------------------------------------------------------------
1 | #include "button_graph.h"
2 |
3 | Button_Graph::Button_Graph(QWidget *parent) : QPushButton (parent)
4 | {
5 |
6 | }
7 |
8 | Button_Graph::~Button_Graph()
9 | {
10 |
11 | }
12 | Chart_Base* Button_Graph::newChart()
13 | {
14 |
15 | }
16 | void setPaintChart(FlowChart &fc, Chart_Base *cb);
17 | {
18 | fc.curPaintChart = newChart();
19 | }
20 |
--------------------------------------------------------------------------------
/FlowChartTools/class_Button/button_graph.h:
--------------------------------------------------------------------------------
1 | #ifndef BUTTON_GRAPH_H
2 | #define BUTTON_GRAPH_H
3 | #include
4 | #include "class_Charts/chart_base.h"
5 | #include "comdef.h"
6 |
7 | class FlowChart;
8 | class Button_Graph : public QPushButton
9 | {
10 | public:
11 | Button_Graph(QWidget *parent = nullptr);
12 | virtual ~Button_Graph();
13 | void setPaintChartType(int i);
14 | };
15 |
16 | #endif // BUTTON_GRAPH_H
17 |
--------------------------------------------------------------------------------
/FlowChartTools/class_Charts/chart_base.cpp:
--------------------------------------------------------------------------------
1 | #include "chart_base.h"
2 | int Chart_Base::magPointWidth = 7;
3 | int Chart_Base::sizePointWidth = 9;
4 | int Chart_Base::magPointWidth1_2 = magPointWidth/2;
5 | int Chart_Base::sizePointWidth1_2 = sizePointWidth/2;
6 | int Chart_Base::pointLineWidth = 2;
7 | int Chart_Base::pointLineWidth1_2 = pointLineWidth/2;
8 | int Chart_Base::chartIDCount = 0;
9 |
10 | QPen Chart_Base::paintDrawPen = QPen(QColor(150,80,80),pointLineWidth);
11 | QBrush Chart_Base::paintFillPen = QBrush(QColor(255,255,255));
12 |
13 | Chart_Base::Chart_Base(QWidget *parent, PaintChartType type, bool textType, bool mov, int mpc, int spc):QWidget(parent),magPoint(mpc),sizePoint(spc),movable(mov),chartText(textType)
14 | {
15 | chartType = type;
16 | widgetPosInit();
17 | varInit();
18 | paintInit();
19 | pointInit();
20 | colorInit();
21 | textInit();
22 | // installEventFilter(this);
23 | setMouseTracking(true);
24 | }
25 |
26 | Chart_Base::Chart_Base( int x, int y, int w, int h, QWidget *parent, PaintChartType type):QWidget(parent),magPoint(4),sizePoint(4)
27 | {
28 | chartType = type;
29 | widgetPosInit(x,y,w,h);
30 | varInit();
31 | paintInit();
32 | pointInit();
33 | colorInit();
34 | textInit();
35 | // installEventFilter(this);
36 | setMouseTracking(true);
37 | }
38 |
39 | Chart_Base::Chart_Base(Chart_Base &cb)
40 | {
41 | chartType = cb.chartType;
42 | paintStart = cb.paintStart;
43 | paintEnd = cb.paintEnd;
44 | magPoint = cb.magPoint;
45 | sizePoint = cb.sizePoint;
46 | #if 0
47 | for(auto it = magPoint.begin();it!=magPoint.end();it++)
48 | {
49 | QPainterPath *tmp = new QPainterPath(*(it->i_path));
50 | it->i_path = tmp;
51 | }
52 | for(auto it = sizePoint.begin();it!=sizePoint.end();it++)
53 | {
54 | QPainterPath *tmp = new QPainterPath(*(it->i_path));
55 | it->i_path = tmp;
56 | }
57 | #endif
58 | varInit();
59 | paintInit();
60 | pointInit();
61 | colorInit();
62 | textInit();
63 | // installEventFilter(this);
64 | setMouseTracking(true);
65 | }
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 | void Chart_Base::widgetPosInit(int x,int y,int w,int h)
76 | {
77 | widgetStart.setX(x);
78 | widgetStart.setY(y);
79 | //widgetPos = widgetStart;
80 | widgetEnd.setX(x+w);
81 | widgetEnd.setY(y+h);
82 | updateWidgetPosInof();
83 | }
84 |
85 | void Chart_Base::varInit(int mpw,int spw,int plw,bool sa,bool smo)
86 | {
87 | qDebug()<i_pos = new QPoint;
109 | }
110 | for(auto it = sizePoint.i_point.begin();it != sizePoint.i_point.end(); it++)
111 | {
112 | (*it) = new i_pointbase;
113 | (*it)->i_pos = new QPoint;
114 | }
115 |
116 | updateSizePointInfo();
117 | updateSizePointPath();
118 | updateMagPointInfo();
119 | updateMagPointPath();
120 | }
121 |
122 |
123 | void Chart_Base::textInit()
124 | {
125 | if(chartText.textType)
126 | {
127 | chartText.textType1 = new Chart_Label(this);
128 | chartText.textType1->setText("文本注释");
129 | chartText.textType1->setWordWrap(true);
130 | chartText.textType1->move(paintStart.rx() + sizePointWidth,paintStart.ry() + sizePointWidth);
131 | chartText.textType1->adjustSize();
132 | connect(chartText.textType1,SIGNAL(setTypeChangeTextPos(CHART_LABEL_MOUSE_TYPE,int,int)),this,SLOT(setTypeChangeTextPos(CHART_LABEL_MOUSE_TYPE,int,int)));
133 | //chartText.textType1->show();
134 | }
135 | else
136 | {
137 | chartText.textType2 = new Chart_PlainText(this);
138 | chartText.textType2->appendPlainText("文本注释");
139 | //chartText.textType2->show();
140 | chartText.textType2->setFrameShape(QFrame::NoFrame);
141 | chartText.textType2->setFrameShadow(QFrame::Plain);
142 | chartText.textType2->move(paintStart.rx() + sizePointWidth,paintStart.ry() + sizePointWidth);
143 | chartText.textType2->setStyleSheet("background:transparent;");
144 | chartText.textType2->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);
145 | chartText.textType2->adjustSize();
146 | chartText.textType2->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
147 | chartText.textType2->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
148 | chartText.textType2->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
149 | connect(chartText.textType2,SIGNAL(setTypeChangeTextPos(CHART_TEXT_MOUSE_TYPE,int,int)),this,SLOT(setTypeChangeTextPos(CHART_TEXT_MOUSE_TYPE,int,int)));
150 | chartText.textType2->setTextInteractionFlags(Qt::NoTextInteraction);
151 | }
152 |
153 | }
154 |
155 | void Chart_Base::colorInit()
156 | {
157 | paintChartDrawPen = QPen(QColor(0,0,0),2);
158 | paintChartFillPen = QBrush(QColor(255,255,255));
159 | }
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 | void Chart_Base::updatePaddingInfo()
172 | {
173 | magPointWidth1_2 = magPointWidth>>1;
174 | sizePointWidth1_2 = sizePointWidth>>1;
175 | pointLineWidth1_2 = pointLineWidth>>1;
176 | }
177 |
178 | void Chart_Base::updateWidgetPosInof()
179 | {
180 | #if 1
181 | int w;// = widgetEnd.rx()-widgetStart.rx();
182 | int h;// = widgetEnd.ry()-widgetStart.ry();
183 | int x,y;
184 | if(widgetEnd.rx() < widgetStart.rx())
185 | {
186 | x = widgetEnd.rx() - borderWidth;
187 | w = widgetStart.rx() - widgetEnd.rx() + borderWidth + borderWidth;
188 | }
189 | else
190 | {
191 | x = widgetStart.rx() - borderWidth;
192 | w = widgetEnd.rx() - widgetStart.rx() + borderWidth + borderWidth;
193 | }
194 | if(widgetEnd.ry() < widgetStart.ry())
195 | {
196 | y = widgetEnd.ry() - borderWidth;
197 | h = widgetStart.ry() - widgetEnd.ry() + borderWidth + borderWidth;
198 | }
199 | else
200 | {
201 | y = widgetStart.ry() - borderWidth;
202 | h = widgetEnd.ry() - widgetStart.ry() + borderWidth + borderWidth;
203 | }
204 | //setGeometry(widgetStart.rx(),widgetStart.ry(),w>minSizeWH?w:minSizeWH,h>minSizeWH?h:minSizeWH);
205 | specialWidgetUpdate(x,y,w,h);
206 | setGeometry(x,y,w,h);
207 | #else
208 | int w = widgetEnd.rx()-widgetStart.rx();
209 | int h = widgetEnd.ry()-widgetStart.ry();
210 | //setGeometry(widgetStart.rx(),widgetStart.ry(),w>minSizeWH?w:minSizeWH,h>minSizeWH?h:minSizeWH);
211 | setGeometry(widgetStart.rx(),widgetStart.ry(),w,h);
212 | #endif
213 | }
214 | void Chart_Base::updatePaintInfo()
215 | {
216 | paintStart.setX(borderWidth);
217 | paintStart.setY(borderWidth);
218 | paintEnd.setX(borderWidth + abs(widgetEnd.rx() - widgetStart.rx()));
219 | paintEnd.setY(borderWidth + abs(widgetEnd.ry() - widgetStart.ry()));
220 | specialPaintUpdate(paintStart,paintEnd);
221 | }
222 |
223 | void Chart_Base::updateSizePointInfo()
224 | {
225 | if(sizePoint.i_point.size()>=4)
226 | {
227 | int x1 = paintStart.rx(),y1 = paintStart.ry();
228 | int x2 = paintEnd.rx(),y2 = paintEnd.ry();
229 | sizePoint.i_point[0]->setX(x1);
230 | sizePoint.i_point[0]->setY(y1);
231 | sizePoint.i_point[0]->setRotate(ORIENTION::NORTHWEST);
232 | sizePoint.i_point[1]->setX(x2);
233 | sizePoint.i_point[1]->setY(y1);
234 | sizePoint.i_point[1]->setRotate(ORIENTION::NORTHEAST);
235 | sizePoint.i_point[2]->setX(x2);
236 | sizePoint.i_point[2]->setY(y2);
237 | sizePoint.i_point[2]->setRotate(ORIENTION::SOUTHEAST);
238 | sizePoint.i_point[3]->setX(x1);
239 | sizePoint.i_point[3]->setY(y2);
240 | sizePoint.i_point[3]->setRotate(ORIENTION::SOUTHWEST);
241 | }
242 | }
243 |
244 | void Chart_Base::updateMagPointInfo()
245 | {
246 | if(magPoint.i_point.size()>=4)
247 | {
248 | int x1 = paintStart.rx(),y1 = paintStart.ry();
249 | int x2 = paintEnd.rx(),y2 = paintEnd.ry();
250 | int midx = ((paintStart.rx() + paintEnd.rx())>>1);
251 | int midy = ((paintStart.ry() + paintEnd.ry())>>1);
252 |
253 | magPoint.i_point[0]->setX(midx);
254 | magPoint.i_point[0]->setY(y1);
255 | magPoint.i_point[0]->setRotate(ORIENTION::NORTH);
256 | magPoint.i_point[1]->setX(x2);
257 | magPoint.i_point[1]->setY(midy);
258 | magPoint.i_point[1]->setRotate(ORIENTION::EAST);
259 | magPoint.i_point[2]->setX(midx);
260 | magPoint.i_point[2]->setY(y2);
261 | magPoint.i_point[2]->setRotate(ORIENTION::SOUTH);
262 | magPoint.i_point[3]->setX(x1);
263 | magPoint.i_point[3]->setY(midy);
264 | magPoint.i_point[3]->setRotate(ORIENTION::WEST);
265 | }
266 | }
267 |
268 | void Chart_Base::adjustPointInfo()
269 | {
270 | for(auto it = magPoint.i_point.begin();it!=magPoint.i_point.end();it++)
271 | {
272 | switch((*it)->getRotate())
273 | {
274 | default:case ORIENTION::NONE:case ORIENTION::NORTHWEST:break;
275 | case ORIENTION::NORTH:(*it)->setX((*it)->getX() + pointLineWidth1_2);break;
276 | case ORIENTION::NORTHEAST:(*it)->setX((*it)->getX() + pointLineWidth);break;
277 | case ORIENTION::EAST:(*it)->setX((*it)->getX() + pointLineWidth);(*it)->setY((*it)->getY() + pointLineWidth1_2);break;
278 | case ORIENTION::SOUTHEAST:(*it)->setX((*it)->getX() + pointLineWidth);(*it)->setY((*it)->getY() + pointLineWidth);break;
279 | case ORIENTION::SOUTH:(*it)->setX((*it)->getX() + pointLineWidth1_2);(*it)->setY((*it)->getY() + pointLineWidth);break;
280 | case ORIENTION::SOUTHWEST:(*it)->setY((*it)->getY() + pointLineWidth);break;
281 | case ORIENTION::WEST:(*it)->setY((*it)->getY() + pointLineWidth1_2);break;
282 | }
283 | }
284 | for(auto it = sizePoint.i_point.begin();it!=sizePoint.i_point.end();it++)
285 | {
286 | switch((*it)->getRotate())
287 | {
288 | default:case ORIENTION::NONE:case ORIENTION::NORTHWEST:break;
289 | case ORIENTION::NORTH:(*it)->setX((*it)->getX() + pointLineWidth1_2);break;
290 | case ORIENTION::NORTHEAST:(*it)->setX((*it)->getX() + pointLineWidth);break;
291 | case ORIENTION::EAST:(*it)->setX((*it)->getX() + pointLineWidth);(*it)->setY((*it)->getY() + pointLineWidth1_2);break;
292 | case ORIENTION::SOUTHEAST:(*it)->setX((*it)->getX() + pointLineWidth);(*it)->setY((*it)->getY() + pointLineWidth);break;
293 | case ORIENTION::SOUTH:(*it)->setX((*it)->getX() + pointLineWidth1_2);(*it)->setY((*it)->getY() + pointLineWidth);break;
294 | case ORIENTION::SOUTHWEST:(*it)->setY((*it)->getY() + pointLineWidth);break;
295 | case ORIENTION::WEST:(*it)->setY((*it)->getY() + pointLineWidth1_2);break;
296 | }
297 | }
298 | }
299 | void Chart_Base::updateMagPointPath()
300 | {
301 | for(auto it = magPoint.i_point.begin(),end = magPoint.i_point.end();it != end;it++)
302 | {
303 | (*it)->newPath()->addEllipse((*it)->getX() - sizePointWidth1_2,(*it)->getY() - sizePointWidth1_2,sizePointWidth,sizePointWidth);
304 | }
305 | }
306 |
307 | void Chart_Base::updateSizePointPath()
308 | {
309 | for(auto it = sizePoint.i_point.begin(),end = sizePoint.i_point.end();it != end;it++)
310 | {
311 | (*it)->newPath()->addRect((*it)->getX() - sizePointWidth1_2,(*it)->getY() - sizePointWidth1_2,sizePointWidth,sizePointWidth);
312 | }
313 | }
314 | void Chart_Base::updateMagPointLine()
315 | {
316 | for(auto it = magPoint.i_point.begin(),end = magPoint.i_point.end();it != end;it++)
317 | {
318 | for(auto l_it = (*it)->i_lineStart.begin(),l_end = (*it)->i_lineStart.end();l_it != l_end;l_it++)
319 | {
320 | if( (*l_it)->widgetStart.rx() != (*it)->getX() + x() || (*l_it)->widgetStart.ry() != (*it)->getY() + y())
321 | {
322 | (*l_it)->setStartPos((*it)->getX() + x(),(*it)->getY() + y());
323 |
324 | (*l_it)->updateWidgetPosInof();
325 | (*l_it)->updatePaintInfo();
326 | (*l_it)->updateSizePointInfo();
327 | (*l_it)->updateSizePointPath();
328 | (*l_it)->updateTextInfo();
329 | }
330 | }
331 | for(auto l_it = (*it)->i_lineEnd.begin(),l_end = (*it)->i_lineEnd.end();l_it != l_end;l_it++)
332 | {
333 | if( (*l_it)->widgetEnd.rx() != (*it)->getX() + x() || (*l_it)->widgetEnd.ry() != (*it)->getY() + y())
334 | {
335 | (*l_it)->setEndPos((*it)->getX() + x(),(*it)->getY() + y());
336 |
337 | (*l_it)->updateWidgetPosInof();
338 | (*l_it)->updatePaintInfo();
339 | (*l_it)->updateSizePointInfo();
340 | (*l_it)->updateSizePointPath();
341 | (*l_it)->updateTextInfo();
342 | }
343 | }
344 | }
345 | }
346 | void Chart_Base::updateTextInfo()
347 | {
348 | int w = paintEnd.rx() - paintStart.rx();
349 | w = w>0?w:0;
350 | if(chartText.textType)
351 | {
352 | chartText.textType1->setMaximumWidth(w);
353 | chartText.textType1->setMaximumHeight(w);
354 | chartText.textType1->adjustSize();
355 | if(chartText.textType1->x() + chartText.textType1->width() >paintEnd.rx())
356 | {
357 | if(paintEnd.rx() - chartText.textType1->width()move(paintStart.rx(),chartText.textType1->y());
359 | else
360 | chartText.textType1->move(paintEnd.rx() - chartText.textType1->width(),chartText.textType1->y());
361 | }
362 | if(chartText.textType1->y() + chartText.textType1->height() >paintEnd.ry())
363 | {
364 | if(paintEnd.ry() - chartText.textType1->height()move(chartText.textType1->x(),paintStart.ry());
366 | else
367 | chartText.textType1->move(chartText.textType1->x(),paintEnd.ry() - chartText.textType1->height());
368 | }
369 | }
370 | else
371 | {
372 | chartText.textType2->setMaximumWidth(w);
373 | chartText.textType2->setMaximumHeight(w);
374 | chartText.textType2->adjustSize();
375 | if(chartText.textType2->x() + chartText.textType2->width() >paintEnd.rx())
376 | {
377 | if(paintEnd.rx() - chartText.textType2->width()move(paintStart.rx(),chartText.textType2->y());
379 | else
380 | chartText.textType2->move(paintEnd.rx() - chartText.textType2->width(),chartText.textType2->y());
381 | }
382 | if(chartText.textType2->y() + chartText.textType2->height() >paintEnd.ry())
383 | {
384 | if(paintEnd.ry() - chartText.textType2->height()move(chartText.textType2->x(),paintStart.ry());
386 | else
387 | chartText.textType2->move(chartText.textType2->x(),paintEnd.ry() - chartText.textType2->height());
388 | }
389 | }
390 | }
391 |
392 |
393 |
394 |
395 |
396 |
397 |
398 |
399 |
400 |
401 |
402 |
403 | void Chart_Base::paintMagPoint(QPainter & p)
404 | {
405 | QPen tmp = p.pen();
406 | p.setPen(paintDrawPen);
407 | #if (RUNTIME_PAINTMAG == ENABLE)
408 | QPainterPath path;
409 | #else
410 | QPainterPath* tmpPath;
411 | #endif
412 | for(auto it = magPoint.i_point.begin(),end = magPoint.i_point.end(); it != end;it++)
413 | {
414 | #if (RUNTIME_PAINTMAG == ENABLE)
415 | path.addEllipse((*it).i_pos.rx()-magPointWidth1_2,(*it).i_pos.ry()-magPointWidth1_2,magPointWidth,magPointWidth);
416 | #else
417 | tmpPath = (*it)->getPath();
418 | p.drawPath(*tmpPath);
419 | p.fillPath(*tmpPath,paintFillPen);
420 | #endif
421 | }
422 | #if (RUNTIME_PAINTMAG == ENABLE)
423 | p.fillPath(path,tb);
424 | p.drawPath(path);
425 | #endif
426 | p.setPen(tmp);
427 | }
428 |
429 | void Chart_Base::paintSizePoint(QPainter & p)
430 | {
431 | QPen tmp = p.pen();
432 | p.setPen(paintDrawPen);
433 |
434 |
435 | #if (RUNTIME_PAINTSIZE == ENABLE)
436 | QPainterPath path;
437 | #else
438 | QPainterPath* tmpPath;
439 | #endif
440 | for(auto it = sizePoint.i_point.begin(),end = sizePoint.i_point.end(); it != end;it++)
441 | {
442 | #if (RUNTIME_PAINTSIZE == ENABLE)
443 | path.addRect((*it).i_pos.rx()-sizePointWidth1_2,(*it).i_pos.ry()-sizePointWidth1_2,sizePointWidth,sizePointWidth);
444 | #else
445 | tmpPath = (*it)->getPath();
446 | p.drawPath(*tmpPath);
447 | p.fillPath(*tmpPath,paintFillPen);
448 | #endif
449 | }
450 |
451 | #if (RUNTIME_PAINTSIZE == ENABLE)
452 | p.fillPath(path,tb);
453 | p.drawPath(path);
454 | #endif
455 | p.setPen(tmp);
456 | }
457 | void Chart_Base::paintSizeEdge(QPainter & p)
458 | {
459 | QPen tmp = p.pen();
460 | p.setPen(paintDrawPen);
461 |
462 | int sx = paintStart.rx(),sy = paintStart.ry(),ex = paintEnd.rx(),ey = paintEnd.ry();
463 | int /*sx1 = sx-sizePointWidth1_2,*/sx2 = sx+sizePointWidth1_2,/*sy1 = sy-sizePointWidth1_2,*/sy2 = sy+sizePointWidth1_2;
464 | int ex1 = ex-sizePointWidth1_2/*,ex2 = ex+sizePointWidth1_2*/,ey1 = ey-sizePointWidth1_2/*,ey2 = ey+sizePointWidth1_2*/;
465 | p.drawLine(sx2,sy,ex1,sy);
466 | p.drawLine(ex,sy2,ex,ey1);
467 | p.drawLine(ex1,ey,sx2,ey);
468 | p.drawLine(sx,ey1,sx,sy2);
469 |
470 | p.setPen(tmp);
471 | }
472 |
473 | bool Chart_Base::inPath(const QPointF &p)
474 | {
475 | for(auto it = magPoint.i_point.begin(),end = magPoint.i_point.end();it!=end;it++)
476 | {
477 | if((*it)->inPath(p))return true;
478 | }
479 | for(auto it = sizePoint.i_point.begin(),end = sizePoint.i_point.end();it!=end;it++)
480 | {
481 | if((*it)->inPath(p))return true;
482 | }
483 | return inGraphisPath(p);
484 | }
485 | bool Chart_Base::inMagPath(const QPointF &p, ORIENTION &b, int &index) const
486 | {
487 | int i = 0;
488 | for(auto it = magPoint.i_point.begin(),end = magPoint.i_point.end();it!=end;it++,i++)
489 | {
490 | if((*it)->inPath(p))
491 | {
492 | b = (*it)->getRotate();
493 | index = i;
494 | return true;
495 | }
496 | }
497 | return false;
498 | }
499 | bool Chart_Base::inSizePath(const QPointF &p, ORIENTION &b) const
500 | {
501 | int x,y;
502 | for(auto it = sizePoint.i_point.begin(),end = sizePoint.i_point.end();it!=end;it++)
503 | {
504 | if((*it)->inPath(p))
505 | //x = p.x()-(*it)->getX();
506 | //y = p.y()-(*it)->getY();
507 | //if(x>=0&&x<=sizePointWidth && y>=0&&y<=sizePointWidth)
508 | {
509 | b = (*it)->getRotate();
510 | return true;
511 | }
512 | }
513 | return false;
514 | }
515 | void Chart_Base::setStartPos(int x,int y)
516 | {
517 | widgetStart.setX(x);
518 | widgetStart.setY(y);
519 | }
520 | void Chart_Base::setEndPos(int x,int y)
521 | {
522 | widgetEnd.setX(x);
523 | widgetEnd.setY(y);
524 | }
525 | //void Chart_Base::setGeometryNew(int x,int y,int w, int h)
526 | //{
527 | // int *x1,*y1;
528 | // int *x2,*y2;
529 | // if(widgetEnd.rx()=widgetPos.rx()+borderWidth)
602 | {
603 | if(y>=widgetPos.ry()+borderWidth) type = ORIENTION::SOUTHEAST;
604 | else type = ORIENTION::NORTHEAST;
605 | }
606 | else if(y>=widgetPos.ry()+borderWidth)
607 | {
608 | if(x>=widgetPos.rx()+borderWidth) type = ORIENTION::SOUTHEAST;
609 | else type = ORIENTION::SOUTHWEST;
610 | }
611 | else
612 | {
613 | type = ORIENTION::NORTHWEST;
614 | }
615 |
616 | switch(type)
617 | {
618 | case ORIENTION::NORTHWEST:
619 | {
620 | if(type != lastType)
621 | {
622 | widgetEnd.setX(widgetPos.rx()+borderWidth);
623 | widgetEnd.setY(widgetPos.ry()+borderWidth);
624 | }
625 | widgetStart.setX(x - borderWidth);
626 | widgetStart.setY(y - borderWidth);
627 | }break;
628 | case ORIENTION::NORTHEAST:
629 | {
630 | if(type != lastType)
631 | {
632 | widgetEnd.setY(widgetPos.ry()+borderWidth);
633 | widgetStart.setX(widgetPos.rx()+borderWidth);
634 | }
635 | widgetEnd.setX(x + borderWidth);
636 | widgetStart.setY(y - borderWidth);
637 | }break;
638 | case ORIENTION::SOUTHEAST:
639 | {
640 | if(type != lastType)
641 | {
642 | widgetStart.setX(widgetPos.rx()+borderWidth);
643 | widgetStart.setY(widgetPos.ry()+borderWidth);
644 | }
645 | widgetEnd.setX(x + borderWidth);
646 | widgetEnd.setY(y + borderWidth);
647 | }break;
648 | case ORIENTION::SOUTHWEST:
649 | {
650 | if(type != lastType)
651 | {
652 | widgetStart.setY(widgetPos.ry()+borderWidth);
653 | widgetEnd.setX(widgetPos.rx()+borderWidth);
654 | }
655 | widgetStart.setX(x - borderWidth);
656 | widgetEnd.setY(y + borderWidth);
657 | }break;
658 | }
659 | lastType = type;
660 | #elif 0
661 | ORIENTION type;
662 | if(x < widgetStart.rx())
663 | {
664 | widgetEnd.setX(x);
665 | //widgetStart.setY(widgetStart.ry()+borderWidth);
666 | }
667 | else
668 | {
669 | widgetEnd.setX(x);
670 | }
671 | if(y < widgetStart.ry())
672 | {
673 | widgetEnd.setY(y);
674 | //widgetStart.setX(widgetStart.rx()+borderWidth);
675 | }
676 | else
677 | {
678 | widgetEnd.setY(y);
679 | }
680 | #else
681 | widgetEnd.setX(x);
682 | widgetEnd.setY(y);
683 | #endif
684 |
685 | updateWidgetPosInof();
686 | updatePaintInfo();
687 | updateSizePointInfo();
688 | updateSizePointPath();
689 | updateMagPointInfo();
690 | updateMagPointPath();
691 | updateMagPointLine();
692 | updateTextInfo();
693 | }
694 | void Chart_Base::setWidthHeight(int x, int y, ORIENTION type)
695 | {
696 | int *x1,*y1;
697 | int *x2,*y2;
698 | if(widgetEnd.rx() &p)
793 | //{
794 | // for(auto it = sizePoint.begin();it != sizePoint.end();it++)
795 | // if((*it).i_path) delete (*it).i_path;
796 | // sizePoint.clear();
797 | // for(auto it = p.begin(); it!=p.end();it++)
798 | // sizePoint.push_back({*it,nullptr});
799 | //}
800 | //void Chart_Base::setMagPoint(const std::vector &p)
801 | //{
802 | // for(auto it = magPoint.begin();it != magPoint.end();it++)
803 | // if((*it).i_path) delete (*it).i_path;
804 | // magPoint.clear();
805 | // for(auto it = p.begin(); it!=p.end();it++)
806 | // magPoint.push_back({*it,nullptr});
807 | //}
808 |
809 | bool Chart_Base::autoSetMagi(int &abcx,int &abcy, int &index)
810 | {
811 | int mx = abcx;
812 | int my = abcy;
813 | if(mx >= x() && my >= y() && mx-x()<=width() && my-y()<=width())
814 | {
815 | showMagOnly();
816 | int x1,y1;
817 | mx -= x();
818 | my -= y();
819 | int i = 0;
820 | for(auto it = magPoint.i_point.begin(),end = magPoint.i_point.end();it != end;it++,i++)
821 | {
822 | x1 = (*it)->getX() + magPointWidth1_2;
823 | y1 = (*it)->getY() + magPointWidth1_2;
824 | if(abs(x1-mx) <= magPointAutoMagiRange && abs(y1-my) <= magPointAutoMagiRange)
825 | {
826 | abcx = x() + (*it)->getX();
827 | abcy = y() + (*it)->getY();
828 | index = i;
829 | return true;
830 | }
831 | }
832 | }
833 | else
834 | {
835 | hideMagOnly();
836 | }
837 |
838 | return false;
839 | }
840 | void Chart_Base::overlapChartMousePressed(QMouseEvent *event)
841 | {
842 | int mx = event->pos().rx();
843 | int my = event->pos().ry();
844 | if(mx >= x() && my >= y() && mx-x()<=width() && my-y()<=width())
845 | {
846 | QPointF tmp(mx-this->x(),my-this->y());
847 | ORIENTION direct = ORIENTION::NONE;
848 |
849 | if(inGraphisPath(tmp))
850 | {
851 | emit sendThisClass(this,tmp.rx()-borderWidth,tmp.ry()-borderWidth);
852 | curFlag = MOUSE_EVENT_TYPE::RUNTIME_CHANGE_POS;
853 | event->accept();
854 | raise();
855 | }
856 | }
857 | }
858 | void Chart_Base::overlapChartMouseMove(QMouseEvent *event)
859 | {
860 | int mx = event->pos().rx();
861 | int my = event->pos().ry();
862 |
863 | if( mx >= x() && my >= y() && mx-x()<=width() && my-y()<=height())
864 | {
865 | ORIENTION direct = ORIENTION::NONE;
866 | int index;
867 | QPointF tmp(mx-this->x(),my-this->y());
868 | if(showMag)
869 | {
870 | if(inMagPath(tmp,direct,index))
871 | {
872 | setCursor(QCursor(Qt::SizeAllCursor));
873 | event->accept();
874 | raise();
875 | }
876 | else if(inGraphisPath(tmp))
877 | {
878 | setCursor(QCursor(Qt::SizeAllCursor));
879 | event->accept();
880 | raise();
881 | }
882 | else
883 | {
884 | hideMagOnly();
885 | setCursor(QCursor(Qt::ArrowCursor));
886 | }
887 | }
888 | else
889 | {
890 | if(inGraphisPath(tmp))
891 | {
892 | setCursor(QCursor(Qt::SizeAllCursor));
893 | event->accept();
894 | raise();
895 | }
896 | else
897 | {
898 | setCursor(QCursor(Qt::ArrowCursor));
899 | }
900 | }
901 | }
902 | }
903 | void Chart_Base::deleteThisChart()
904 | {
905 | }
906 | void Chart_Base::saveStaticValue(QDataStream &fout)
907 | {
908 | fout.writeRawData(reinterpret_cast(&Chart_Base::magPointWidth),sizeof(int));
909 | fout.writeRawData(reinterpret_cast(&Chart_Base::sizePointWidth),sizeof(int));
910 | fout.writeRawData(reinterpret_cast(&Chart_Base::pointLineWidth),sizeof(int));
911 | //fout.writeRawData(reinterpret_cast(&Chart_Base::chartIDCount),sizeof(int));
912 | qDebug()<(&Chart_Base::magPointWidth),sizeof(int));
917 | fin.readRawData(reinterpret_cast(&Chart_Base::sizePointWidth),sizeof(int));
918 | fin.readRawData(reinterpret_cast(&Chart_Base::pointLineWidth),sizeof(int));
919 | updatePaddingInfo();
920 | //fin.readRawData(reinterpret_cast(&Chart_Base::chartIDCount),sizeof(int));
921 | qDebug()<<"static value:"<(&cb.chartType),sizeof(PaintChartType));
926 | fout.writeRawData(reinterpret_cast(&cb.ID),sizeof(int));
927 | fout<(&cb.paintStart.rx()),sizeof(int));
930 | // fout.writeRawData(reinterpret_cast(&cb.paintEnd.rx()),sizeof(int));
931 | // fout.writeRawData(reinterpret_cast(&cb.widgetStart.rx()),sizeof(int));
932 | // fout.writeRawData(reinterpret_cast(&cb.widgetEnd.rx()),sizeof(int));
933 | // fout.writeRawData(reinterpret_cast(&cb.paintChartDrawPen),sizeof(QPen));
934 | // fout.writeRawData(reinterpret_cast(&cb.paintChartFillPen),sizeof(QBrush));
935 | fout.writeRawData(reinterpret_cast(&cb.movable),sizeof(bool));
936 | qDebug()<<"Chart Base Info:"<>(QDataStream &fin, Chart_Base &cb)
940 | {
941 | //fin.readRawData(reinterpret_cast(&cb.chartType),sizeof(PaintChartType));
942 | fin.readRawData(reinterpret_cast(&cb.ID),sizeof(int));
943 | fin>>cb.chartText;//>>cb.magPoint;
944 | fin>>cb.paintStart>>cb.paintEnd>>cb.widgetStart>>cb.widgetEnd>>cb.paintChartDrawPen>>cb.paintChartFillPen;
945 | // fin.readRawData(reinterpret_cast(&cb.paintStart.rx()),sizeof(int));
946 | // fin.readRawData(reinterpret_cast(&cb.paintEnd.rx()),sizeof(int));
947 | // fin.readRawData(reinterpret_cast(&cb.widgetStart.rx()),sizeof(int));
948 | // fin.readRawData(reinterpret_cast(&cb.widgetEnd.rx()),sizeof(int));
949 | // fin.readRawData(reinterpret_cast(&cb.paintChartDrawPen),sizeof(QPen));
950 | // fin.readRawData(reinterpret_cast(&cb.paintChartFillPen),sizeof(QBrush));
951 | fin.readRawData(reinterpret_cast(&cb.movable),sizeof(bool));
952 | qDebug()<<"Chart Base Info:"<releaseKeyboard();
972 | showAll = false;
973 | if(chartText.textType)
974 | {
975 | if(chartText.tmpEdit1)
976 | {
977 | chartText.textType1->setText(chartText.tmpEdit1->text());
978 | chartText.textType1->adjustSize();
979 | delete chartText.tmpEdit1;
980 | chartText.tmpEdit1 = nullptr;
981 | }
982 | }
983 | else
984 | {
985 | if(chartText.tmpEdit2)
986 | {
987 |
988 | //chartText.setText(tmpLineEdit->text());
989 | chartText.textType2->setPlainText(chartText.tmpEdit2->toPlainText());
990 | chartText.textType2->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);
991 |
992 | chartText.textType2->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
993 | chartText.textType2->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
994 | chartText.textType2->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
995 | chartText.textType2->adjustSize();
996 | delete chartText.tmpEdit2;
997 | chartText.tmpEdit2 = nullptr;
998 | }
999 | }
1000 | //curFlag = MOUSE_EVENT_TYPE::NONE;
1001 | update();
1002 | }
1003 | }
1004 |
1005 |
1006 | void Chart_Base::showMagOnly()
1007 | {
1008 | if(showMag == false)
1009 | {
1010 | showMag = true;
1011 | showAll = false;
1012 | update();
1013 | }
1014 | }
1015 | void Chart_Base::hideMagOnly()
1016 | {
1017 | if(showMag)
1018 | {
1019 | this->releaseKeyboard();
1020 | showMag = false;
1021 | if(chartText.textType)
1022 | {
1023 | if(chartText.tmpEdit1)
1024 | {
1025 | chartText.textType1->setText(chartText.tmpEdit1->text());
1026 | chartText.textType1->adjustSize();
1027 | delete chartText.tmpEdit1;
1028 | chartText.tmpEdit1 = nullptr;
1029 | }
1030 | }
1031 | else
1032 | {
1033 | if(chartText.tmpEdit2)
1034 | {
1035 |
1036 | //chartText.setText(tmpLineEdit->text());
1037 | chartText.textType2->setPlainText(chartText.tmpEdit2->toPlainText());
1038 | chartText.textType2->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);
1039 |
1040 | chartText.textType2->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
1041 | chartText.textType2->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
1042 | chartText.textType2->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
1043 | chartText.textType2->adjustSize();
1044 | delete chartText.tmpEdit2;
1045 | chartText.tmpEdit2 = nullptr;
1046 | }
1047 | }
1048 | update();
1049 | }
1050 | }
1051 |
1052 |
1053 |
1054 |
1055 | void Chart_Base::paintEvent(QPaintEvent *event)
1056 | {
1057 | QPainter p(this);
1058 | paintChart(p);
1059 | if(showAll)
1060 | {
1061 | paintSizeEdge(p);
1062 | paintMagPoint(p);
1063 | paintSizePoint(p);
1064 | }else if(showMag)
1065 | {
1066 | paintMagPoint(p);
1067 | }
1068 | event->accept();
1069 | }
1070 |
1071 | //bool Chart_Base::eventFilter(QObject *target, QEvent *event)
1072 | //{
1073 | // //qDebug()<type() == QEvent::Enter)
1075 | //// {
1076 | //// showMagOnly();
1077 | //// event->accept();
1078 | //// }
1079 | //// else if(event->type() == QEvent::Leave)
1080 | //// {
1081 | //// hideMagOnly();
1082 | //// event->accept();
1083 | //// }
1084 |
1085 | // return QWidget::eventFilter(target, event);
1086 | //}
1087 |
1088 | void Chart_Base::mousePressEvent(QMouseEvent *event)
1089 | {
1090 | //if(curFlag == MOUSE_EVENT_TYPE::NONE)
1091 | {
1092 | ORIENTION direct = ORIENTION::NONE;
1093 | int index;
1094 |
1095 | if(showAll&&inSizePath(event->pos(),direct))
1096 | {
1097 | emit setTypeChangeSize(direct);
1098 | curFlag = MOUSE_EVENT_TYPE::RUNTIME_CHANGE_SIZE;
1099 | curIndex = direct;
1100 | raise();
1101 |
1102 | }
1103 | else if((showAll||showMag)&&inMagPath(event->pos(),direct,index))
1104 | {
1105 | emit setTypeCreateMagPoint(this,direct,index);
1106 | curFlag = MOUSE_EVENT_TYPE::RUNTIME_CREATE_MAGPOINT;
1107 | curIndex = direct;
1108 | showMagOnly();
1109 | raise();
1110 | }
1111 | else if(inGraphisPath(event->pos()) )
1112 | {
1113 | emit sendThisClass(this,event->pos().rx()-borderWidth,event->pos().ry()-borderWidth);
1114 | curFlag = MOUSE_EVENT_TYPE::RUNTIME_CHANGE_POS;
1115 | curIndex = direct;
1116 | raise();
1117 | }
1118 | else
1119 | {
1120 | curFlag = MOUSE_EVENT_TYPE::NONE;
1121 | showAll = false;
1122 | event->ignore();
1123 | }
1124 |
1125 | }
1126 | //else
1127 | {
1128 | //event->ignore();
1129 | }
1130 | }
1131 | void Chart_Base::mouseMoveEvent(QMouseEvent *event)
1132 | {
1133 | if(curFlag == MOUSE_EVENT_TYPE::NONE)
1134 | {
1135 | ORIENTION direct = ORIENTION::NONE;
1136 | int index;
1137 |
1138 | if(showAll)
1139 | {
1140 | if(inSizePath(event->pos(),direct))
1141 | {
1142 | switch(ORIENTION(direct))
1143 | {
1144 | case ORIENTION::NORTHWEST:case ORIENTION::SOUTHEAST:{
1145 | setCursor(QCursor(Qt::SizeFDiagCursor));
1146 | }break;
1147 | case ORIENTION::NORTHEAST:case ORIENTION::SOUTHWEST:{
1148 | setCursor(QCursor(Qt::SizeBDiagCursor));
1149 | }break;
1150 | case ORIENTION::STARTPOINT:case ORIENTION::ENDPOINT:{
1151 | setCursor(QCursor(Qt::SizeAllCursor));
1152 | }break;
1153 | }
1154 | raise();
1155 | }
1156 | else if(inMagPath(event->pos(),direct,index))
1157 | {
1158 | setCursor(QCursor(Qt::CrossCursor));
1159 | raise();
1160 | }
1161 | else if(inGraphisPath(event->pos()))
1162 | {
1163 | setCursor(QCursor(Qt::SizeAllCursor));
1164 | raise();
1165 | }
1166 | else
1167 | {
1168 | //setCursor(QCursor(Qt::ArrowCursor));
1169 | event->ignore();
1170 | }
1171 | }
1172 | else if(showMag)
1173 | {
1174 | if(inMagPath(event->pos(),direct,index))
1175 | {
1176 | setCursor(QCursor(Qt::CrossCursor));
1177 | raise();
1178 | }
1179 | else if(inGraphisPath(event->pos()))
1180 | {
1181 | setCursor(QCursor(Qt::SizeAllCursor));
1182 | raise();
1183 | }
1184 | else
1185 | {
1186 | //setCursor(QCursor(Qt::ArrowCursor));
1187 | hideMagOnly();
1188 | event->ignore();
1189 | }
1190 | }
1191 | else
1192 | {
1193 | if(inGraphisPath(event->pos()))
1194 | {
1195 | setCursor(QCursor(Qt::SizeAllCursor));
1196 | showMagOnly();
1197 | raise();
1198 | }
1199 | else
1200 | {
1201 | //setCursor(QCursor(Qt::ArrowCursor));
1202 | event->ignore();
1203 | }
1204 | }
1205 | if(chartText.textMouseT1 == CHART_LABEL_MOUSE_TYPE::CHANGE_POS)
1206 | {
1207 | emit sendThisClass(this,event->pos().rx()-borderWidth,event->pos().ry()-borderWidth);
1208 | if(chartText.textType == 1)
1209 | {
1210 | chartText.textType1->move(event->pos().rx()-chartText.chartTextMousePos.rx(),event->pos().ry()-chartText.chartTextMousePos.ry());
1211 | chartText.textType1->adjustSize();
1212 | }
1213 | else
1214 | {
1215 | chartText.textType2->move(event->pos().rx()-chartText.chartTextMousePos.rx(),event->pos().ry()-chartText.chartTextMousePos.ry());
1216 | }
1217 | }
1218 | }
1219 | else
1220 | {
1221 | event->ignore();
1222 | }
1223 |
1224 | }
1225 | void Chart_Base::mouseReleaseEvent(QMouseEvent *event)
1226 | {
1227 | if(chartText.textType)
1228 | {
1229 | chartText.textMouseT1 = CHART_LABEL_MOUSE_TYPE::NONE;
1230 | }
1231 | else
1232 | {
1233 | chartText.textMouseT2 = CHART_TEXT_MOUSE_TYPE::NONE;
1234 | }
1235 | curFlag = MOUSE_EVENT_TYPE::NONE;
1236 | //setCursor(QCursor(Qt::ArrowCursor));
1237 | event->ignore();
1238 | }
1239 | void Chart_Base::mouseDoubleClickEvent(QMouseEvent *event)
1240 | {
1241 | if(inPath(event->pos()))
1242 | {
1243 | emit sendThisClass(this,event->pos().rx()-borderWidth,event->pos().ry()-borderWidth);
1244 | if(chartText.textType)
1245 | {
1246 | chartText.tmpEdit1 = new QLineEdit(chartText.textType1->text(),this);
1247 | chartText.textType1->setText("");
1248 | chartText.tmpEdit1->adjustSize();
1249 | chartText.tmpEdit1->setStyleSheet("background:transparent;");
1250 | chartText.tmpEdit1->setGeometry(chartText.textType1->x(),chartText.textType1->y(),chartText.textType1->width() + (textBorderWidth<<1),chartText.textType1->height() + (textBorderWidth<<1));
1251 | chartText.tmpEdit1->show();
1252 | chartText.tmpEdit1->setFocus();
1253 | }
1254 | else
1255 | {
1256 | chartText.tmpEdit2 = new QPlainTextEdit(chartText.textType2->toPlainText(),this);
1257 | chartText.textType2->setPlainText("");
1258 | chartText.tmpEdit2->adjustSize();
1259 | chartText.tmpEdit2->setStyleSheet("background:transparent;");
1260 | chartText.tmpEdit2->setGeometry(paintStart.rx() + textBorderWidth,paintStart.ry() + textBorderWidth,paintEnd.rx() - paintStart.rx() - (textBorderWidth<<1),paintEnd.ry() - paintStart.ry() - (textBorderWidth<<1));
1261 | chartText.tmpEdit2->show();
1262 | chartText.tmpEdit2->setFocus();
1263 | }
1264 | this->grabKeyboard();
1265 | }else{
1266 | event->ignore();
1267 | }
1268 | }
1269 |
1270 | void Chart_Base::leaveEvent(QEvent *event)
1271 | {
1272 | hideMagOnly();
1273 | }
1274 |
--------------------------------------------------------------------------------
/FlowChartTools/class_Charts/chart_base.h:
--------------------------------------------------------------------------------
1 | #ifndef CHART_BASE_H
2 | #define CHART_BASE_H
3 | #pragma execution_character_set("utf-8")
4 |
5 | #include
6 | #include
7 | #include
8 | #include
9 |
10 | #include
11 | #include
12 | #include
13 | #include
14 | #include
15 | #include
16 | #include
17 |
18 | #include
19 | #include
20 |
21 | #include "comdef.h"
22 |
23 | #include "class_Charts/chart_label.h"
24 | #include "class_Charts/chart_plaintext.h"
25 |
26 | #include
27 | #include
28 |
29 | #define ENABLE 1 // 使能
30 | #define DIABLE 0 // 失能
31 | #define RUNTIME_PAINTMAG DIABLE // 实时磁力点绘制
32 | #define RUNTIME_PAINTSIZE DIABLE // 实时大小点绘制
33 |
34 | class Chart_Base :public QWidget
35 | {
36 | Q_OBJECT
37 | friend class FlowChart;
38 | private:
39 |
40 | static int magPointWidth; // Padding信息-磁力点宽度
41 | static int sizePointWidth; // Padding信息-大小点宽度
42 | static int magPointWidth1_2; // Padding信息-磁力点一半宽度
43 | static int sizePointWidth1_2; // Padding信息-大小点一半宽度
44 | static int pointLineWidth; // Padding信息-大小点、磁力点线宽度
45 | static int pointLineWidth1_2; // Padding信息-大小点、磁力点线线一半宽度
46 | static int chartIDCount; // 总ID计数
47 | static const int magPointAutoMagiRange = 10;// 磁力点自动吸附范围
48 | static const int borderWidth = 20; // Border信息-禁止绘画区域宽度
49 | static const int minSizeWH = 40; // 图形最小宽高
50 | static const int textBorderWidth = 10; // 文件边界最小宽高
51 |
52 |
53 | bool showAll = true; // 显示大小控制点和磁力点? ###
54 | bool showMag = false; // 显示磁力点? ###
55 | ORIENTION lastType = ORIENTION::NONE; // 改变大小状态切换
56 | MOUSE_EVENT_TYPE curFlag = MOUSE_EVENT_TYPE::NONE; // 鼠标事件类型
57 | ORIENTION curIndex = ORIENTION::NONE; // 当前选中大小点、磁力点方向
58 | PaintChartType chartType = PaintChartType::NONE; // 图形类型
59 | int ID; // 图形编号
60 |
61 |
62 | static void resetStaticVal(){
63 | Chart_Base::magPointWidth = 7;
64 | Chart_Base::sizePointWidth = 9;
65 | Chart_Base::magPointWidth1_2 = magPointWidth/2;
66 | Chart_Base::sizePointWidth1_2 = sizePointWidth/2;
67 | Chart_Base::pointLineWidth = 2;
68 | Chart_Base::pointLineWidth1_2 = pointLineWidth/2;
69 | Chart_Base::chartIDCount = 0;
70 | }
71 | void varInit(int mpw=7,int spw=9,int plw=2,bool sa=true,bool smo=false);// 变量默认初始化函数
72 | void widgetPosInit(int x=0,int y=0,int w=minSizeWH,int h=minSizeWH); // 窗体位置信息默认初始化函数
73 | void paintInit(); // 图形绘制信息默认初始化
74 | void pointInit(); // 大小点和控制点默认初始化
75 | void textInit(); // 文字内容默认初始化
76 | void colorInit(); // 颜色默认初始化
77 |
78 | static void updatePaddingInfo(); // 更新Padding信息
79 | void updateWidgetPosInof(); // 更新Widget位置信息
80 | virtual void specialWidgetUpdate(int &x,int &y, int &w, int &h){} // 特殊图形边界范围更新函数
81 | void updatePaintInfo(); // 更新绘图范围信息
82 | virtual void specialPaintUpdate(QPoint &s, QPoint &e){} // 特殊绘图边界范围设置函数
83 | virtual void updateSizePointInfo(); // 更新大小点位置信息
84 | virtual void updateMagPointInfo(); // 更新磁力点的位置信息
85 | void adjustPointInfo(); // 调整磁力点和大小点的位置信息
86 | void updateSizePointPath(); // 更新大小点绘制范围信息
87 | void updateMagPointPath(); // 更新磁力点的绘制范围信息
88 | virtual void updateMagPointLine(); // 更新磁力点上连线的位置信息
89 | void updateTextInfo(); // 更新显示文本的信息
90 |
91 |
92 | virtual void paintChart(QPainter & p) = 0; // 绘制图形
93 | void paintSizePoint(QPainter & p); // 绘制大小点
94 | virtual void paintSizeEdge(QPainter & p); // 绘制大小边界
95 | void paintMagPoint(QPainter & p); // 绘制磁力点
96 |
97 | bool inPath(const QPointF &p); // 是否可选的图形范围内,调用了下方3个函数
98 | virtual bool inGraphisPath(const QPointF &p) {if(graphPath)return graphPath->contains(p);else return false;}// 是否在图形范围内
99 | bool inMagPath(const QPointF &p, ORIENTION &b, int &index) const; // 是否在磁力点范围内
100 | bool inSizePath(const QPointF &p, ORIENTION &b) const; // 是否在大小点范围内
101 |
102 |
103 |
104 | void setStartPos(int x,int y);
105 | void setEndPos(int x,int y);
106 |
107 |
108 |
109 |
110 | protected:
111 | class TextBase {
112 | public:
113 | TextBase(bool tt = true):textType(tt),textType1(nullptr),tmpEdit1(nullptr){
114 |
115 | }
116 | ~TextBase(){
117 | if(textType1){
118 | delete textType1;
119 | textType1 = nullptr;
120 | }
121 | if(tmpEdit1){
122 | delete tmpEdit1;
123 | tmpEdit1 = nullptr;
124 | }
125 | }
126 | bool textType = 1; // 指示使用0富文本还是1简单文本
127 | QPoint chartTextMousePos; // 保存文字移动时点击的位置
128 | union{// 图形显示的文字控件
129 | Chart_Label *textType1 = nullptr;
130 | Chart_PlainText *textType2;
131 | };
132 | union{// 图形编辑时文字输入控件
133 | QLineEdit *tmpEdit1 = nullptr;
134 | QPlainTextEdit *tmpEdit2;
135 | };
136 | union{// 鼠标移动标识符
137 | CHART_LABEL_MOUSE_TYPE textMouseT1 = CHART_LABEL_MOUSE_TYPE::NONE;
138 | CHART_TEXT_MOUSE_TYPE textMouseT2;
139 | };
140 | friend QDataStream &operator<<(QDataStream &fout, const TextBase &tb)
141 | {
142 | fout.writeRawData(reinterpret_cast(&tb.textType),sizeof(bool));
143 | if(tb.textType)
144 | {
145 | QLabel * ql = tb.textType1;
146 | fout<geometry()<text().toUtf8().length();
147 | fout.writeRawData(ql->text().toUtf8().data(),ql->text().toUtf8().length());
148 | //fout.writeRawData(reinterpret_cast(tb.tmpEdit1),sizeof(QLineEdit));
149 | }else{
150 | QPlainTextEdit * qpte = tb.textType2;
151 | fout<geometry()<toPlainText().toUtf8().length();
152 | fout.writeRawData(qpte->toPlainText().toUtf8().data(),qpte->toPlainText().toUtf8().length());
153 | //fout.writeRawData(reinterpret_cast(tb.tmpEdit2),sizeof(QPlainTextEdit));
154 | }
155 | return fout;
156 | }
157 | friend QDataStream &operator>>(QDataStream &fin, TextBase &tb)
158 | {
159 | fin.readRawData(reinterpret_cast(&tb.textType),sizeof(bool));
160 | QRect tmpqr;
161 | fin>>tmpqr;
162 | if(tb.textType)
163 | {
164 | QLabel * ql = tb.textType1;
165 | ql->setGeometry(tmpqr);
166 | int len;
167 | fin>>len;
168 | QByteArray tmp(len+1,'\0');
169 | fin.readRawData(tmp.data(),len);
170 | ql->setText(QString(tmp));
171 | //fin.readRawData(reinterpret_cast(tb.tmpEdit1),sizeof(QLineEdit));
172 | }else{
173 | QPlainTextEdit * qpte = tb.textType2;
174 | qpte->setGeometry(tmpqr);
175 | int len;
176 | fin>>len;
177 | QByteArray tmp(len+1,'\0');
178 | fin.readRawData(tmp.data(),len);
179 | qpte->setPlainText(QString(tmp));
180 | //fin.readRawData(reinterpret_cast(tb.tmpEdit2),sizeof(QPlainTextEdit));
181 | }
182 | return fin;
183 | }
184 | }chartText; // 文本控件
185 |
186 | class i_pointbase // 点基本信息
187 | {
188 | public:
189 | QPoint *i_pos = nullptr; // 点位置
190 | QPainterPath *i_path = nullptr; // 点范围
191 | ORIENTION rotate = ORIENTION::NONE; // 点方向
192 |
193 | i_pointbase():i_pos(nullptr),i_path(nullptr),rotate(ORIENTION::NONE){
194 |
195 | }
196 | ~i_pointbase(){
197 | if(i_pos){
198 | delete i_pos;
199 | i_pos = nullptr;
200 | }
201 | if(i_path){
202 | delete i_path;
203 | i_path = nullptr;
204 | }
205 | }
206 |
207 | void setX(int x){i_pos->setX(x);}
208 | void setY(int y){i_pos->setY(y);}
209 | int getX() const{return i_pos->rx();}
210 | int getY() const{return i_pos->ry();}
211 | void setRotate(ORIENTION r){rotate = r;}
212 | const ORIENTION & getRotate()const {return rotate;}
213 | void setPath(const QPainterPath& p){if(i_path) delete i_path;i_path = new QPainterPath(p);}
214 | QPainterPath* newPath(){if(i_path) delete i_path;i_path = new QPainterPath;return i_path;}
215 | QPainterPath* getPath() const{return i_path;}
216 | bool inPath(const QPointF a){ return i_path->contains(a);}
217 |
218 |
219 | };
220 | class i_magpointbase : public i_pointbase // 磁力点信息类结构基础
221 | {
222 | public:
223 | std::vector i_lineStart; // 每个磁力点连接的线的指针容器
224 | std::vector i_lineEnd; // 每个磁力点连接的线的指针容器
225 | i_magpointbase() :i_pointbase(){
226 |
227 | }
228 | ~i_magpointbase(){
229 | // i_line只存储不创建该类指针,因此不能执行析构
230 | }
231 | };
232 |
233 |
234 |
235 | class i_sizepoint{ // 大小点信息类结构
236 | public:
237 | std::vector i_point; // 大小点指针容器
238 |
239 | explicit i_sizepoint(int c=0):i_point(c){}
240 | ~i_sizepoint()
241 | {
242 | for(auto it = i_point.begin();it!=i_point.end();it++) {
243 | if(*it) delete *it;
244 | *it = nullptr;
245 | }
246 | }
247 | };
248 |
249 |
250 | class i_magpoint{ // 磁力点信息类结构
251 | public:
252 | std::vector i_point; // 磁力点指针容器
253 |
254 | explicit i_magpoint(int c=0):i_point(c){}
255 | ~i_magpoint()
256 | {
257 | for(auto it = i_point.begin();it!=i_point.end();it++) {
258 | if(*it) delete *it;
259 | *it = nullptr;
260 | }
261 | }
262 | };
263 |
264 | i_magpoint magPoint; // 磁力点信息
265 | i_sizepoint sizePoint; // 大小点信息
266 |
267 | QPainterPath *graphPath = nullptr; // 图形绘制范围
268 |
269 | QPoint paintStart; // 图形绘制范围起点
270 | QPoint paintEnd; // 图形绘制范围终点
271 | QPoint widgetStart; // widget在画布上的起始位置:易变
272 | QPoint widgetEnd; // widget在画布上的结束位置:易变
273 |
274 | QPen paintChartDrawPen; // 图形画笔
275 | QBrush paintChartFillPen; // 图形填充
276 |
277 | static QPen paintDrawPen; // 图形大小点、磁力点画笔
278 | static QBrush paintFillPen; // 图形大小点、磁力点填充
279 |
280 | bool movable = true; // 图形位置可改变
281 |
282 |
283 |
284 |
285 |
286 | public:
287 |
288 | //explicit Chart_Base(QWidget *parent = nullptr, PaintChartType type = PaintChartType::NONE);
289 | explicit Chart_Base(QWidget *parent = nullptr, PaintChartType type = PaintChartType::NONE, bool textType = false, bool mov = true, int mpc=4, int spc=4);
290 | Chart_Base( int x, int y, int w, int h, QWidget *parent = nullptr, PaintChartType type = PaintChartType::NONE);
291 | explicit Chart_Base(Chart_Base &);
292 | virtual ~Chart_Base()
293 | {
294 | if(graphPath)
295 | {
296 | delete graphPath;
297 | graphPath = nullptr;
298 | }
299 | }
300 |
301 |
302 | public:
303 | // void setGeometryNew(int x,int y,int w, int h); // 设置位置、大小、更新数据
304 | void setXY(int x, int y); // 设置位置
305 | //void setTextXY(int x, int y);
306 | void setWidthHeight(int x, int y); // 设置大小、更新数据,用于创建时
307 | void setWidthHeight(int x, int y, ORIENTION type); // 设置大小、更新数据,用于创建好之后
308 | void applyWidthHeight(); // 更新数据,用于读取时
309 | bool autoSetMagi(int &x, int &y, int &index); // 磁力点吸附函数
310 | int getMagiPointAbsX(int i){;return magPoint.i_point[i]->getX() + x();} // 获取磁力点绝对坐标
311 | int getMagiPointAbsY(int i){;return magPoint.i_point[i]->getY() + y();} // 获取磁力点相对坐标
312 | void addMagiPointStartLine(int i,Chart_Base *cb){magPoint.i_point[i]->i_lineStart.push_back(cb);} // 增加连线到相应的磁力点的起始连线容器
313 | void delMagiPointStartLine(int i,Chart_Base *cb) // 删除磁力点的起始连线容器中相应的连线
314 | {
315 | for(auto it = magPoint.i_point[i]->i_lineStart.begin(),end = magPoint.i_point[i]->i_lineStart.end();it!=end;it++)
316 | {
317 | if((*it) == cb)
318 | {
319 | qDebug()<<"test1"<i_lineStart.size();
320 | magPoint.i_point[i]->i_lineStart.erase(it);
321 | qDebug()<<"test2"<i_lineStart.size();
322 | break;
323 | }
324 | }
325 | }
326 | void addMagiPointEndLine(int i,Chart_Base *cb){magPoint.i_point[i]->i_lineEnd.push_back(cb);} // 增加连线到相应的磁力点的终点连线容器
327 | void delMagiPointEndLine(int i,Chart_Base *cb) // 删除磁力点的终点连线容器中相应的连线
328 | {
329 | for(auto it = magPoint.i_point[i]->i_lineEnd.begin(),end = magPoint.i_point[i]->i_lineEnd.end();it!=end;it++)
330 | {
331 | if((*it) == cb)
332 | {
333 | magPoint.i_point[i]->i_lineEnd.erase(it);
334 | break;
335 | }
336 | }
337 | }
338 | ORIENTION getMagiPointDirect(int i){return magPoint.i_point[i]->getRotate();} // 获取磁力点的索引位置
339 | void overlapChartMousePressed(QMouseEvent *event); // 鼠标点击事件Z-index检测
340 | void overlapChartMouseMove(QMouseEvent *event); // 鼠标移动事件Z-index检测
341 | void setMovalbe(bool f); // 设置可否移动位置
342 | int & getID(void){return ID;} // 获得唯一ID值
343 | // void setSizePoint(const std::vector &p);
344 | // void setMagPoint(const std::vector &p);
345 | void deleteThisChart();
346 |
347 | static void saveStaticValue(QDataStream &fout); // 保存静态数据成员
348 | static void loadStaticValue(QDataStream &fin); // 加载静态数据成员
349 | friend QDataStream &operator<<(QDataStream &fout, const Chart_Base &cb); // 输出运算符重载
350 | friend QDataStream &operator>>(QDataStream &fin, Chart_Base &cb); // 输入运算符重载
351 |
352 | signals:
353 | void sendThisClass(Chart_Base *,int x,int y); // 发送自己给画布
354 | // void hideThisClass();
355 | //void sendFlag(int f);
356 | void setTypeChangeSize(ORIENTION i); // 设置画布中的鼠标状态为改变大小
357 | void setTypeCreateMagPoint(Chart_Base *,ORIENTION d, int i); // 设置画布中的鼠标状态为创建连线
358 |
359 |
360 |
361 | public slots:
362 |
363 | void showMagSize(); // 显示磁力点、大小点
364 | void hideMagSize(); // 隐藏磁力点、大小点
365 | void showMagOnly(); // 显示磁力点
366 | void hideMagOnly(); // 隐藏磁力点
367 | void setTypeChangeTextPos(CHART_LABEL_MOUSE_TYPE t,int x,int y){chartText.textMouseT1 = t;chartText.chartTextMousePos.setX(x);chartText.chartTextMousePos.setY(y);} // 设置文本位置
368 | void setTypeChangeTextPos(CHART_TEXT_MOUSE_TYPE t,int x,int y){chartText.textMouseT2 = t;chartText.chartTextMousePos.setX(x);chartText.chartTextMousePos.setY(y);} // 设置文本位置
369 |
370 |
371 | protected:// 事件
372 | virtual void paintEvent(QPaintEvent *event); // 绘制控件事件
373 |
374 | // bool eventFilter(QObject *target, QEvent *event);
375 | virtual void mousePressEvent(QMouseEvent *event); // 鼠标按下事件
376 | virtual void mouseMoveEvent(QMouseEvent *event); // 鼠标移动事件
377 | virtual void mouseReleaseEvent(QMouseEvent *event); // 鼠标释放事件
378 | virtual void mouseDoubleClickEvent(QMouseEvent *event); // 鼠标双击事件
379 |
380 | virtual void leaveEvent(QEvent *event); // 离开widget事件
381 |
382 |
383 | };
384 |
385 |
386 | #endif // CHART_BASE_H
387 |
388 |
389 |
--------------------------------------------------------------------------------
/FlowChartTools/class_Charts/chart_diamond.cpp:
--------------------------------------------------------------------------------
1 | #include "chart_diamond.h"
2 |
3 | void Chart_Diamond::paintChart(QPainter & p)
4 | {
5 | QPen tmp = p.pen();
6 | p.setPen(paintChartDrawPen);
7 |
8 | int sx = paintStart.rx(),sy = paintStart.ry(),ex = paintEnd.rx(),ey = paintEnd.ry();
9 | int midx = (sx+ex)>>1,midy = (sy+ey)>>1;
10 |
11 | if(graphPath) delete graphPath;
12 | graphPath = new QPainterPath;
13 | graphPath->moveTo(midx,sy);
14 | graphPath->lineTo(ex,midy);
15 | graphPath->lineTo(midx,ey);
16 | graphPath->lineTo(sx,midy);
17 | graphPath->lineTo(midx,sy);
18 |
19 | p.fillPath(*graphPath,paintChartFillPen);
20 | p.drawPath(*graphPath);
21 |
22 | p.setPen(tmp);
23 | }
24 |
--------------------------------------------------------------------------------
/FlowChartTools/class_Charts/chart_diamond.h:
--------------------------------------------------------------------------------
1 | #ifndef CHART_DIAMOND_H
2 | #define CHART_DIAMOND_H
3 | #include "chart_base.h"
4 |
5 | class Chart_Diamond : public Chart_Base
6 | {
7 | private:
8 | virtual void paintChart(QPainter & p);
9 |
10 | public:
11 | Chart_Diamond(QWidget *parent = nullptr, PaintChartType type = PaintChartType::DIAMOND) : Chart_Base(parent,type,false,true){}
12 | Chart_Diamond(Chart_Diamond &cr):Chart_Base(cr){}
13 | Chart_Diamond( int x1, int y1, int x2, int y2, QWidget *parent = nullptr,PaintChartType type = PaintChartType::DIAMOND) : Chart_Base(x1,y1,x2,y2,parent,type){}
14 | ~Chart_Diamond(){}
15 |
16 | };
17 |
18 | #endif // CHART_DIAMOND_H
19 |
--------------------------------------------------------------------------------
/FlowChartTools/class_Charts/chart_ellipse.cpp:
--------------------------------------------------------------------------------
1 | #include "chart_ellipse.h"
2 |
3 | void Chart_Ellipse::paintChart(QPainter & p)
4 | {
5 | QPen tmp = p.pen();
6 | p.setPen(paintChartDrawPen);
7 |
8 | int sx = paintStart.rx(),sy = paintStart.ry(),ex = paintEnd.rx(),ey = paintEnd.ry();
9 |
10 | if(graphPath) delete graphPath;
11 | graphPath = new QPainterPath;
12 | graphPath->addEllipse(sx,sy,ex-sx,ey-sy);
13 |
14 | p.fillPath(*graphPath,paintChartFillPen);
15 | p.drawPath(*graphPath);
16 |
17 | p.setPen(tmp);
18 | }
19 |
--------------------------------------------------------------------------------
/FlowChartTools/class_Charts/chart_ellipse.h:
--------------------------------------------------------------------------------
1 | #ifndef CHART_ROUND_H
2 | #define CHART_ROUND_H
3 | #include "chart_base.h"
4 |
5 | class Chart_Ellipse : public Chart_Base
6 | {
7 | private:
8 | virtual void paintChart(QPainter & p);
9 |
10 | public:
11 | Chart_Ellipse(QWidget *parent = nullptr, PaintChartType type = PaintChartType::ELLIPSE) : Chart_Base(parent,type,false,true){}
12 | Chart_Ellipse(Chart_Ellipse &cr):Chart_Base(cr){}
13 | Chart_Ellipse( int x1, int y1, int x2, int y2, QWidget *parent = nullptr,PaintChartType type = PaintChartType::ELLIPSE) : Chart_Base(x1,y1,x2,y2,parent,type){}
14 | ~Chart_Ellipse(){}
15 | };
16 |
17 | #endif // CHART_ROUND_H
18 |
--------------------------------------------------------------------------------
/FlowChartTools/class_Charts/chart_label.cpp:
--------------------------------------------------------------------------------
1 | #include "chart_label.h"
2 |
3 | void Chart_Label::changeText()
4 | {
5 | }
6 | void Chart_Label::createText()
7 | {
8 | }
9 | void Chart_Label::mousePressEvent(QMouseEvent *event)
10 | {
11 | setFrameShape(QFrame::Panel);
12 | adjustSize();
13 | //emit setTypeChangeTextPos(CHART_LABEL_MOUSE_TYPE::CHANGE_POS,event->pos().rx(),event->pos().ry());
14 | //event->ignore();
15 | }
16 | void Chart_Label::mouseDoubleClickEvent(QMouseEvent *event)
17 | {
18 | changeText();
19 | qDebug()<<"999";
20 | event->ignore();
21 | }
22 | void Chart_Label::mouseMoveEvent(QMouseEvent *event)
23 | {
24 | event->ignore();
25 | }
26 | void Chart_Label::mouseReleaseEvent(QMouseEvent *event)
27 | {
28 | setFrameShape(QFrame::NoFrame);
29 | event->ignore();
30 | }
31 |
--------------------------------------------------------------------------------
/FlowChartTools/class_Charts/chart_label.h:
--------------------------------------------------------------------------------
1 | #ifndef CHART_LABEL_H
2 | #define CHART_LABEL_H
3 | #include
4 | #include
5 | #include
6 | #include
7 | #include
8 | enum class CHART_LABEL_MOUSE_TYPE{NONE,CHANGE_POS};
9 |
10 | class Chart_Label : public QLabel
11 | {
12 | Q_OBJECT
13 | private:
14 | //Chart_Base &parent;
15 | public:
16 | Chart_Label(QWidget *parent = nullptr):QLabel(parent){}
17 | virtual ~Chart_Label(){}
18 | void createText();
19 | void changeText();
20 |
21 | signals:
22 | void setTypeChangeTextPos(CHART_LABEL_MOUSE_TYPE t,int x,int y); // 设置位置
23 |
24 | protected:
25 | virtual void mousePressEvent(QMouseEvent *event);
26 | virtual void mouseDoubleClickEvent(QMouseEvent *event);
27 | virtual void mouseMoveEvent(QMouseEvent *event);
28 | virtual void mouseReleaseEvent(QMouseEvent *event);
29 |
30 | };
31 |
32 | #endif // CHART_LABEL_H
33 |
--------------------------------------------------------------------------------
/FlowChartTools/class_Charts/chart_line.h:
--------------------------------------------------------------------------------
1 | #ifndef CHART_LINE_H
2 | #define CHART_LINE_H
3 | #include "chart_base.h"
4 | #include
5 | const static double sin45Val = 0.707106781;
6 | const static double cos45Val = 0.707106781;
7 | const static double sin75Val = 0.9659258262890;
8 | const static double cos75Val = 0.25881904510;
9 | const static double sin15Val = 0.2588190;
10 | const static double cos15Val = 0.965925826;
11 |
12 | class Chart_Line : public Chart_Base
13 | {
14 | private:
15 |
16 | const static int containsWidth = 20; // 可选范围长度
17 | const static int containsWidth1_2 = containsWidth>>1; // 可选范围一般长度
18 | const static int extendWidth = 30; // 边界线段延伸长度
19 | const static int arrayLength = 18; // 线头绘制范围 - 长度
20 | const static int arrayWidth = 9; // 线头绘制范围 - 宽度
21 | const static int arrayLineHeadLenM2 = arrayLength * arrayLength + arrayWidth * arrayWidth;
22 | static double extendWidth45;
23 | static double arrayLength45;
24 | static double arrayLength75;
25 | static double arrayWidth75;
26 | static double arrayLength15;
27 | static double arrayWidth15;
28 |
29 |
30 | virtual void paintChart(QPainter & p);
31 | virtual void paintSizeEdge(QPainter & p){}
32 | virtual void updateMagPointInfo();
33 | virtual void updateSizePointInfo();
34 | virtual void updateMagPointLine(){}
35 | virtual void specialWidgetUpdate(int &x,int &y, int &w, int &h);
36 | virtual void specialPaintUpdate(QPoint &s, QPoint &e);
37 |
38 | #define OPTIMIZATION 0 // 类型优化,减少switch语句,1开启*9/
39 | #if (OPTIMIZATION == 1)
40 | void angle0(QPainterPath &linePath, int &sx,int &sy, int &ex, int &ey);
41 | void anglePos90(QPainterPath &linePath, int &sx,int &sy, int &ex, int &ey);
42 | void angleNeg90(QPainterPath &linePath, int &sx,int &sy, int &ex, int &ey);
43 | void angle1EastWest(QPainterPath &linePath, int &sx,int &sy, int &ex, int &ey);
44 | void angle1SouthNorth(QPainterPath &linePath, int &sx,int &sy, int &ex, int &ey);
45 | #endif
46 | QPoint startPos; // 开始坐标
47 | QPoint endPos; // 结束坐标
48 |
49 | ORIENTION startDirect = ORIENTION::STARTPOINT; // 开始点方向
50 | ORIENTION endDirect = ORIENTION::ENDPOINT; // 结束点方向
51 | int startMagIndex = 0; // 起始点索引值
52 | int endMagIndex = 0; // 结束点索引值
53 | Chart_Base *startChartMag = nullptr; // 起始图形
54 | Chart_Base *endChartMag = nullptr; // 终止图形
55 | LINE_HEAD_TYPE startLineHeadType = LINE_HEAD_TYPE::ARROW0; // 起始点线头方向
56 | LINE_HEAD_TYPE endLineHeadType = LINE_HEAD_TYPE::ARROW1; // 结束点线头方向
57 |
58 | void drawLineHead(const ORIENTION o,const LINE_HEAD_TYPE lht,const int x,const int y,QPainter & p,QPainterPath &linePath, QPainterPath &graphPath); // 绘制线头
59 | void drawStraightLine(int sx, int sy, int ex, int ey,QPainterPath &linePath, QPainterPath &graphPath); // 直连线绘制
60 |
61 | public:
62 | Chart_Line(QWidget *parent = nullptr, PaintChartType type = PaintChartType::LINE) : Chart_Base(parent,type,true,false,0,2)
63 | {
64 | extendWidth45 = extendWidth * sin45Val;
65 | arrayLength45 = arrayLength * sin45Val;
66 | #if 1
67 | double tmpRad45AddX = qDegreesToRadians(45.0) + qAtan(double(arrayWidth)/arrayLength);
68 | double tmpRad45SubX = qDegreesToRadians(45.0) - qAtan(double(arrayWidth)/arrayLength);
69 | double arrayLineHeadLen = sqrt(arrayLineHeadLenM2);
70 | arrayLength75 = arrayLineHeadLen * qCos(tmpRad45AddX);
71 | arrayWidth75 = arrayLineHeadLen * qSin(tmpRad45AddX);
72 | arrayLength15 = arrayLineHeadLen * qCos(tmpRad45SubX);
73 | arrayWidth15 = arrayLineHeadLen * qSin(tmpRad45SubX);
74 | qDebug()<setAttribute(Qt::WA_StyledBackground,true);
82 | chartText.textType1->setAutoFillBackground(true);
83 | chartText.textType1->setPalette(QPalette(QPalette::Background, QColor(255,255,255,150)));
84 | chartText.textType1->setStyleSheet("QLabel{background:#00FF00;}");
85 |
86 | }
87 | Chart_Line( int x1, int y1, int x2, int y2, QWidget *parent = nullptr,PaintChartType type = PaintChartType::LINE) : Chart_Base(x1,y1,x2,y2,parent,type)
88 | {
89 | chartText.textType1->setAttribute(Qt::WA_StyledBackground,true);
90 | chartText.textType1->setAutoFillBackground(true);
91 | chartText.textType1->setPalette(QPalette(QPalette::Background, QColor(255,255,255,150)));
92 | chartText.textType1->setStyleSheet("QLabel{background:#00FF00;}");
93 | }
94 | ~Chart_Line(){}
95 |
96 | void setStartChart(Chart_Base* cb){startChartMag = cb;} // 设置起点指向的图形
97 | void resetStartChart() // 重置起点指向的图形
98 | {
99 | if(startChartMag)
100 | {
101 | startChartMag->delMagiPointStartLine(startMagIndex,this);
102 | }
103 | startChartMag = nullptr;
104 | }
105 | Chart_Base *getStartChart(){return startChartMag;} // 获取起点指向的图形
106 | void setEndChart(Chart_Base* cb){endChartMag = cb;} // 设置终点指向的图形
107 | void resetEndChart() // 重置终点指向的图形
108 | {
109 | if(endChartMag)
110 | {
111 | endChartMag->delMagiPointEndLine(endMagIndex,this);
112 | }
113 | endChartMag = nullptr;
114 | }
115 | Chart_Base *getEndChart(){return endChartMag;} // 获取终点指向的图形
116 |
117 | LINE_HEAD_TYPE & getStartLineHeadType(){return startLineHeadType;} // 获取起点线头类型
118 | void setStartLineHeadType(LINE_HEAD_TYPE l){startLineHeadType = l;update();} // 设置起点线头类型
119 | LINE_HEAD_TYPE & getEndLineHeadType(){return endLineHeadType;} // 获取终点线头类型
120 | void setEndLineHeadType(LINE_HEAD_TYPE l){endLineHeadType = l;update();} // 设置终点线头类型
121 |
122 | void setStartMagIndex(int i){startMagIndex = i;} // 设置起点指向的图形的磁力点索引
123 | int getStartMagIndex(){return startMagIndex;} // 获取起点指向的图形的磁力点索引
124 | void setEndMagIndex(int i){endMagIndex = i;} // 设置终点指向的图形的磁力点索引
125 | int getEndMagIndex(){return endMagIndex;} // 获取终点指向的图形的磁力点索引
126 |
127 | void setStartDirect(ORIENTION direct){startDirect = direct;} // 设置连线起点的朝向
128 | void resetStartDirect(){startDirect = ORIENTION::NONE;} // 重置连线起点的朝向
129 | void setEndDirect(ORIENTION direct){endDirect = direct;} // 设置连线终点的朝向
130 | void resetEndDirect(){endDirect = ORIENTION::NONE;} // 重置连线终点的朝向
131 |
132 |
133 |
134 | friend QDataStream &operator<<(QDataStream &fout, const Chart_Line &cl); // 重载输出运算符
135 | friend QDataStream &operator>>(QDataStream &fin, Chart_Line &cl); // 重载输入运算符
136 |
137 | signals:
138 | void sendLineStyle(QPen &qp, QBrush &qb, LINE_HEAD_TYPE &startLineHeadType, LINE_HEAD_TYPE &endLineHeadType); // 发送连线信息
139 | };
140 |
141 | #endif // CHART_LINE_H
142 |
--------------------------------------------------------------------------------
/FlowChartTools/class_Charts/chart_plaintext.cpp:
--------------------------------------------------------------------------------
1 | #include "chart_plaintext.h"
2 |
3 |
4 | void Chart_PlainText::changeText()
5 | {
6 | }
7 | void Chart_PlainText::createText()
8 | {
9 | }
10 | void Chart_PlainText::mousePressEvent(QMouseEvent *event)
11 | {
12 | setFrameShape(QFrame::Panel);
13 | adjustSize();
14 | emit setTypeChangeTextPos(CHART_TEXT_MOUSE_TYPE::CHANGE_POS,event->pos().rx(),event->pos().ry());
15 | //event->ignore();
16 | }
17 | void Chart_PlainText::mouseDoubleClickEvent(QMouseEvent *event)
18 | {
19 | changeText();
20 | qDebug()<<"999";
21 | event->ignore();
22 | }
23 | void Chart_PlainText::mouseMoveEvent(QMouseEvent *event)
24 | {
25 | event->ignore();
26 | }
27 | void Chart_PlainText::mouseReleaseEvent(QMouseEvent *event)
28 | {
29 | setFrameShape(QFrame::NoFrame);
30 | event->ignore();
31 | }
32 |
--------------------------------------------------------------------------------
/FlowChartTools/class_Charts/chart_plaintext.h:
--------------------------------------------------------------------------------
1 | #ifndef CHART_PLAINTEXT_H
2 | #define CHART_PLAINTEXT_H
3 | #include
4 | #include
5 | #include
6 | #include
7 |
8 | enum class CHART_TEXT_MOUSE_TYPE{NONE,CHANGE_POS};
9 |
10 | class Chart_PlainText : public QPlainTextEdit
11 | {
12 | Q_OBJECT
13 | private:
14 | //Chart_Base &parent;
15 | public:
16 | Chart_PlainText(QWidget *parent = nullptr):QPlainTextEdit(parent){}
17 | virtual ~Chart_PlainText(){}
18 | void createText();
19 | void changeText();
20 |
21 | signals:
22 | void setTypeChangeTextPos(CHART_TEXT_MOUSE_TYPE t,int x,int y);
23 | protected:
24 | virtual void mousePressEvent(QMouseEvent *event);
25 | virtual void mouseDoubleClickEvent(QMouseEvent *event);
26 | virtual void mouseMoveEvent(QMouseEvent *event);
27 | virtual void mouseReleaseEvent(QMouseEvent *event);
28 |
29 | };
30 |
31 | #endif // CHART_PLAINTEXT_H
32 |
--------------------------------------------------------------------------------
/FlowChartTools/class_Charts/chart_rect.cpp:
--------------------------------------------------------------------------------
1 | #include "chart_rect.h"
2 |
3 |
4 | void Chart_Rect::paintChart(QPainter & p)
5 | {
6 | QPen tmp = p.pen();
7 | p.setPen(paintChartDrawPen);
8 |
9 | int sx = paintStart.rx(),sy = paintStart.ry(),ex = paintEnd.rx(),ey = paintEnd.ry();
10 |
11 | if(graphPath) delete graphPath;
12 | graphPath = new QPainterPath;
13 | graphPath->addRect(sx,sy,ex-sx,ey-sy);
14 |
15 | p.fillPath(*graphPath,paintChartFillPen);
16 | p.drawPath(*graphPath);
17 |
18 | p.setPen(tmp);
19 | }
20 |
21 | void Chart_Rect::updateMagPointInfo()
22 | {
23 | int x1 = paintStart.rx(),y1 = paintStart.ry();
24 | int x2 = paintEnd.rx(),y2 = paintEnd.ry();
25 | int midx = ((paintStart.rx() + paintEnd.rx())>>1);
26 | int midy = ((paintStart.ry() + paintEnd.ry())>>1);
27 |
28 | magPoint.i_point[0]->setX(x1);
29 | magPoint.i_point[0]->setY(y1);
30 | magPoint.i_point[0]->setRotate(ORIENTION::NORTHWEST);
31 | magPoint.i_point[1]->setX(midx);
32 | magPoint.i_point[1]->setY(y1);
33 | magPoint.i_point[1]->setRotate(ORIENTION::NORTH);
34 | magPoint.i_point[2]->setX(x2);
35 | magPoint.i_point[2]->setY(y1);
36 | magPoint.i_point[2]->setRotate(ORIENTION::NORTHEAST);
37 | magPoint.i_point[3]->setX(x2);
38 | magPoint.i_point[3]->setY(midy);
39 | magPoint.i_point[3]->setRotate(ORIENTION::EAST);
40 | magPoint.i_point[4]->setX(x2);
41 | magPoint.i_point[4]->setY(y2);
42 | magPoint.i_point[4]->setRotate(ORIENTION::SOUTHEAST);
43 | magPoint.i_point[5]->setX(midx);
44 | magPoint.i_point[5]->setY(y2);
45 | magPoint.i_point[5]->setRotate(ORIENTION::SOUTH);
46 | magPoint.i_point[6]->setX(x1);
47 | magPoint.i_point[6]->setY(y2);
48 | magPoint.i_point[6]->setRotate(ORIENTION::SOUTHWEST);
49 | magPoint.i_point[7]->setX(x1);
50 | magPoint.i_point[7]->setY(midy);
51 | magPoint.i_point[7]->setRotate(ORIENTION::WEST);
52 |
53 | }
54 |
--------------------------------------------------------------------------------
/FlowChartTools/class_Charts/chart_rect.h:
--------------------------------------------------------------------------------
1 | #ifndef CHART_RECT_H
2 | #define CHART_RECT_H
3 | #include "chart_base.h"
4 |
5 | class Chart_Rect : public Chart_Base
6 | {
7 | private:
8 | virtual void paintChart(QPainter & p);
9 | virtual void updateMagPointInfo();
10 |
11 | public:
12 | Chart_Rect(QWidget *parent = nullptr, PaintChartType type = PaintChartType::RECT) : Chart_Base(parent,type,false,true,8){}
13 | Chart_Rect(Chart_Rect &cr):Chart_Base(cr){}
14 | Chart_Rect( int x1, int y1, int x2, int y2, QWidget *parent = nullptr,PaintChartType type = PaintChartType::RECT) : Chart_Base(x1,y1,x2,y2,parent,type){}
15 | ~Chart_Rect(){}
16 |
17 |
18 | };
19 |
20 | #endif // CHART_RECT_H
21 |
--------------------------------------------------------------------------------
/FlowChartTools/class_Charts/chart_roundrect.cpp:
--------------------------------------------------------------------------------
1 | #include "chart_roundrect.h"
2 |
3 | void Chart_RoundRect::paintChart(QPainter & p)
4 | {
5 | QPen tmp = p.pen();
6 | p.setPen(paintChartDrawPen);
7 |
8 | int sx = paintStart.rx(),sy = paintStart.ry(),ex = paintEnd.rx(),ey = paintEnd.ry();
9 |
10 | if(graphPath) delete graphPath;
11 | graphPath = new QPainterPath;
12 | graphPath->addRoundedRect(sx,sy,ex-sx,ey-sy,20,20);
13 |
14 | p.fillPath(*graphPath,paintChartFillPen);
15 | p.drawPath(*graphPath);
16 |
17 | p.setPen(tmp);
18 | }
19 |
--------------------------------------------------------------------------------
/FlowChartTools/class_Charts/chart_roundrect.h:
--------------------------------------------------------------------------------
1 | #ifndef CHART_ROUNDRECT_H
2 | #define CHART_ROUNDRECT_H
3 | #include "chart_base.h"
4 |
5 | class Chart_RoundRect : public Chart_Base
6 | {
7 | private:
8 | virtual void paintChart(QPainter & p);
9 |
10 | public:
11 | Chart_RoundRect(QWidget *parent = nullptr, PaintChartType type = PaintChartType::ROUNDRECT) : Chart_Base(parent,type,false,true){}
12 | Chart_RoundRect(Chart_RoundRect &cr):Chart_Base(cr){}
13 | Chart_RoundRect( int x1, int y1, int x2, int y2, QWidget *parent = nullptr,PaintChartType type = PaintChartType::ROUNDRECT) : Chart_Base(x1,y1,x2,y2,parent,type){}
14 | ~Chart_RoundRect(){}
15 | };
16 |
17 | #endif // CHART_ROUNDRECT_H
18 |
--------------------------------------------------------------------------------
/FlowChartTools/class_Charts/chart_trapezoid.cpp:
--------------------------------------------------------------------------------
1 | #include "chart_trapezoid.h"
2 |
3 |
4 | void Chart_Trapezoid::paintChart(QPainter & p)
5 | {
6 | QPen tmp = p.pen();
7 | p.setPen(paintChartDrawPen);
8 |
9 | int sx = paintStart.rx(),sy = paintStart.ry(),ex = paintEnd.rx(),ey = paintEnd.ry();
10 |
11 | if(graphPath) delete graphPath;
12 | graphPath = new QPainterPath;
13 | //graphPath->addRect(sx,sy,ex-sx,ey-sy);
14 | //graphPath->addRoundedRect(sx,sy,ex,ey,20,20);
15 | graphPath->moveTo(sx+((ex - sx)>>2),sy);
16 | graphPath->lineTo(ex-((ex - sx)>>2),sy);
17 | graphPath->lineTo(ex,ey);
18 | graphPath->lineTo(sx,ey);
19 | graphPath->lineTo(sx+((ex - sx)>>2),sy);
20 |
21 | p.fillPath(*graphPath,paintChartFillPen);
22 | p.drawPath(*graphPath);
23 |
24 | p.setPen(tmp);
25 | }
26 |
27 | void Chart_Trapezoid::updateMagPointInfo()
28 | {
29 | int x1 = paintStart.rx(),y1 = paintStart.ry();
30 | int x2 = paintEnd.rx(),y2 = paintEnd.ry();
31 | int midx = ((paintStart.rx() + paintEnd.rx())>>1);
32 | int midy = ((paintStart.ry() + paintEnd.ry())>>1);
33 | int ext = (x2-x1)>>2;
34 |
35 | magPoint.i_point[0]->setX(x1 + ext);
36 | magPoint.i_point[0]->setY(y1);
37 | magPoint.i_point[0]->setRotate(ORIENTION::NORTHWEST);
38 | magPoint.i_point[1]->setX(midx);
39 | magPoint.i_point[1]->setY(y1);
40 | magPoint.i_point[1]->setRotate(ORIENTION::NORTH);
41 | magPoint.i_point[2]->setX(x2 - ext);
42 | magPoint.i_point[2]->setY(y1);
43 | magPoint.i_point[2]->setRotate(ORIENTION::NORTHEAST);
44 | magPoint.i_point[3]->setX((x2 + x2 -ext)>>1);
45 | magPoint.i_point[3]->setY(midy);
46 | magPoint.i_point[3]->setRotate(ORIENTION::EAST);
47 | magPoint.i_point[4]->setX(x2);
48 | magPoint.i_point[4]->setY(y2);
49 | magPoint.i_point[4]->setRotate(ORIENTION::SOUTHEAST);
50 | magPoint.i_point[5]->setX(midx);
51 | magPoint.i_point[5]->setY(y2);
52 | magPoint.i_point[5]->setRotate(ORIENTION::SOUTH);
53 | magPoint.i_point[6]->setX(x1);
54 | magPoint.i_point[6]->setY(y2);
55 | magPoint.i_point[6]->setRotate(ORIENTION::SOUTHWEST);
56 | magPoint.i_point[7]->setX((x1 + x1 + ext)>>1);
57 | magPoint.i_point[7]->setY(midy);
58 | magPoint.i_point[7]->setRotate(ORIENTION::WEST);
59 |
60 | }
61 |
--------------------------------------------------------------------------------
/FlowChartTools/class_Charts/chart_trapezoid.h:
--------------------------------------------------------------------------------
1 | #ifndef CHART_TRAPEZOID_H
2 | #define CHART_TRAPEZOID_H
3 | #include "chart_base.h"
4 |
5 | class Chart_Trapezoid : public Chart_Base
6 | {
7 | private:
8 | virtual void paintChart(QPainter & p);
9 | virtual void updateMagPointInfo();
10 |
11 | public:
12 | Chart_Trapezoid(QWidget *parent = nullptr, PaintChartType type = PaintChartType::TRAPEZOID) : Chart_Base(parent,type,false,true,8){}
13 | Chart_Trapezoid(Chart_Trapezoid &cr):Chart_Base(cr){}
14 | Chart_Trapezoid( int x1, int y1, int x2, int y2, QWidget *parent = nullptr,PaintChartType type = PaintChartType::RECT) : Chart_Base(x1,y1,x2,y2,parent,type){}
15 | ~Chart_Trapezoid(){}
16 | };
17 |
18 | #endif // CHART_TRAPEZOID_H
19 |
--------------------------------------------------------------------------------
/FlowChartTools/comdef.h:
--------------------------------------------------------------------------------
1 | #ifndef COMDEF_H
2 | #define COMDEF_H
3 | // 鼠标状态常量 无 创建时改变大小 运行时改变大小 运行时创建连线 运行时改变位置
4 | enum class MOUSE_EVENT_TYPE {NONE,/*RUNTIME_SELECT,*/CREATING_CNANGE_SIZE,RUNTIME_CHANGE_SIZE,RUNTIME_CREATE_MAGPOINT,RUNTIME_CHANGE_POS,} ;
5 | //enum class CREATING_CNANGE_SIZE_TYPE{DEFAULTPOINT = 0x7,POINT1 = 0x0,POINT2 = 0x1,POINT3 = 0x2,POINT4 = 0x3,};
6 | //enum class RUNTIME_CHANGE_SIZE_TYPE{DEFAULTPOINT = 0x7,POINT1 = 0x0,POINT2 = 0x1,POINT3 = 0x2,POINT4 = 0x3,};
7 | // 方向常量 无 西北 北 东北 东 东南 南 西南 西 起点方向随意点 终点方向随意点
8 | enum class ORIENTION{NONE = 0,NORTHWEST = 1,NORTH,NORTHEAST,EAST,SOUTHEAST,SOUTH,SOUTHWEST,WEST,STARTPOINT = 9,ENDPOINT = 10,};
9 | // 箭头类型 0默认无 1箭头 2实心三角箭头 3空心三角箭头
10 | enum class LINE_HEAD_TYPE{ARROW0 = 0,ARROW1,ARROW2,ARROW3};
11 | // 图形类型 无 矩形 菱形 圆角矩形 圆形 线性 梯形
12 | enum class PaintChartType{NONE,RECT,DIAMOND,ROUNDRECT,ELLIPSE,LINE,TRAPEZOID};
13 |
14 | #endif // COMDEF_H
15 |
--------------------------------------------------------------------------------
/FlowChartTools/flowchart.cpp:
--------------------------------------------------------------------------------
1 | #include "flowchart.h"
2 |
3 |
4 | FlowChart::FlowChart(QWidget *parent, Qt::WindowFlags f) : QWidget(parent,f)
5 | {
6 | this->grabKeyboard();
7 | // installEventFilter(this);
8 | initVar();
9 | setMouseTracking(true);
10 | update();
11 | }
12 |
13 | void FlowChart::initVar()
14 | {
15 | mouseEventType = MOUSE_EVENT_TYPE::NONE;
16 | curPaintChart = nullptr;
17 | curSelecChart = nullptr;
18 | newLineChart = nullptr;
19 | newLineFromSelectChart = nullptr;
20 | newLineToSelectChart = nullptr;
21 | }
22 |
23 | void FlowChart::resetFlowChartPanel()
24 | {
25 | Chart_Base::resetStaticVal();
26 | curPaintChart = nullptr;
27 | curPaintChartType = PaintChartType::NONE;
28 | curSelecChart = nullptr;
29 | curSelecChartPos = QPoint();
30 | newLineChart = nullptr;
31 | newLineToSelectChart = nullptr;
32 | newLineFromSelectChart = nullptr;
33 | magPointDirect = ORIENTION::NONE;
34 | magPointFromIndex = 0;
35 | magPointToIndex = 0;
36 | sizePointDirect = ORIENTION::NONE;
37 | clearChartsLine();
38 | charts.reserve(0);
39 | charts.resize(0);
40 | line.reserve(0);
41 | line.resize(0);
42 | mouseEventType = MOUSE_EVENT_TYPE::NONE;
43 | fileIsOpened = false;
44 | fileIsSaved = true;
45 | filePath = "";
46 | setFileNameShow(fileIsSaved);
47 | }
48 |
49 | void FlowChart::setFileSetSaved(bool isSaved)
50 | {
51 | if(fileIsSaved != isSaved)
52 | {
53 | fileIsSaved = isSaved;
54 | setFileNameShow(fileIsSaved);
55 | }
56 | }
57 |
58 | void FlowChart::setFileNameShow(bool isSaved)
59 | {
60 | QString tmp;
61 | if(fileIsOpened)
62 | {
63 | tmp = QString("%1%2").arg(filePath).arg((isSaved?"":" *"));
64 | emit updateWindowTitle(tmp);
65 | }else
66 | {
67 | tmp = QString("%1%2").arg("Untitle").arg((isSaved?"":" *"));
68 | emit updateWindowTitle(tmp);
69 | }
70 | }
71 |
72 | Chart_Base * FlowChart::getCurPaintChart()
73 | {
74 | return curPaintChart;
75 | }
76 |
77 | void FlowChart::setSelChartLineColor(const QColor &color)
78 | {
79 | curSelecChart->paintChartDrawPen.setColor(color);
80 | curSelecChart->update();
81 | }
82 |
83 | void FlowChart::setSelChartFillColor(const QColor &color)
84 | {
85 | curSelecChart->paintChartFillPen.setColor(color);
86 | curSelecChart->update();
87 | }
88 |
89 | void FlowChart::setMousePressedFlag(MOUSE_EVENT_TYPE f)
90 | {
91 | mouseEventType = f;
92 | }
93 |
94 | void FlowChart::setPaintChart()
95 | {
96 | if(curPaintChart != nullptr)
97 | delete curPaintChart;
98 |
99 | switch(curPaintChartType)
100 | {
101 | case PaintChartType::RECT:
102 | {
103 | curPaintChart = new Chart_Rect(this);
104 | }break;
105 | case PaintChartType::DIAMOND:
106 | {
107 | curPaintChart = new Chart_Diamond(this);
108 | }break;
109 | case PaintChartType::ROUNDRECT:
110 | {
111 | curPaintChart = new Chart_RoundRect(this);
112 | }break;
113 | case PaintChartType::ELLIPSE:
114 | {
115 | curPaintChart = new Chart_Ellipse(this);
116 | }break;
117 | case PaintChartType::LINE:
118 | {
119 | curPaintChart = new Chart_Line(this);
120 | }break;
121 | case PaintChartType::TRAPEZOID:
122 | {
123 | curPaintChart = new Chart_Trapezoid(this);
124 | }break;
125 | default:case PaintChartType::NONE:{
126 | curPaintChart = nullptr;
127 | }break;
128 | }
129 | if(curPaintChart)
130 | {
131 | mouseEventType = MOUSE_EVENT_TYPE::CREATING_CNANGE_SIZE;
132 | }
133 | }
134 |
135 | void FlowChart::setSelecChart(Chart_Base * cb, int x, int y)
136 | {
137 |
138 | emit disableStyle();
139 | this->grabKeyboard();
140 | if(curSelecChart != nullptr) curSelecChart->hideMagSize();
141 | curSelecChart = cb;
142 | curSelecChart->showMagSize();
143 | curSelecChartPos = QPoint(x,y);
144 | mouseEventType = MOUSE_EVENT_TYPE::RUNTIME_CHANGE_POS;
145 | Chart_Line *cl = nullptr;
146 | if(nullptr == (cl = dynamic_cast(cb)))
147 | {
148 | emit sendChartStyle(cb->paintChartDrawPen,cb->paintChartFillPen);
149 | }else
150 | {
151 | emit sendLineStyle(cl->paintChartDrawPen,cl->getStartLineHeadType(),cl->getEndLineHeadType());
152 | }
153 | }
154 |
155 | bool FlowChart::openChartFile()
156 | {
157 | if(!fileIsSaved)
158 | {
159 | QMessageBox tmp(QMessageBox::Warning,tr("警告!"),tr("不保存文件就关闭?"),QMessageBox::NoButton,this->parentWidget());
160 | QPushButton *saveclose = tmp.addButton(tr("保存并关闭"),QMessageBox::ActionRole);
161 | QPushButton *nosaveclose = tmp.addButton(tr("不保存关闭"),QMessageBox::AcceptRole);
162 | QPushButton *cancel = tmp.addButton(tr("取消"),QMessageBox::RejectRole);
163 | tmp.exec();
164 | if(tmp.clickedButton() == saveclose)
165 | {
166 | if(saveChartFile())
167 | {
168 | resetFlowChartPanel();
169 | }else
170 | return false;
171 | //qDebug()<<"Save and Quit";
172 | }else if(tmp.clickedButton() == nosaveclose)
173 | {
174 | //qDebug()<<"Not Save and Quit";
175 | resetFlowChartPanel();
176 | }else if(tmp.clickedButton() == cancel)
177 | {
178 | return true;
179 | //qDebug()<<"cancel ";
180 | }
181 | }
182 | resetFlowChartPanel();
183 | QString tmpFilePath = QFileDialog::getOpenFileName(this,tr("打开文件"),"F:",tr("FCT文件(*.fct)"));
184 | if(tmpFilePath == "") return false;
185 |
186 | if(loadFile(tmpFilePath) == false)
187 | {
188 | QMessageBox::critical(this->parentWidget(),tr("错误!"),tr("打开文件失败!\n文件损坏或类型不正确"),QMessageBox::Ok);
189 | return false;
190 | }else
191 | {
192 | fileIsOpened = true;
193 | this->filePath = tmpFilePath;
194 | setFileNameShow(fileIsSaved);
195 | qDebug()<<"Load File Success"<parentWidget(),tr("错误!"),tr("保存文件失败!\n文件已占用或者访问权限不足"),QMessageBox::Ok);
216 | return false;
217 | }
218 | }else{
219 | QString tmpFilePath = QFileDialog::getSaveFileName(this,tr("保存文件"),"F:",tr("FCT文件(*.fct)"));
220 | if(tmpFilePath == "") return false;
221 | if(saveFile(tmpFilePath))
222 | {
223 | filePath = tmpFilePath;
224 | fileIsOpened = true;
225 | }else
226 | {
227 | QMessageBox::critical(this->parentWidget(),tr("错误!"),tr("保存文件失败!\n文件已占用或者访问权限不足"),QMessageBox::Ok);
228 | return false;
229 | }
230 | }
231 | setFileSetSaved(true);
232 | }
233 | return true;
234 | }
235 | bool FlowChart::newChartFile()
236 | {
237 | if(!fileIsSaved)
238 | {
239 | QMessageBox tmp(QMessageBox::Warning,tr("警告!"),tr("不保存文件就关闭?"),QMessageBox::NoButton,this->parentWidget());
240 | QPushButton *saveclose = tmp.addButton(tr("保存并关闭"),QMessageBox::ActionRole);
241 | QPushButton *nosaveclose = tmp.addButton(tr("不保存关闭"),QMessageBox::AcceptRole);
242 | QPushButton *cancel = tmp.addButton(tr("取消"),QMessageBox::RejectRole);
243 | tmp.exec();
244 | if(tmp.clickedButton() == saveclose)
245 | {
246 | if(saveChartFile())
247 | {
248 | resetFlowChartPanel();
249 | }else{
250 | return false;
251 | }
252 | //qDebug()<<"Save and Quit";
253 |
254 | }else if(tmp.clickedButton() == nosaveclose)
255 | {
256 | //qDebug()<<"Not Save and Quit";
257 | resetFlowChartPanel();
258 | }else if(tmp.clickedButton() == cancel)
259 | {
260 | //qDebug()<<"cancel ";
261 | }
262 | }else{
263 | resetFlowChartPanel();
264 | }
265 | return true;
266 | }
267 |
268 | //void FlowChart::resetSeletcChart()
269 | //{
270 | // if(curSelecChart != nullptr) curSelecChart->hideMagSize();
271 | // curSelecChart = nullptr;
272 | //}
273 |
274 | Chart_Base * FlowChart::getCurSeleChart()
275 | {
276 | return curSelecChart;
277 | }
278 |
279 |
280 | void FlowChart::addChart(Chart_Base *cb)
281 | {
282 | charts.push_back(cb);
283 | }
284 | bool FlowChart::delChart(Chart_Base *&cb)
285 | {
286 | for(auto it = charts.begin();it != charts.end();it++)
287 | {
288 | if(*it == cb)
289 | {
290 | Chart_Base *tmp = cb;
291 | cb = nullptr;
292 | charts.erase(it);
293 | #if 1
294 | for(auto magit = tmp->magPoint.i_point.begin();magit!=tmp->magPoint.i_point.end();magit++)
295 | {
296 | for(auto magLineStIt = (*magit)->i_lineStart.begin();magLineStIt != (*magit)->i_lineStart.end();magLineStIt++)
297 | {
298 | dynamic_cast(*magLineStIt) ->resetEndChart();
299 | if(!delLine(*magLineStIt))
300 | {
301 | qDebug()<<"Error";
302 | }else{
303 | qDebug()<<"Succeed.";
304 | }
305 | }
306 | for(auto magLineEnIt = (*magit)->i_lineEnd.begin();magLineEnIt != (*magit)->i_lineEnd.end();magLineEnIt++)
307 | {
308 | dynamic_cast(*magLineEnIt) ->resetStartChart();
309 | if(!delLine(*magLineEnIt))
310 | {
311 | qDebug()<<"Error";
312 | }else{
313 | qDebug()<<"Succeed.";
314 | }
315 | }
316 | }
317 | #endif
318 | delete[] tmp;
319 |
320 | return true;
321 | }
322 | }
323 | return false;
324 | }
325 | void FlowChart::addLine(Chart_Base *cb)
326 | {
327 | line.push_back(cb);
328 | }
329 | bool FlowChart::delLine(Chart_Base *&cb)
330 | {
331 | for(auto it = line.begin();it != line.end();it++)
332 | {
333 | if(*it == cb)
334 | {
335 | Chart_Line *tmp = dynamic_cast(*it);
336 | cb = nullptr;
337 | line.erase(it);
338 | qDebug()<magPoint.i_point.size();
339 |
340 |
341 | tmp->resetEndChart();
342 | tmp->resetStartChart();
343 | delete tmp;
344 | return true;
345 | }
346 | }
347 | return false;
348 | }
349 |
350 | void FlowChart::hideMagSizeAll()
351 | {
352 | for(auto it = charts.begin();it!=charts.end();it++)
353 | {
354 | (*it)->hideMagSize();
355 | }
356 | for(auto it = line.begin();it!=line.end();it++)
357 | {
358 | (*it)->hideMagSize();
359 | }
360 | curSelecChart = nullptr;
361 | mouseEventType = MOUSE_EVENT_TYPE::NONE;
362 | emit disableStyle();
363 | }
364 |
365 | bool FlowChart::saveFile(QString filePath)
366 | {
367 | QFile file(filePath);
368 | file.open(QIODevice::WriteOnly);
369 | QDataStream fout(&file);
370 |
371 | Chart_Base::saveStaticValue(fout);
372 | unsigned long long i;
373 | i = charts.size();
374 | fout.writeRawData(reinterpret_cast(&i),sizeof(unsigned long long));
375 | for(auto it = charts.begin(); it!=charts.end(); it++)
376 | {
377 | fout<<*(*it);
378 | }
379 | i = line.size();
380 | fout.writeRawData(reinterpret_cast(&i),sizeof(unsigned long long));
381 | for(auto it = line.begin(); it!=line.end(); it++)
382 | {
383 | fout<<*(*it)<<*(reinterpret_cast(*it));
384 | }
385 | file.close();
386 | return true;
387 | }
388 |
389 | bool FlowChart::loadFile(QString filePath)
390 | {
391 | QFile file(filePath);
392 | file.open(QIODevice::ReadOnly);
393 | QDataStream fin(&file);
394 | std::map chartMap;
395 |
396 | Chart_Base::loadStaticValue(fin);
397 | unsigned long long cnt;
398 | fin.readRawData(reinterpret_cast(&cnt),sizeof(unsigned long long));
399 | qDebug()<<"图形个数:"<(&tmp),sizeof(PaintChartType));
405 | switch(tmp)
406 | {
407 |
408 | case PaintChartType::RECT:
409 | {
410 | cb = new Chart_Rect(this);
411 | }break;
412 | case PaintChartType::DIAMOND:
413 | {
414 | cb = new Chart_Diamond(this);
415 | }break;
416 | case PaintChartType::ROUNDRECT:
417 | {
418 | cb = new Chart_RoundRect(this);
419 | }break;
420 | case PaintChartType::ELLIPSE:
421 | {
422 | cb = new Chart_Ellipse(this);
423 | }break;
424 | case PaintChartType::TRAPEZOID:
425 | {
426 | cb = new Chart_Trapezoid(this);
427 | }break;
428 | default:case PaintChartType::NONE:{
429 | cb = nullptr;
430 | }break;
431 | }
432 | cb->chartType = tmp;
433 | fin>>(*cb);
434 | connect(cb,SIGNAL(sendThisClass(Chart_Base *, int,int)),this,SLOT(setSelecChart(Chart_Base *, int,int)));
435 | connect(cb,SIGNAL(setTypeChangeSize(ORIENTION)),this,SLOT(setTypeChangeSize(ORIENTION)));
436 | connect(cb,SIGNAL(setTypeCreateMagPoint(Chart_Base *,ORIENTION,int)),this,SLOT(setTypeCreateMagPoint(Chart_Base *,ORIENTION,int)));
437 | addChart(cb);
438 | cb->applyWidthHeight();
439 | cb->update();
440 | cb->show();
441 | chartMap[cb->getID()] = cb;
442 | }
443 | fin.readRawData(reinterpret_cast(&cnt),sizeof(unsigned long long));
444 | qDebug()<<"连线个数:"<(&tmp),sizeof(PaintChartType));
452 | cb = new Chart_Line(this);
453 | addLine(cb);
454 | if(nullptr == (cl = dynamic_cast(cb))) qDebug()<<"error";
455 | fin>>(*cb)>>(*cl);
456 | try{
457 | fin.readRawData(reinterpret_cast(&id),sizeof(int));
458 | if(id>=0)
459 | {
460 | Chart_Base *cbs = chartMap.at(id);
461 | cbs->addMagiPointStartLine(cl->getStartMagIndex(),cl);
462 | cl->setStartChart(cbs);
463 | }
464 | }catch(std::out_of_range &oor){
465 | qDebug()<(&id),sizeof(int));
469 | if(id>=0)
470 | {
471 | Chart_Base *cbe = chartMap.at(id);
472 | cbe->addMagiPointEndLine(cl->getEndMagIndex(),cl);
473 | cl->setEndChart(cbe);
474 | }
475 | }catch(std::out_of_range &oor){
476 | qDebug()<applyWidthHeight();
481 | cl->update();
482 | cl->show();
483 | }
484 | hideMagSizeAll();
485 | return true;
486 | }
487 |
488 |
489 | void FlowChart::paintEvent(QPaintEvent *event)
490 | {
491 | QPainter p(this);
492 | p.setPen(QColor(150,150,150));
493 | const int gap = 30;
494 | for(int i = 1;i * gap < width();i++)
495 | {
496 | if(i%5 == 0)
497 | p.drawLine(QLineF(i*gap,0,i*gap,height()));
498 | }
499 | for(int i = 1;i * gap < height();i++)
500 | {
501 | if(i%5 == 0)
502 | p.drawLine(QLineF(0,i*gap,width(),i*gap));
503 | }
504 |
505 | p.setPen(QColor(200,200,200,150));
506 | //p.setPen(Qt::DotLine);
507 | //p.setOpacity(200);
508 | for(int i = 1;i * gap < width();i++)
509 | {
510 | if(i%5 == 0) continue;
511 | p.drawLine(QLineF(i*gap,0,i*gap,height()));
512 | }
513 | for(int i = 1;i * gap < height();i++)
514 | {
515 | if(i%5 == 0) continue;
516 | p.drawLine(QLineF(0,i*gap,width(),i*gap));
517 | }
518 |
519 |
520 | QStyleOption opt;
521 | opt.init(this);
522 | style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
523 | QWidget::paintEvent(event);
524 |
525 | //event->accept();
526 | }
527 | void FlowChart::mousePressEvent(QMouseEvent *event)
528 | {
529 | event->ignore();
530 | switch(mouseEventType)
531 | {
532 | case MOUSE_EVENT_TYPE::CREATING_CNANGE_SIZE:{
533 | int x = event->pos().rx();
534 | int y = event->pos().ry();
535 | //curPaintChart->setObjectName(QStringLiteral("tttt"));
536 | if(curSelecChart) curSelecChart->hideMagSize();
537 | curSelecChart = curPaintChart;
538 | curPaintChart->setXY(x,y);
539 | //curPaintChart->setAttribute(Qt::WA_StyledBackground,true);
540 | //curPaintChart->setStyleSheet(QStringLiteral("background-color: rgb(100, 100, 100);"));
541 | if(curPaintChart->chartType == PaintChartType::LINE)
542 | {
543 | connect(curPaintChart,SIGNAL(sendThisClass(Chart_Base *, int,int)),this,SLOT(setSelecChart(Chart_Base *, int,int)));
544 | connect(curPaintChart,SIGNAL(setTypeChangeSize(ORIENTION)),this,SLOT(setTypeChangeSize(ORIENTION)));
545 | addLine(curPaintChart);
546 | Chart_Line *cl = dynamic_cast(curSelecChart);
547 | emit sendLineStyle(cl->paintChartDrawPen,cl->getStartLineHeadType(),cl->getEndLineHeadType());
548 | }else
549 | {
550 | connect(curPaintChart,SIGNAL(sendThisClass(Chart_Base *, int,int)),this,SLOT(setSelecChart(Chart_Base *, int,int)));
551 | connect(curPaintChart,SIGNAL(setTypeChangeSize(ORIENTION)),this,SLOT(setTypeChangeSize(ORIENTION)));
552 | connect(curPaintChart,SIGNAL(setTypeCreateMagPoint(Chart_Base *,ORIENTION,int)),this,SLOT(setTypeCreateMagPoint(Chart_Base *,ORIENTION,int)));
553 | //connect(curPaintChart,SIGNAL(hideThisClass()),this,SLOT(resetSeletcChart()));
554 | addChart(curPaintChart);
555 | emit sendChartStyle(curSelecChart->paintChartDrawPen,curSelecChart->paintChartFillPen);
556 | }
557 | curPaintChart->update();
558 | curPaintChart->show();
559 | //mouseEventType = MOUSE_EVENT_TYPE::CREATING_CNANGE_SIZE;
560 | event->accept();
561 | }break;
562 | default:case MOUSE_EVENT_TYPE::NONE:{
563 | for(auto it = charts.begin();it!=charts.end();it++)
564 | {
565 | (*it)->overlapChartMousePressed(event);
566 | if(event->isAccepted()) return;
567 | }
568 | for(auto a:line)
569 | {
570 | a->overlapChartMousePressed(event);
571 | if(event->isAccepted()) return;
572 | }
573 | hideMagSizeAll();
574 | }break;
575 | }
576 | }
577 | void FlowChart::mouseMoveEvent(QMouseEvent *event)
578 | {
579 | //if(event->isAccepted()) return;
580 | event->ignore();
581 | switch(mouseEventType)
582 | {
583 | default:case MOUSE_EVENT_TYPE::NONE:
584 | {
585 | for(auto it = charts.begin();it!=charts.end();it++)
586 | {
587 | (*it)->overlapChartMouseMove(event);
588 | if(event->isAccepted()) return;
589 | }
590 | for(auto it = line.begin();it!=line.end();it++)
591 | {
592 | (*it)->overlapChartMouseMove(event);
593 | if(event->isAccepted()) return;
594 | }
595 | if(curSelecChart == nullptr)
596 | {
597 | setCursor(QCursor(Qt::ArrowCursor));
598 | hideMagSizeAll();
599 | }
600 | }break;
601 | case MOUSE_EVENT_TYPE::CREATING_CNANGE_SIZE:
602 | {
603 | int x = event->pos().rx(),y = event->pos().ry();
604 | if(curSelecChart)
605 | {
606 | if(curSelecChart->chartType == PaintChartType::LINE)
607 | {
608 | for(auto it = charts.begin();it!=charts.end();it++)
609 | {
610 | if((*it)->autoSetMagi(x,y,magPointIndex))
611 | {
612 | lineSelectChart = *it;
613 | break;
614 | }else{
615 | lineSelectChart = nullptr;
616 | }
617 | }
618 | //if(!lineSelectChart) reinterpret_cast(curSelecChart)->resetEndChart();
619 | }
620 | curPaintChart->setWidthHeight(x,y);
621 | }
622 | event->accept();
623 | }break;
624 | case MOUSE_EVENT_TYPE::RUNTIME_CHANGE_SIZE:
625 | {
626 | int x = event->pos().rx(),y = event->pos().ry();
627 |
628 | if(curSelecChart->chartType == PaintChartType::LINE)
629 | {
630 | qDebug()<<"hehe";
631 | for(auto it = charts.begin();it!=charts.end();it++)
632 | {
633 | if((*it)->autoSetMagi(x,y,magPointIndex))
634 | {
635 | lineSelectChart = *it;
636 | break;
637 | }else{
638 | lineSelectChart = nullptr;
639 | }
640 | }
641 | //if(!lineSelectChart) reinterpret_cast(curSelecChart)->resetEndChart();
642 | }
643 | curSelecChart->setWidthHeight(x,y,sizePointDirect);
644 | event->accept();
645 | }break;
646 | case MOUSE_EVENT_TYPE::RUNTIME_CREATE_MAGPOINT:
647 | {
648 | if(newLineChart == nullptr)
649 | {
650 | newLineChart = new Chart_Line(this);
651 | if(curSelecChart)
652 | curSelecChart->hideMagSize();
653 | curSelecChart = newLineChart;
654 | addLine(newLineChart);
655 | //newLineChart->setAttribute(Qt::WA_StyledBackground,true);
656 | //newLineChart->setStyleSheet(QStringLiteral("background-color: rgb(100, 100, 100);"));
657 | connect(newLineChart,SIGNAL(sendThisClass(Chart_Base *, int,int)),this,SLOT(setSelecChart(Chart_Base *, int,int)));
658 | connect(newLineChart,SIGNAL(setTypeChangeSize(ORIENTION)),this,SLOT(setTypeChangeSize(ORIENTION)));
659 | newLineChart->setXY(newLineFromSelectChart->getMagiPointAbsX(magPointFromIndex),newLineFromSelectChart->getMagiPointAbsY(magPointFromIndex));
660 | newLineChart->setStartChart(newLineFromSelectChart);
661 | newLineChart->setStartMagIndex(magPointFromIndex);
662 | newLineChart->setStartDirect(magPointDirect);
663 | newLineChart->update();
664 | newLineChart->show();
665 |
666 | newLineFromSelectChart->addMagiPointStartLine(magPointFromIndex,newLineChart);
667 | }
668 | int x = event->pos().rx(),y = event->pos().ry();
669 |
670 | for(auto it = charts.begin();it!=charts.end();it++)
671 | {
672 | //if(*it == newLineFromSelectChart) continue;
673 | if((*it)->autoSetMagi(x,y,magPointToIndex))
674 | {
675 | newLineToSelectChart = *it;
676 | break;
677 | }else{
678 | newLineToSelectChart = nullptr;
679 | }
680 | }
681 | //if(!newLineToSelectChart) newLineChart->resetEndChart();
682 | newLineChart->setWidthHeight(x,y,ORIENTION::ENDPOINT);
683 | event->ignore();
684 | }break;
685 | case MOUSE_EVENT_TYPE::RUNTIME_CHANGE_POS:
686 | {
687 | if(curSelecChart->chartType != PaintChartType::LINE)
688 | {
689 | curSelecChart->setXY(event->pos().rx() - curSelecChartPos.rx(),event->pos().ry() - curSelecChartPos.ry());
690 | event->accept();
691 | }
692 | }break;
693 | }
694 | }
695 |
696 | void FlowChart::mouseReleaseEvent(QMouseEvent *event)
697 | {
698 | switch(mouseEventType)
699 | {
700 | case MOUSE_EVENT_TYPE::CREATING_CNANGE_SIZE:
701 | {
702 | //curPaintChart->updatePath();
703 | resetPaintChartType();
704 | if(curSelecChart->chartType == PaintChartType::LINE)
705 | {
706 | Chart_Line *cl = reinterpret_cast(curSelecChart);
707 |
708 | if(lineSelectChart)
709 | {
710 | lineSelectChart->addMagiPointEndLine(magPointIndex,curSelecChart);
711 | lineSelectChart->hideMagOnly();
712 | cl->setEndChart(lineSelectChart);
713 | cl->setEndMagIndex(magPointIndex);
714 | cl->setEndDirect(lineSelectChart->getMagiPointDirect(magPointIndex));
715 | cl->update();
716 | lineSelectChart = nullptr;
717 | }
718 | else{
719 | cl->resetEndChart();
720 | }
721 |
722 | }
723 |
724 |
725 | curPaintChart = nullptr;
726 | mouseEventType = MOUSE_EVENT_TYPE::NONE;
727 | setFileSetSaved(false);
728 | event->accept();
729 | }break;
730 | case MOUSE_EVENT_TYPE::RUNTIME_CHANGE_SIZE:
731 | {
732 | if(curSelecChart->chartType == PaintChartType::LINE)
733 | {
734 | Chart_Line *cl = reinterpret_cast(curSelecChart);
735 | if(lineSelectChart)
736 | {
737 | if(sizePointDirect == ORIENTION::STARTPOINT)
738 | {
739 | cl->resetStartChart();
740 | lineSelectChart->addMagiPointStartLine(magPointIndex,curSelecChart);
741 | lineSelectChart->hideMagOnly();
742 | cl->setStartChart(lineSelectChart);
743 | cl->setStartMagIndex(magPointIndex);
744 | cl->setStartDirect(lineSelectChart->getMagiPointDirect(magPointIndex));
745 | }else if(sizePointDirect == ORIENTION::ENDPOINT)
746 | {
747 | cl->resetEndChart();
748 | lineSelectChart->addMagiPointEndLine(magPointIndex,curSelecChart);
749 | lineSelectChart->hideMagOnly();
750 | cl->setEndChart(lineSelectChart);
751 | cl->setEndMagIndex(magPointIndex);
752 | cl->setEndDirect(lineSelectChart->getMagiPointDirect(magPointIndex));
753 | }else{
754 | qDebug()<<"Error";
755 | }
756 |
757 | cl->update();
758 | }else
759 | {
760 | if(sizePointDirect == ORIENTION::STARTPOINT)
761 | {
762 | cl->resetStartChart();
763 | }else if(sizePointDirect == ORIENTION::ENDPOINT)
764 | {
765 | cl->resetEndChart();
766 | }else
767 | {
768 | qDebug()<<"Error";
769 | }
770 | }
771 | }
772 | mouseEventType = MOUSE_EVENT_TYPE::NONE;
773 | lineSelectChart = nullptr;
774 | setFileSetSaved(false);
775 | event->accept();
776 | }break;
777 | case MOUSE_EVENT_TYPE::RUNTIME_CREATE_MAGPOINT:
778 | {
779 | if(newLineToSelectChart)
780 | {
781 | newLineToSelectChart->addMagiPointEndLine(magPointToIndex,newLineChart);
782 | newLineToSelectChart->hideMagOnly();
783 | newLineChart->setEndChart(newLineToSelectChart);
784 | newLineChart->setEndMagIndex(magPointToIndex);
785 | newLineChart->setEndDirect(newLineToSelectChart->getMagiPointDirect(magPointToIndex));
786 | newLineChart->update();
787 | }else
788 | {
789 | if(newLineChart)
790 | newLineChart->resetEndChart();
791 | }
792 | mouseEventType = MOUSE_EVENT_TYPE::NONE;
793 | newLineChart = nullptr;
794 | newLineFromSelectChart = nullptr;
795 | newLineToSelectChart = nullptr;
796 | setFileSetSaved(false);
797 | event->accept();
798 | }break;
799 | case MOUSE_EVENT_TYPE::RUNTIME_CHANGE_POS:
800 | {
801 | mouseEventType = MOUSE_EVENT_TYPE::NONE;
802 | setFileSetSaved(false);
803 | event->accept();
804 | }break;
805 | default:case MOUSE_EVENT_TYPE::NONE:
806 | {
807 | event->ignore();
808 | }break;
809 | }
810 |
811 | }
812 | void FlowChart::keyPressEvent(QKeyEvent *ev)
813 | {
814 | ev->ignore();
815 | switch(ev->key())
816 | {
817 | case Qt::Key_Escape:
818 | {
819 | if(curSelecChart)
820 | {
821 | curSelecChart->hideMagSize();
822 | curSelecChart = nullptr;
823 | }
824 | }break;
825 | case Qt::Key_Delete:
826 | {
827 | if(curSelecChart)
828 | {
829 | if(curSelecChart->chartType == PaintChartType::LINE)
830 | {
831 | if(!delLine(curSelecChart))
832 | {
833 | qDebug()<<"Error";
834 | }
835 | }else{
836 | if(!delChart(curSelecChart))
837 | {
838 | qDebug()<<"Error";
839 | }
840 | }
841 | curSelecChart = nullptr;
842 | }
843 | }break;
844 | #if 0
845 | case Qt::Key_Q:
846 | {
847 | qDebug()<<"总个数:charts:"<magPoint.i_point.size();
851 | for(auto magit = (*it)->magPoint.i_point.begin();magit!=(*it)->magPoint.i_point.end();magit++)
852 | {
853 | qDebug()<<"\t\t线头个数:"<<(*magit)->i_lineStart.size()<<",线尾个数:"<<(*magit)->i_lineEnd.size();
854 | for(auto magLineStIt = (*magit)->i_lineStart.begin();magLineStIt != (*magit)->i_lineStart.end();magLineStIt++)
855 | {
856 | qDebug()<<"\t\t\t线头ID:"<<(*magLineStIt)->getID();
857 | }
858 | for(auto magLineEnIt = (*magit)->i_lineEnd.begin();magLineEnIt != (*magit)->i_lineEnd.end();magLineEnIt++)
859 | {
860 | qDebug()<<"\t\t\t线尾ID:"<<(*magLineEnIt)->getID();
861 | }
862 | }
863 | }
864 | qDebug();
865 | for(auto it = line.begin();it != line.end();it++)
866 | {
867 | qDebug()<<"\t线头:"<<((dynamic_cast(*it)->getStartChart() == nullptr)?"-":"有")<<",线尾:"<<(((dynamic_cast(*it)->getEndChart()) == nullptr)?"-":"有");
868 | }
869 | }break;
870 | #endif
871 | default:{
872 | ev->ignore();
873 | }
874 | }
875 | }
876 | void FlowChart::keyReleaseEvent(QKeyEvent *ev)
877 | {
878 | ev->ignore();
879 | }
880 |
--------------------------------------------------------------------------------
/FlowChartTools/flowchart.h:
--------------------------------------------------------------------------------
1 | #ifndef FLOWCHART_H
2 | #define FLOWCHART_H
3 | #pragma execution_character_set("utf-8")
4 | #include