├── 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 5 | #include 6 | 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | 15 | 16 | #include 17 | #include 18 | #include 19 | #include 20 | 21 | #include "class_Charts/chart_base.h" 22 | #include "class_Charts/chart_rect.h" 23 | #include "class_Charts/chart_diamond.h" 24 | #include "class_Charts/chart_roundrect.h" 25 | #include "class_Charts/chart_ellipse.h" 26 | #include "class_Charts/chart_line.h" 27 | #include "class_Charts/chart_trapezoid.h" 28 | 29 | #include "comdef.h" 30 | 31 | class FlowChart : public QWidget 32 | { 33 | Q_OBJECT 34 | private: 35 | friend class Chart_Base; 36 | Chart_Base *curPaintChart = nullptr; // 将要放置的图形 37 | PaintChartType curPaintChartType = PaintChartType::NONE; // 绘制的图形的类型 38 | 39 | Chart_Base *curSelecChart = nullptr; // 选中的画板上的图形 40 | QPoint curSelecChartPos; // 选中时指针在图像对象上的位置信息 41 | 42 | Chart_Line *newLineChart = nullptr; // 要创建的磁力点的连线的指针 43 | Chart_Base *newLineToSelectChart = nullptr; // 要连接到的磁力点的图形的指针 44 | Chart_Base *newLineFromSelectChart = nullptr; // 要创建的磁力点的图形的指针 45 | ORIENTION magPointDirect = ORIENTION::NONE; // 选中时要创建的起始磁力点的方向类型 46 | int magPointFromIndex; // 要创建的磁力点的索引 47 | int magPointToIndex; // 要创建的磁力点的索引 48 | 49 | Chart_Base *lineSelectChart = nullptr; // 运行时线的吸附到的图形的指针 50 | int magPointIndex; // 运行时线吸附到的图形的磁力点的索引 51 | 52 | ORIENTION sizePointDirect = ORIENTION::NONE; // 选中时要改变大小的大小点的方向类型 53 | 54 | std::vector charts; // 画板上图形的集合 55 | std::vector line; // 画板上线的集合 56 | 57 | MOUSE_EVENT_TYPE mouseEventType = MOUSE_EVENT_TYPE::NONE; // 当前鼠标事件类型 58 | 59 | bool fileIsOpened = false; // 是否打开了文件 60 | bool fileIsSaved = true; // 是否保存了文件 61 | QString filePath; // 打开文件的路径 62 | 63 | void initVar(); // 变量默认初始化函数 64 | void resetFlowChartPanel(); // 重置流图画板 65 | void setFileSetSaved(bool isSaved); // 设置文件未保存 66 | void setFileNameShow(bool isSaved); // 设置窗体文件名 67 | void clearChartsLine(){ // 释放图形、连线内存 68 | for(auto it = charts.begin();it!=charts.end();it++) { 69 | if(*it) delete *it; 70 | *it = nullptr; 71 | } 72 | for(auto it = line.begin();it!=line.end();it++) { 73 | if(*it) delete *it; 74 | *it = nullptr; 75 | } 76 | } 77 | 78 | public: 79 | explicit FlowChart(QWidget *parent = nullptr , Qt::WindowFlags f = 0); 80 | virtual ~FlowChart() 81 | { 82 | //delete[] curPaintChart; 83 | //delete[] curSelecChart; 84 | //delete[] newLineChart; 85 | //delete[] newLineToSelectChart; 86 | newChartFile(); 87 | clearChartsLine(); 88 | 89 | } 90 | 91 | 92 | Chart_Base * getCurPaintChart(); // 获取新的图形 93 | Chart_Base * getCurSeleChart(); // 获取当前选中的图形 94 | void addChart(Chart_Base *cb); // 添加图形到图形容器 95 | bool delChart(Chart_Base *&cb); // 删除图形 96 | void addLine(Chart_Base *cb); // 添加线条到线条容器 97 | bool delLine(Chart_Base *&cb); // 添加图形 98 | void hideMagSizeAll(); // 隐藏所有元素 99 | bool saveFile(QString filePath); // 保存文件 100 | bool loadFile(QString filePath); // 读取文件 101 | 102 | 103 | protected: 104 | virtual void paintEvent(QPaintEvent *event); 105 | virtual void mousePressEvent(QMouseEvent *event); 106 | virtual void mouseMoveEvent(QMouseEvent *event); 107 | virtual void mouseReleaseEvent(QMouseEvent *event); 108 | virtual void keyPressEvent(QKeyEvent *ev); 109 | virtual void keyReleaseEvent(QKeyEvent *ev); 110 | 111 | //bool eventFilter(QObject *target, QEvent *event); 112 | signals: 113 | void sendChartStyle(QPen &qp, QBrush &qb); // 发送图形颜色信息 114 | void sendLineStyle(QPen &qp, LINE_HEAD_TYPE &startLineHeadType, LINE_HEAD_TYPE &endLineHeadType); // 发送线条颜色和线头类型信息 115 | void disableStyle(); // 关闭主窗体颜色信息设置 116 | void updateWindowTitle(const QString &); // 更新主窗体标题 117 | public slots: 118 | void setPen(QPen &qp){curSelecChart->paintChartDrawPen = qp;} // 设置笔刷 119 | void setBrush(QBrush &qb){curSelecChart->paintChartFillPen = qb;} // 设置填充颜色 120 | void setLineWidth(int i){curSelecChart->paintChartDrawPen.setWidth(i);} // 设置线宽 121 | void setLineStartStyle(int i){dynamic_cast(curSelecChart)->setStartLineHeadType(LINE_HEAD_TYPE(i));} // 设置起点线头类型 122 | void setLineEndStyle(int i){dynamic_cast(curSelecChart)->setEndLineHeadType(LINE_HEAD_TYPE(i));} // 设置终点线头类型 123 | public: 124 | void setSelChartLineColor(const QColor &color); // 设置图形线条颜色 125 | void setSelChartFillColor(const QColor &color); // 设置图形填充颜色 126 | 127 | public slots: 128 | void setMousePressedFlag(MOUSE_EVENT_TYPE); // 设置鼠标按下事件类型 129 | void setPaintChart(); // 设置将要绘制的图形 130 | void setSelecChart(Chart_Base *, int ,int); // 设置选中的画板的图像 131 | // void resetSeletcChart(); 132 | 133 | public slots: 134 | void setPaintChart_Rect(){curPaintChartType = PaintChartType::RECT;setPaintChart();} // 获取一个新的矩形 135 | void setPaintChart_Diamond(){curPaintChartType = PaintChartType::DIAMOND;setPaintChart();} // 获取一个新的菱形 136 | void setPaintChart_RoundRect(){curPaintChartType = PaintChartType::ROUNDRECT;setPaintChart();} // 获取一个新的圆角矩形 137 | void setPaintChart_Ellipse(){curPaintChartType = PaintChartType::ELLIPSE;setPaintChart();} // 获取一个新的圆形 138 | void setPaintChart_Line(){curPaintChartType = PaintChartType::LINE;setPaintChart();} // 获取一个新的线段 139 | void setPaintChart_trapezoid(){curPaintChartType = PaintChartType::TRAPEZOID;setPaintChart();} // 获取一个新的梯形 140 | void resetPaintChartType(){curPaintChartType = PaintChartType::NONE;} // 清空类型 141 | 142 | 143 | public slots: 144 | void setTypeChangeSize(ORIENTION i){mouseEventType = MOUSE_EVENT_TYPE::RUNTIME_CHANGE_SIZE;sizePointDirect = i; } // 设置鼠标事件类型为改变大小 145 | void setTypeCreateMagPoint(Chart_Base *cb,ORIENTION d,int i){newLineFromSelectChart = cb;mouseEventType = MOUSE_EVENT_TYPE::RUNTIME_CREATE_MAGPOINT;magPointDirect = d;magPointFromIndex = i;newLineChart = nullptr; } // 设置鼠标事件类型为创建线段 146 | 147 | bool openChartFile(); // 打开文件 148 | bool saveChartFile(); // 保存文件 149 | bool newChartFile(); // 新建文件 150 | 151 | }; 152 | 153 | #endif // FLOWCHART_H 154 | 155 | 156 | -------------------------------------------------------------------------------- /FlowChartTools/img/MainIco.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzt1234hf/FlowChartTools/1f651c289e7ea78347c31079a90577e711be95c1/FlowChartTools/img/MainIco.png -------------------------------------------------------------------------------- /FlowChartTools/img/Round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzt1234hf/FlowChartTools/1f651c289e7ea78347c31079a90577e711be95c1/FlowChartTools/img/Round.png -------------------------------------------------------------------------------- /FlowChartTools/img/Rounded_Rectangle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzt1234hf/FlowChartTools/1f651c289e7ea78347c31079a90577e711be95c1/FlowChartTools/img/Rounded_Rectangle.png -------------------------------------------------------------------------------- /FlowChartTools/img/arrow0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzt1234hf/FlowChartTools/1f651c289e7ea78347c31079a90577e711be95c1/FlowChartTools/img/arrow0.png -------------------------------------------------------------------------------- /FlowChartTools/img/arrow1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzt1234hf/FlowChartTools/1f651c289e7ea78347c31079a90577e711be95c1/FlowChartTools/img/arrow1.png -------------------------------------------------------------------------------- /FlowChartTools/img/arrow2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzt1234hf/FlowChartTools/1f651c289e7ea78347c31079a90577e711be95c1/FlowChartTools/img/arrow2.png -------------------------------------------------------------------------------- /FlowChartTools/img/arrow3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzt1234hf/FlowChartTools/1f651c289e7ea78347c31079a90577e711be95c1/FlowChartTools/img/arrow3.png -------------------------------------------------------------------------------- /FlowChartTools/img/diamond.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzt1234hf/FlowChartTools/1f651c289e7ea78347c31079a90577e711be95c1/FlowChartTools/img/diamond.png -------------------------------------------------------------------------------- /FlowChartTools/img/file_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzt1234hf/FlowChartTools/1f651c289e7ea78347c31079a90577e711be95c1/FlowChartTools/img/file_add.png -------------------------------------------------------------------------------- /FlowChartTools/img/file_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzt1234hf/FlowChartTools/1f651c289e7ea78347c31079a90577e711be95c1/FlowChartTools/img/file_delete.png -------------------------------------------------------------------------------- /FlowChartTools/img/file_open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzt1234hf/FlowChartTools/1f651c289e7ea78347c31079a90577e711be95c1/FlowChartTools/img/file_open.png -------------------------------------------------------------------------------- /FlowChartTools/img/file_save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzt1234hf/FlowChartTools/1f651c289e7ea78347c31079a90577e711be95c1/FlowChartTools/img/file_save.png -------------------------------------------------------------------------------- /FlowChartTools/img/line.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzt1234hf/FlowChartTools/1f651c289e7ea78347c31079a90577e711be95c1/FlowChartTools/img/line.png -------------------------------------------------------------------------------- /FlowChartTools/img/rectangle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzt1234hf/FlowChartTools/1f651c289e7ea78347c31079a90577e711be95c1/FlowChartTools/img/rectangle.png -------------------------------------------------------------------------------- /FlowChartTools/img/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzt1234hf/FlowChartTools/1f651c289e7ea78347c31079a90577e711be95c1/FlowChartTools/img/settings.png -------------------------------------------------------------------------------- /FlowChartTools/img/trapezoid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzt1234hf/FlowChartTools/1f651c289e7ea78347c31079a90577e711be95c1/FlowChartTools/img/trapezoid.png -------------------------------------------------------------------------------- /FlowChartTools/main.cpp: -------------------------------------------------------------------------------- 1 | #include "mainwindow.h" 2 | #include 3 | 4 | int main(int argc, char *argv[]) 5 | { 6 | QApplication a(argc, argv); 7 | MainWindow w; 8 | w.show(); 9 | 10 | return a.exec(); 11 | } 12 | -------------------------------------------------------------------------------- /FlowChartTools/mainwindow.cpp: -------------------------------------------------------------------------------- 1 | #include "mainwindow.h" 2 | #include "ui_mainwindow.h" 3 | 4 | MainWindow::MainWindow(QWidget *parent) : 5 | QMainWindow(parent), 6 | ui(new Ui::MainWindow) 7 | { 8 | ui->setupUi(this); 9 | connect(ui->chart_rect,SIGNAL(clicked()),ui->flowChart_widget,SLOT(setPaintChart_Rect())); 10 | connect(ui->chart_diam,SIGNAL(clicked()),ui->flowChart_widget,SLOT(setPaintChart_Diamond())); 11 | connect(ui->chart_roundrect,SIGNAL(clicked()),ui->flowChart_widget,SLOT(setPaintChart_RoundRect())); 12 | connect(ui->chart_ellipse,SIGNAL(clicked()),ui->flowChart_widget,SLOT(setPaintChart_Ellipse())); 13 | connect(ui->chart_line,SIGNAL(clicked()),ui->flowChart_widget,SLOT(setPaintChart_Line())); 14 | connect(ui->chart_trapezoid,SIGNAL(clicked()),ui->flowChart_widget,SLOT(setPaintChart_trapezoid())); 15 | 16 | connect(ui->actionOpenFile,SIGNAL(triggered(bool)),ui->flowChart_widget,SLOT(openChartFile())); 17 | connect(ui->actionSaveFile,SIGNAL(triggered(bool)),ui->flowChart_widget,SLOT(saveChartFile())); 18 | connect(ui->actionNewFile,SIGNAL(triggered(bool)),ui->flowChart_widget,SLOT(newChartFile())); 19 | 20 | connect(ui->LineColorButton,SIGNAL(clicked(bool)),this,SLOT(sendSelChartLineColor())); 21 | connect(ui->FillColorButton,SIGNAL(clicked(bool)),this,SLOT(sendSelChartFillColor())); 22 | connect(ui->LineWidthCBox,SIGNAL(currentIndexChanged(int)),ui->flowChart_widget,SLOT(setLineWidth(int))); 23 | connect(ui->LineStartStyleCBox,SIGNAL(currentIndexChanged(int)),ui->flowChart_widget,SLOT(setLineStartStyle(int))); 24 | connect(ui->LineEndStyleCBox,SIGNAL(currentIndexChanged(int)),ui->flowChart_widget,SLOT(setLineEndStyle(int))); 25 | 26 | connect(ui->flowChart_widget,SIGNAL(sendChartStyle(QPen &, QBrush &)),this,SLOT(setFillStyle(QPen &, QBrush &))); 27 | connect(ui->flowChart_widget,SIGNAL(sendLineStyle(QPen &, LINE_HEAD_TYPE &, LINE_HEAD_TYPE &)),this,SLOT(setLineStyle(QPen &, LINE_HEAD_TYPE &, LINE_HEAD_TYPE &))); 28 | connect(ui->flowChart_widget,SIGNAL(disableStyle()),this,SLOT(disableStylePanel())); 29 | connect(ui->flowChart_widget,SIGNAL(updateWindowTitle(const QString &)),this,SLOT(changeWindowTitle(const QString &))); 30 | 31 | //connect(ui->actionCloseFile,SIGNAL(triggered(bool)),ui->flowChart_widget,SLOT(saveChartFile())); 32 | 33 | //ui->abcdef->setGeometryNew(10,10,200,200); 34 | //ui->abcdef->update(); 35 | //ui->flowChart_widget->setStyleSheet(QStringLiteral("background-color: rgb(206, 232, 255);")); 36 | //ui->flowChart_widget->setAttribute(Qt::WA_StyledBackground,true); 37 | //ui->flowChart_widget->update(); 38 | } 39 | 40 | MainWindow::~MainWindow() 41 | { 42 | ui->flowChart_widget->newChartFile(); 43 | delete ui; 44 | } 45 | 46 | void MainWindow::setFillStyle(QPen &qp, QBrush &qb) 47 | { 48 | ui->FillColorGroup->setEnabled(true); 49 | ui->LineColorGroup->setEnabled(true); 50 | ui->FillColorButton->setEnabled(true); 51 | ui->LineColorButton->setEnabled(true); 52 | ui->LineColorButton->setStyleSheet(QString("QPushButton\ 53 | {\ 54 | background-color:rgb(%1,%2,%3);\ 55 | opacity:1;\ 56 | };" 57 | ).arg(qp.color().red()).arg(qp.color().green()).arg(qp.color().blue())); 58 | ui->FillColorButton->setStyleSheet(QString("QPushButton\ 59 | {\ 60 | background-color:rgb(%1,%2,%3);\ 61 | opacity:1;\ 62 | };" 63 | ).arg(qb.color().red()).arg(qb.color().green()).arg(qb.color().blue())); 64 | 65 | } 66 | 67 | void MainWindow::setLineStyle(QPen &qp,LINE_HEAD_TYPE &startLineHeadType, LINE_HEAD_TYPE &endLineHeadTypeb) 68 | { 69 | ui->LineColorGroup->setEnabled(true); 70 | ui->LineWidthGroup->setEnabled(true); 71 | ui->LineStartStyleGroup->setEnabled(true); 72 | ui->LineEndStyleGroup->setEnabled(true); 73 | ui->LineColorButton->setEnabled(true); 74 | ui->LineWidthCBox->setEnabled(true); 75 | ui->LineStartStyleCBox->setEnabled(true); 76 | ui->LineEndStyleCBox->setEnabled(true); 77 | ui->LineColorButton->setStyleSheet(QString("QPlainTextEdit\ 78 | {\ 79 | background-color:rgb(%1,%2,%3);\ 80 | opacity:1;\ 81 | }" 82 | ).arg(qp.color().red()).arg(qp.color().green()).arg(qp.color().blue())); 83 | ui->LineWidthCBox->setCurrentIndex(qp.width()); 84 | ui->LineStartStyleCBox->setCurrentIndex(int(startLineHeadType)); 85 | ui->LineEndStyleCBox->setCurrentIndex(int(endLineHeadTypeb)); 86 | } 87 | 88 | void MainWindow::disableStylePanel() 89 | { 90 | ui->FillColorGroup->setEnabled(false); 91 | ui->LineColorGroup->setEnabled(false); 92 | ui->LineWidthGroup->setEnabled(false); 93 | ui->LineStartStyleGroup->setEnabled(false); 94 | ui->LineEndStyleGroup->setEnabled(false); 95 | ui->LineColorButton->setStyleSheet(QString("QPushButton\ 96 | {\ 97 | opacity:0.9;\ 98 | };")); 99 | ui->FillColorButton->setStyleSheet(QString("QPushButton\ 100 | {\ 101 | opacity:0.9;\ 102 | };")); 103 | } 104 | 105 | void MainWindow::sendSelChartLineColor() 106 | { 107 | QColor color = QColorDialog::getColor(Qt::white,this,tr("设置线条颜色")); 108 | ui->flowChart_widget->setSelChartLineColor(color); 109 | ui->LineColorButton->setStyleSheet(QString("QPushButton\ 110 | {\ 111 | background-color:rgb(%1,%2,%3);\ 112 | opacity:1;\ 113 | };" 114 | ).arg(color.red()).arg(color.green()).arg(color.blue())); 115 | } 116 | 117 | void MainWindow::sendSelChartFillColor() 118 | { 119 | QColor color = QColorDialog::getColor(Qt::white,this,tr("设置填充颜色")); 120 | ui->flowChart_widget->setSelChartFillColor(color); 121 | ui->FillColorButton->setStyleSheet(QString("QPushButton\ 122 | {\ 123 | background-color:rgb(%1,%2,%3);\ 124 | opacity:1;\ 125 | };" 126 | ).arg(color.red()).arg(color.green()).arg(color.blue())); 127 | } 128 | void MainWindow::changeWindowTitle(const QString & title) 129 | { 130 | QString tmp = QString("比图吧 - %1").arg(title); 131 | this->setWindowTitle(tmp); 132 | } 133 | 134 | 135 | -------------------------------------------------------------------------------- /FlowChartTools/mainwindow.h: -------------------------------------------------------------------------------- 1 | #ifndef MAINWINDOW_H 2 | #define MAINWINDOW_H 3 | 4 | #include 5 | #include 6 | #include "comdef.h" 7 | namespace Ui { 8 | class MainWindow; 9 | } 10 | 11 | class MainWindow : public QMainWindow 12 | { 13 | Q_OBJECT 14 | 15 | public: 16 | explicit MainWindow(QWidget *parent = nullptr); 17 | ~MainWindow(); 18 | 19 | private: 20 | Ui::MainWindow *ui; 21 | public slots: 22 | void setFillStyle(QPen &qp, QBrush &qb); 23 | void setLineStyle(QPen &qp, LINE_HEAD_TYPE &startLineHeadType, LINE_HEAD_TYPE &endLineHeadTypeb); 24 | void disableStylePanel(); 25 | void sendSelChartLineColor(); 26 | void sendSelChartFillColor(); 27 | void changeWindowTitle(const QString &); 28 | }; 29 | 30 | #endif // MAINWINDOW_H 31 | -------------------------------------------------------------------------------- /FlowChartTools/mainwindow.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 1270 10 | 820 11 | 12 | 13 | 14 | 比图吧 - Untitle 15 | 16 | 17 | 18 | :/img/MainIco.png:/img/MainIco.png 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 150 27 | 0 28 | 29 | 30 | 31 | 32 | 150 33 | 16777215 34 | 35 | 36 | 37 | true 38 | 39 | 40 | 41 | 42 | 0 43 | 0 44 | 131 45 | 876 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 100 54 | 0 55 | 56 | 57 | 58 | 59 | 200 60 | 16777215 61 | 62 | 63 | 64 | 基础图形 65 | 66 | 67 | 68 | 69 | 70 | 71 | 34 72 | 34 73 | 74 | 75 | 76 | 77 | 34 78 | 34 79 | 80 | 81 | 82 | background-image: url(:/img/Round.png); 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 34 94 | 34 95 | 96 | 97 | 98 | 99 | 34 100 | 34 101 | 102 | 103 | 104 | background-image: url(:/img/Rounded_Rectangle.png); 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 34 116 | 34 117 | 118 | 119 | 120 | 121 | 34 122 | 34 123 | 124 | 125 | 126 | background-image: url(:/img/diamond.png); 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 34 138 | 34 139 | 140 | 141 | 142 | 143 | 34 144 | 34 145 | 146 | 147 | 148 | background-image: url(:/img/rectangle.png); 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 34 160 | 34 161 | 162 | 163 | 164 | 165 | 34 166 | 34 167 | 168 | 169 | 170 | background-image: url(:/img/trapezoid.png); 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 34 182 | 34 183 | 184 | 185 | 186 | 187 | 34 188 | 34 189 | 190 | 191 | 192 | background-image: url(:/img/line.png); 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 0 207 | 200 208 | 209 | 210 | 211 | UML通用 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 0 220 | 500 221 | 222 | 223 | 224 | UML用例图 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | false 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 填充颜色: 251 | 252 | 253 | 254 | 255 | 256 | 257 | false 258 | 259 | 260 | 261 | 50 262 | 0 263 | 264 | 265 | 266 | 267 | 50 268 | 16777215 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | false 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 线宽: 292 | 293 | 294 | 295 | 296 | 297 | 298 | false 299 | 300 | 301 | 302 | 50 303 | 0 304 | 305 | 306 | 307 | 308 | 50 309 | 16777215 310 | 311 | 312 | 313 | false 314 | 315 | 316 | 317 | 1px 318 | 319 | 320 | 321 | 322 | 2px 323 | 324 | 325 | 326 | 327 | 3px 328 | 329 | 330 | 331 | 332 | 4px 333 | 334 | 335 | 336 | 337 | 5px 338 | 339 | 340 | 341 | 342 | 6px 343 | 344 | 345 | 346 | 347 | 7px 348 | 349 | 350 | 351 | 352 | 8px 353 | 354 | 355 | 356 | 357 | 9px 358 | 359 | 360 | 361 | 362 | 10px 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | false 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 线条颜色: 383 | 384 | 385 | 386 | 387 | 388 | 389 | false 390 | 391 | 392 | 393 | 50 394 | 0 395 | 396 | 397 | 398 | 399 | 50 400 | 16777215 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | false 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 起点样式: 424 | 425 | 426 | 427 | 428 | 429 | 430 | false 431 | 432 | 433 | 434 | 50 435 | 0 436 | 437 | 438 | 439 | 440 | 50 441 | 16777215 442 | 443 | 444 | 445 | false 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | :/img/arrow0.png:/img/arrow0.png 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | :/img/arrow1.png:/img/arrow1.png 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | :/img/arrow2.png:/img/arrow2.png 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | :/img/arrow3.png:/img/arrow3.png 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | Qt::Horizontal 492 | 493 | 494 | 495 | 40 496 | 20 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | false 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 终点样式: 514 | 515 | 516 | 517 | 518 | 519 | 520 | false 521 | 522 | 523 | 524 | 50 525 | 0 526 | 527 | 528 | 529 | 530 | 50 531 | 16777215 532 | 533 | 534 | 535 | false 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | :/img/arrow0.png:/img/arrow0.png 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | :/img/arrow1.png:/img/arrow1.png 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | :/img/arrow2.png:/img/arrow2.png 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | :/img/arrow3.png:/img/arrow3.png 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | true 585 | 586 | 587 | 588 | 589 | 0 590 | 0 591 | 2018 592 | 1018 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 2000 601 | 1000 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 0 619 | 0 620 | 1270 621 | 23 622 | 623 | 624 | 625 | 626 | 627 | 比图吧 - Untitle 628 | 629 | 630 | TopToolBarArea 631 | 632 | 633 | false 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | :/img/settings.png:/img/settings.png 645 | 646 | 647 | 设置 648 | 649 | 650 | 651 | 652 | 653 | :/img/file_open.png:/img/file_open.png 654 | 655 | 656 | 打开文件 657 | 658 | 659 | 打开文件 660 | 661 | 662 | Ctrl+O 663 | 664 | 665 | 666 | 667 | 668 | :/img/file_add.png:/img/file_add.png 669 | 670 | 671 | 新建文件 672 | 673 | 674 | 新建文件 675 | 676 | 677 | Ctrl+N 678 | 679 | 680 | 681 | 682 | 683 | :/img/file_delete.png:/img/file_delete.png 684 | 685 | 686 | 关闭文件 687 | 688 | 689 | 关闭文件 690 | 691 | 692 | Ctrl+D 693 | 694 | 695 | 696 | 697 | 698 | :/img/file_save.png:/img/file_save.png 699 | 700 | 701 | 保存文件 702 | 703 | 704 | 保存文件 705 | 706 | 707 | Ctrl+S 708 | 709 | 710 | 711 | 712 | 713 | 714 | FlowChart 715 | QWidget 716 |
flowchart.h
717 | 1 718 |
719 |
720 | 721 | 722 | 723 | 724 |
725 | -------------------------------------------------------------------------------- /FlowChartTools/res.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | img/diamond.png 4 | img/rectangle.png 5 | img/Round.png 6 | img/Rounded_Rectangle.png 7 | img/settings.png 8 | img/trapezoid.png 9 | img/line.png 10 | img/file_add.png 11 | img/file_delete.png 12 | img/file_open.png 13 | img/file_save.png 14 | img/arrow0.png 15 | img/arrow1.png 16 | img/arrow2.png 17 | img/arrow3.png 18 | img/MainIco.png 19 | 20 | 21 | -------------------------------------------------------------------------------- /FlowChartTools/test1.fct: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzt1234hf/FlowChartTools/1f651c289e7ea78347c31079a90577e711be95c1/FlowChartTools/test1.fct -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FlowChartTool 2 | Flow Chart Tool,使用QT开发的跨平台(Windows、Linux)流程图绘制工具 3 | 4 | ## 说明 5 | - 本软件是一个课程的作业,如有Bug请轻喷 6 | 7 | ## 开发环境 8 | - 操作系统:使用了Windows 10 和 Ubuntu 16 9 | - 编译工具:使用了`QT Creator 4.7.1`可视化IDE和`QT 5.11.2`开发库 10 | 11 | ## 源码编译程序 12 | 1. Pull此工程到本地 13 | 2. 安装QT环境,QT下载地址:[http://download.qt.io/archive/qt/](http://download.qt.io/archive/qt/),勾选相应的编译器 14 | ![Alt text](images/0.jpg) 15 | 3. 使用QT打开FlowChartTools文件夹下的FlowChartTools.pro工程文件 16 | 4. 配置环境,Windows10下配置MSVC2017编译器,Ubuntu16下配置MinGW编译器,Ubuntu16如下,Win10同理 17 | ![Alt text](images/1.png) 18 | 5. 编译、调试、运行 19 | 20 | ## 程序界面和演示 21 | ![Alt text](images/2.png) 22 | ![Alt text](images/3.jpg) 23 | ![Alt text](images/4.jpg) 24 | ![Alt text](images/x.gif) 25 | ## 程序详细文档 26 | - 详见./doc目录 27 | -------------------------------------------------------------------------------- /doc/流程图设计工具.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzt1234hf/FlowChartTools/1f651c289e7ea78347c31079a90577e711be95c1/doc/流程图设计工具.docx -------------------------------------------------------------------------------- /images/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzt1234hf/FlowChartTools/1f651c289e7ea78347c31079a90577e711be95c1/images/0.jpg -------------------------------------------------------------------------------- /images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzt1234hf/FlowChartTools/1f651c289e7ea78347c31079a90577e711be95c1/images/1.png -------------------------------------------------------------------------------- /images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzt1234hf/FlowChartTools/1f651c289e7ea78347c31079a90577e711be95c1/images/2.png -------------------------------------------------------------------------------- /images/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzt1234hf/FlowChartTools/1f651c289e7ea78347c31079a90577e711be95c1/images/3.jpg -------------------------------------------------------------------------------- /images/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzt1234hf/FlowChartTools/1f651c289e7ea78347c31079a90577e711be95c1/images/4.jpg -------------------------------------------------------------------------------- /images/img: -------------------------------------------------------------------------------- 1 | 存放ReadMe图片 2 | -------------------------------------------------------------------------------- /images/x.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hzt1234hf/FlowChartTools/1f651c289e7ea78347c31079a90577e711be95c1/images/x.gif --------------------------------------------------------------------------------