QT_校园导航Update

本文介绍了一个基于Qt的图形用户界面应用,该应用实现了Dijkstra最短路径算法,并允许用户通过选择不同的起点和终点来查找校园地图上的最短路径。文章详细展示了如何创建界面元素、设置地图场景以及算法的具体实现。

 1 //MainWidget.h
 2 
 3 #ifndef MAINWINDOW_H
 4 #define MAINWINDOW_H
 5 
 6 #include <QMainWindow>
 7 #include "mapwidget.h"
 8 #include <QToolButton>
 9 #include <QGraphicsLineItem>
10 #include <QGraphicsScene>
11 #include <QGraphicsView>
12 #include <QLabel>
13 #include <QComboBox>
14 #include <QSpinBox>
15 #include <QTextEdit>
16 #include <QPainter>
17 #include <QVector>
18 
19 class MainWindow : public QMainWindow
20 {
21     Q_OBJECT
22 public:
23     MainWindow(QWidget *parent = 0);
24     ~MainWindow();
25     void createToolBar();
26     void paintEvent (QPaintEvent *);
27     void setStart(int X, int Y);
28     void setEnd(int X, int Y);
29     void setNextPos (int index);
30     void initScene();
31 public slots:
32     void setStartStation();
33     void setEndStation();
34     void FindPath();
35     void Clear();
36 private:
37     MapWidget *mapWidget;
38     QLabel *startLabel;
39     QLabel *endLabel;
40     QComboBox *startComboBox;
41     QComboBox *endComboBox;
42     QToolButton *findPathBtn;
43     QToolButton *clearBtn;
44 
45     QGraphicsScene *scene;
46     QGraphicsView *view;
47 
48     int startX, startY, endX, endY;
49     QVector<int> nextPath;
50 
51     struct ArcCell{  //弧信息
52         int adj;     //对无权图有1,0表示是否相邻,对带权图,则为权值类型
53     //    string info; //该弧的相关信息
54     };
55 
56     //内部类
57     static const int MAX_VERTEX_NUM = 31;
58     static const int INF = 999999;
59 
60     struct MGraph{
61         QVector<int> vexs;                                    //顶点集合
62         //临接矩阵
63         ArcCell arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
64         int vexnum;                                           //顶点数
65         int arcnum;                                           //边数
66     //    int kind;                                           //图的类型
67     };
68 
69     
70     
71 
72     class DijkstraFindPath
73     {
74     public:
75         DijkstraFindPath();
76         MGraph mgraph;
77         void CreateGraph();
78 //        void ShortestPath(int v0, PathMatrix &path, ShortPathTable &DP, int prev[]);
79         int prev[MAX_VERTEX_NUM];  //最短路上的前驱顶点
80         int d[MAX_VERTEX_NUM];     //表示边e = (u,v)的权值(不存在时为INF,不过d[i][i]=0)
81         bool used[MAX_VERTEX_NUM]; //已经使用过的图
82         void dijkstra(int startPos);      //求从起点startPos出发到各个顶点的最短距离
83         QVector<int> get_Path(int endPos);//到顶点endPos的最短路
84     };
85 
86     DijkstraFindPath *dj;
87 };
88 
89 #endif // MAINWINDOW_H
  1 //MainWidget.cpp
  2 //最短路径算法,和界面的实现
  3 
  4 #include "mainwindow.h"
  5 #include <qdebug.h>
  6 #include <QToolBar>
  7 #include <QtAlgorithms>
  8 #include <iostream>
  9 
 10 MainWindow::MainWindow(QWidget *parent)
 11     : QMainWindow(parent)
 12 {
 13 //    mapWidget = new MapWidget;
 14 //    painter = new QPainter();
 15     dj = new MainWindow::DijkstraFindPath();
 16     dj->CreateGraph ();
 17 
 18     scene = new QGraphicsScene;
 19     scene->setSceneRect (-100, -100, 700, 700);
 20     initScene();
 21 
 22     view = new QGraphicsView;
 23     view->setScene (scene);
 24     view->setMinimumSize (800, 800);
 25     view->show ();
 26     setCentralWidget (view);
 27 
 28     createToolBar ();  //实现一个工具栏
 29 //    setCentralWidget (mapWidget);
 30 //    setMinimumSize (600, 400);  //设置最小尺寸
 31 }
 32 
 33 MainWindow::DijkstraFindPath::DijkstraFindPath()
 34 {
 35     mgraph.vexnum = 31;                      //初始化点数目
 36        for (int i = 0; i < mgraph.vexnum; i++) //初始化点编号
 37            mgraph.vexs.push_back (i);
 38        mgraph.arcnum = 80;                     //暂定
 39        for (int i = 0; i < mgraph.vexnum; i++) {
 40            for (int j = 0; j < mgraph.vexnum; j++) {
 41                if (i == j)
 42                    mgraph.arcs[i][j].adj = 0;
 43                else
 44                    mgraph.arcs[i][j].adj = INF;
 45    //            mgraph.arcs[i][j].info = "";
 46            }
 47        }
 48 }
 49 
 50 void MainWindow::DijkstraFindPath::CreateGraph ()
 51 {
 52         mgraph.arcs[0][1].adj = mgraph.arcs[1][0].adj = 45;    //6 - 5
 53         mgraph.arcs[0][6].adj = mgraph.arcs[6][0].adj = 165;   //6 - 10
 54         mgraph.arcs[1][2].adj = mgraph.arcs[2][1].adj = 45;    //5 - 4
 55         mgraph.arcs[2][3].adj = mgraph.arcs[3][2].adj = 45;    //4 - 3
 56         mgraph.arcs[3][4].adj = mgraph.arcs[4][3].adj = 45;    //3 - 2
 57         mgraph.arcs[3][15].adj = mgraph.arcs[15][3].adj = 24;  //3 - 22
 58         mgraph.arcs[4][5].adj = mgraph.arcs[5][4].adj = 45;    //2 - 1
 59         mgraph.arcs[13][15].adj = mgraph.arcs[15][13].adj = 85;//23 - 22
 60         mgraph.arcs[0][13].adj = mgraph.arcs[13][0].adj = 55;  //6 - 23
 61         mgraph.arcs[13][2].adj = mgraph.arcs[2][13].adj = 50;  //23 - 4
 62         mgraph.arcs[5][11].adj = mgraph.arcs[11][5].adj = 65;  //1 - 一食堂
 63         mgraph.arcs[11][12].adj = mgraph.arcs[12][11].adj = 10;//一食堂-操场
 64         mgraph.arcs[11][27].adj = mgraph.arcs[27][11].adj = 85;//一食堂-祁通1
 65         mgraph.arcs[27][28].adj = mgraph.arcs[28][27].adj = 85;//祁通1-祁通2(路口)
 66         mgraph.arcs[5][29].adj = mgraph.arcs[29][5].adj = 87;  //一食堂-岔路口
 67         mgraph.arcs[29][9].adj = mgraph.arcs[9][29].adj = 80;  //岔路-7
 68         mgraph.arcs[29][11].adj = mgraph.arcs[11][29].adj = 60;//一食堂到岔路(通向7号楼的)
 69         mgraph.arcs[29][30].adj = mgraph.arcs[30][29].adj = 32;//岔路-祁通大道
 70         mgraph.arcs[30][10].adj = mgraph.arcs[10][30].adj = 90;//祁通大道-图书馆
 71         mgraph.arcs[30][28].adj = mgraph.arcs[28][30].adj = 80;//祁通大道-祁通2
 72         mgraph.arcs[28][26].adj = mgraph.arcs[26][28].adj = 15;//祁通2-方肇周
 73         mgraph.arcs[25][27].adj = mgraph.arcs[27][25].adj = 273;    //西大门-祁通1
 74         mgraph.arcs[27][28].adj = mgraph.arcs[28][27].adj = 184;//祁通1-祁通2
 75 //        mgraph.arcs[25][12].adj = mgraph.arcs[12][25].adj = 108; //西大门-西操
 76         mgraph.arcs[5][12].adj = mgraph.arcs[12][5].adj = 70;  //1 - 操场
 77         mgraph.arcs[6][7].adj = mgraph.arcs[7][6].adj = 45;    //10 - 9
 78         mgraph.arcs[7][8].adj = mgraph.arcs[8][7].adj = 45;    //9 - 8
 79         mgraph.arcs[8][9].adj = mgraph.arcs[9][8].adj = 45;    //8 - 7
 80         mgraph.arcs[9][10].adj = mgraph.arcs[10][9].adj = 150; //7 - 图书馆
 81         mgraph.arcs[6][14].adj = mgraph.arcs[14][6].adj = 140; //10 - 13
 82         mgraph.arcs[14][16].adj = mgraph.arcs[16][14].adj = 39;//13 - 12
 83         mgraph.arcs[14][17].adj = mgraph.arcs[17][14].adj = 39;//13 - 16
 84         mgraph.arcs[16][18].adj = mgraph.arcs[18][16].adj = 39;//12 - 15
 85         mgraph.arcs[17][18].adj = mgraph.arcs[18][17].adj = 39;//16 - 15
 86         mgraph.arcs[18][19].adj = mgraph.arcs[19][18].adj = 39;//15 - 14
 87         mgraph.arcs[17][20].adj = mgraph.arcs[20][17].adj = 137;//16 - 19
 88         mgraph.arcs[20][21].adj = mgraph.arcs[21][20].adj = 39; //19 - 18
 89         mgraph.arcs[21][22].adj = mgraph.arcs[22][21].adj = 39; //18 - 17
 90         mgraph.arcs[19][22].adj = mgraph.arcs[22][19].adj = 130;//14 - 17
 91         mgraph.arcs[22][23].adj = mgraph.arcs[23][22].adj = 53; //17 - 二超
 92         mgraph.arcs[23][24].adj = mgraph.arcs[24][23].adj = 5;  //二超 - 二食堂
 93         mgraph.arcs[24][10].adj = mgraph.arcs[10][24].adj = 260;//二食堂-图书馆
 94 
 95         //以下处理细节
 96 
 97 
 98         mgraph.arcnum = 80;
 99 }
100 
101 void MainWindow::DijkstraFindPath::dijkstra (int startPos)
102 {
103     for (int i = 0; i < mgraph.vexnum; i++) d[i] = INF;
104     for (int i = 0; i < mgraph.vexnum; i++) used[i] = false;
105     for (int i = 0; i < mgraph.vexnum; i++) prev[i] = -1;
106     d[startPos] = 0;
107 
108     while (true) {
109         int v = -1;
110         for (int u = 0; u < mgraph.vexnum; u++) {
111             if (!used[u] && (v == -1 || d[u] < d[v])) v = u;
112         }
113 
114         if (v == -1) break;
115         used[v] = true;
116 
117         for (int u = 0; u < mgraph.vexnum; u++) {
118             if (d[u] > d[v] + mgraph.arcs[v][u].adj) {
119                 d[u] = d[v] + mgraph.arcs[v][u].adj;
120                 prev[u] = v;
121             }
122         }
123     }
124 }
125 
126 QVector<int> MainWindow::DijkstraFindPath::get_Path (int endPos)
127 {
128     QVector<int> path;
129 
130     for ( ; endPos != -1; endPos = prev[endPos]) {
131 //        std::cout << "EndPos: " << endPos << ", ";
132         path.push_back (endPos);
133     }
134 
135     std::reverse(path.begin (), path.end ());
136 
137     return path;
138 }
139 
140 void MainWindow::initScene ()
141 {
142     QGraphicsPixmapItem *item =
143             scene->addPixmap (QPixmap("NanTong.jpg"));
144 //    item->setFlag (QGraphicsItem::ItemIsMovable);
145     item->setPos (-500, -420);
146 }
147 
148 MainWindow::~MainWindow()
149 {
150 
151 }
152 
153 void MainWindow::createToolBar ()
154 {
155     QToolBar *toolBar = addToolBar ("Tool");
156     startLabel = new QLabel(tr("起点: "));
157     startComboBox = new QComboBox;
158     startComboBox->addItem (tr("公寓6号楼"));  //0
159     startComboBox->addItem (tr("公寓5号楼"));  //1
160     startComboBox->addItem (tr("公寓4号楼"));  //2
161     startComboBox->addItem (tr("公寓3号楼"));  //3
162     startComboBox->addItem (tr("公寓2号楼"));  //4
163     startComboBox->addItem (tr("公寓1号楼"));  //5
164 
165     startComboBox->addItem (tr("公寓10号楼")); //6
166     startComboBox->addItem (tr("公寓9号楼"));  //7
167     startComboBox->addItem (tr("公寓8号楼"));  //8
168     startComboBox->addItem (tr("公寓7号楼"));  //9
169     startComboBox->addItem (tr("图书馆"));     //10
170     startComboBox->addItem (tr("一食堂")); startComboBox->addItem (tr("西操场"));  //11 12
171     startComboBox->addItem (tr("公寓23号楼")); startComboBox->addItem (tr("公寓13号楼")); //13 14
172     startComboBox->addItem (tr("公寓22号楼")); startComboBox->addItem (tr("公寓12号楼")); //15 16
173     startComboBox->addItem (tr("公寓楼16")); startComboBox->addItem (tr("公寓楼15"));     //17 18
174     startComboBox->addItem (tr("公寓楼14"));  startComboBox->addItem (tr("公寓楼19"));    //19 20
175     startComboBox->addItem (tr("公寓楼18")); startComboBox->addItem (tr("公寓楼17"));     //21 22
176     startComboBox->addItem (tr("二超")); startComboBox->addItem (tr("二食堂"));           //23 24
177     startComboBox->addItem (tr("西大门")); startComboBox->addItem (tr("方肇周教学楼"));    //25 26
178 
179     endLabel = new QLabel(tr("\t终点: "));
180 
181     endComboBox = new QComboBox;
182     endComboBox->addItem (tr("公寓6号楼"));
183     endComboBox->addItem (tr("公寓5号楼"));
184     endComboBox->addItem (tr("公寓4号楼"));
185     endComboBox->addItem (tr("公寓3号楼"));
186     endComboBox->addItem (tr("公寓2号楼"));
187     endComboBox->addItem (tr("公寓1号楼"));
188     endComboBox->addItem (tr("公寓10号楼"));
189     endComboBox->addItem (tr("公寓9号楼"));
190     endComboBox->addItem (tr("公寓8号楼"));
191     endComboBox->addItem (tr("公寓7号楼"));
192     endComboBox->addItem (tr("图书馆"));
193     endComboBox->addItem (tr("一食堂"));    endComboBox->addItem (tr("西操场"));
194     endComboBox->addItem (tr("公寓23号楼"));endComboBox->addItem (tr("公寓13号楼"));
195     endComboBox->addItem (tr("公寓22号楼"));endComboBox->addItem (tr("公寓12号楼"));
196     endComboBox->addItem (tr("公寓楼16"));  endComboBox->addItem (tr("公寓楼15"));
197     endComboBox->addItem (tr("公寓楼14"));  endComboBox->addItem (tr("公寓楼19"));
198     endComboBox->addItem (tr("公寓楼18"));  endComboBox->addItem (tr("公寓楼17"));
199     endComboBox->addItem (tr("二超"));      endComboBox->addItem (tr("二食堂"));
200     endComboBox->addItem (tr("西大门"));    endComboBox->addItem (tr("方肇周教学楼"));
201 
202     connect (startComboBox, SIGNAL(activated(int)), this, SLOT(setStartStation()));
203     connect (endComboBox, SIGNAL(activated(int)), this, SLOT(setEndStation()));
204 
205     findPathBtn = new QToolButton;
206     findPathBtn->setText (tr("\t\t绘制最短路径"));
207 
208     connect (findPathBtn, SIGNAL(clicked(bool)), this, SLOT(FindPath()));
209 
210     clearBtn = new QToolButton;
211     clearBtn->setText (tr("\t\t清除"));
212 
213     connect (clearBtn, SIGNAL(clicked(bool)), this, SLOT(Clear()));
214 
215     toolBar->addWidget (startLabel);
216     toolBar->addWidget (startComboBox);
217     toolBar->addWidget (endLabel);
218     toolBar->addWidget (endComboBox);
219     toolBar->addWidget (findPathBtn);
220     toolBar->addWidget (clearBtn);
221 }
222 
223 void MainWindow::setStart(int X, int Y) {
224     startX = X; startY = Y;
225 //    qDebug() << X << ", " << Y;
226 }
227 
228 void MainWindow::setEnd (int X, int Y)
229 {
230     endX = X; endY = Y;
231 }
232 
233 void MainWindow::setStartStation ()
234 {
235     switch (startComboBox->currentIndex ()) {
236     case 0:
237         setStart(-660, -534); break;
238     case 1:
239         setStart (-673, -490); break;
240     case 2:
241         setStart (-682, -446); break;
242     case 3:
243         setStart (-690, -400); break;
244     case 4:
245         setStart (-701, -355); break;
246     case 5:
247         setStart (-711, -310); break;
248     case 6:
249         setStart (-457, -555); break;
250     case 7:
251         setStart (-449, -485); break;
252     case 8:
253         setStart(-446, -432); break;
254     case 9:
255         setStart (-451, -400); break;
256     case 10:
257         setStart (-347, -353); break;
258     case 11:
259         setStart (-720, -247); break;
260     case 12:
261         setStart (-789, -252); break;
262     case 13:
263         setStart (-721, -517); break;
264     case 14:
265         setStart (-271, -540); break;
266     case 15:
267         setStart (-721, -439); break;
268     case 16:
269         setStart (-274, -495); break;
270     case 17:
271         setStart (-180, -552); break;
272     case 18:
273         setStart (-178, -508); break;
274     case 19:
275         setStart (-179, -456); break;
276     case 20:
277         setStart (-73, -549); break;
278     case 21:
279         setStart (-56, -500); break;
280     case 22:
281         setStart (-59, -448); break;
282     case 23:
283         setStart (-94, -381); break;
284     case 24:
285         setStart (-69, -351); break;
286     case 25:
287         setStart (-1070, -92); break;
288     case 26:
289         setStart (-438, -125); break;
290     case 27:
291         setStart (-721, -119); break;
292     case 28:
293         setStart (-550, -122); break;
294     case 29:
295         setStart (-555, -263); break;
296     case 30:
297         setStart (-498, -235); break;
298     default:
299         break;
300     }
301 }
302 
303 void MainWindow::setEndStation ()
304 {
305     switch (endComboBox->currentIndex ()) {
306     case 0:
307         setEnd(-660, -534); break;
308     case 1:
309         setEnd (-673, -490); break;
310     case 2:
311         setEnd (-682, -446); break;
312     case 3:
313         setEnd (-690, -400); break;
314     case 4:
315         setEnd (-701, -355); break;
316     case 5:
317         setEnd (-711, -310); break;
318     case 6:
319         setEnd (-457, -555); break;
320     case 7:
321         setEnd (-449, -485); break;
322     case 8:
323         setEnd (-446, -432); break;
324     case 9:
325         setEnd (-451, -400); break;
326     case 10:
327         setEnd (-347, -353); break;
328     case 11:
329         setEnd (-720, -247); break;
330     case 12:
331         setEnd (-789, -252); break;
332     case 13:
333         setEnd (-721, -517); break;
334     case 14:
335         setEnd (-271, -540); break;
336     case 15:
337         setEnd (-721, -439); break;
338     case 16:
339         setEnd (-274, -495); break;
340     case 17:
341         setEnd (-180, -552); break;
342     case 18:
343         setEnd (-178, -508); break;
344     case 19:
345         setEnd (-179, -456); break;
346     case 20:
347         setEnd (-73, -549); break;
348     case 21:
349         setEnd (-56, -500); break;
350     case 22:
351         setEnd (-59, -448); break;
352     case 23:
353         setEnd (-94, -381); break;
354     case 24:
355         setEnd (-69, -351); break;
356     case 25:
357         setEnd (-1070, -92); break;
358     case 26:
359         setEnd (-438, -125); break;
360     case 27:
361         setEnd (-721, -119); break;
362     case 28:
363         setEnd (-550, -122); break;
364     case 29:
365         setEnd (-555, -263); break;
366     case 30:
367         setEnd (-498, -235); break;
368     default:
369         break;
370     }
371 }
372 
373 void MainWindow::setNextPos (int index)
374 {
375     switch (index) {
376     case 0:
377         setEnd(-660, -534); break;
378     case 1:
379         setEnd (-673, -490); break;
380     case 2:
381         setEnd (-682, -446); break;
382     case 3:
383         setEnd (-690, -400); break;
384     case 4:
385         setEnd (-701, -355); break;
386     case 5:
387         setEnd (-711, -310); break;
388     case 6:
389         setEnd (-457, -555); break;
390     case 7:
391         setEnd (-449, -485); break;
392     case 8:
393         setEnd (-446, -432); break;
394     case 9:
395         setEnd (-451, -400); break;
396     case 10:
397         setEnd (-347, -353); break;
398     case 11:
399         setEnd (-720, -247); break;
400     case 12:
401         setEnd (-789, -252); break;
402     case 13:
403         setEnd (-721, -517); break;
404     case 14:
405         setEnd (-271, -540); break;
406     case 15:
407         setEnd (-721, -439); break;
408     case 16:
409         setEnd (-274, -495); break;
410     case 17:
411         setEnd (-180, -552); break;
412     case 18:
413         setEnd (-178, -508); break;
414     case 19:
415         setEnd (-179, -456); break;
416     case 20:
417         setEnd (-73, -549); break;
418     case 21:
419         setEnd (-56, -500); break;
420     case 22:
421         setEnd (-59, -448); break;
422     case 23:
423         setEnd (-94, -381); break;
424     case 24:
425         setEnd (-69, -351); break;
426     case 25:
427         setEnd (-1070, -92); break;
428     case 26:
429         setEnd (-438, -125); break;
430     case 27:
431         setEnd (-721, -119); break;
432     case 28:
433         setEnd (-550, -122); break;
434     case 29:
435         setEnd (-555, -263); break;
436     case 30:
437         setEnd (-498, -235); break;
438     default:
439         break;
440     }
441 }
442 
443 void MainWindow::FindPath ()
444 {
445     //Demo 在图片上绘线 在原有基础上 (+700, +440);
446     QVector<QPoint> v;
447 
448     dj->dijkstra (startComboBox->currentIndex ());
449     //设置下一处的终点
450     nextPath = dj->get_Path (endComboBox->currentIndex ());
451 
452     //准备绘制
453     Clear ();
454     //将路线绘制下来
455     QGraphicsPathItem *item = new QGraphicsPathItem();
456 
457     QPen pen;
458     pen.setWidth (4);
459     pen.setColor (Qt::red);
460     item->setPen (pen);
461     item->setFlag (QGraphicsItem::ItemIsPanel);
462 
463 //    qDebug() << startX << " " << startY << " " << endX << " " << endY;
464 
465 //    qDebug() << "Hello World !";
466 
467     //设置起点
468 //    v << QPoint(startX + 700, startY + 440);
469 
470     for (int i = 1; i < nextPath.size (); i++) {
471         qDebug() << nextPath[i] << " , ";
472     }
473     scene->addItem (item);
474 
475     QPainterPath pa;               //path
476 //    setNextPos (nextPath[1]);
477 //    item->setLine (startX + 700, startY + 440, endX + 700, endY + 440);
478     pa.moveTo (startX + 700, startY + 440);
479 
480     for (int i = 1; i < nextPath.size() ; i++) {
481         setNextPos (nextPath[i]);
482         pa.lineTo (endX + 700, endY + 440);
483     }
484     item->setPath (pa);
485 
486 }
487 
488 void MainWindow::Clear ()
489 {
490     QList<QGraphicsItem*> listItem = scene->items ();
491     while (!listItem.empty ())
492     {
493         scene->removeItem (listItem.at (0));
494         listItem.removeAt (0);
495     }
496     QGraphicsPixmapItem *item =
497             scene->addPixmap (QPixmap("NanTong.jpg"));
498 //    item->setFlag (QGraphicsItem::ItemIsMovable);
499     item->setPos (-500, -420);
500 }
501 
502 void MainWindow::paintEvent (QPaintEvent *)
503 {
504 
505 }
 1 //Main.cpp
 2 #include "mainwindow.h"
 3 #include "mapwidget.h"
 4 #include <QApplication>
 5 #include <QFont>
 6 #include <QDebug>
 7 
 8 int main(int argc, char *argv[])
 9 {
10     QApplication a(argc, argv);
11     QFont font("ARPL KaitiM GB", 12);
12     font.setBold (true);
13     a.setFont (font);
14 
15     qDebug() << "Run............";
16     MainWindow w;
17     w.show ();
18 
19 
20     return a.exec();
21 }

 

转载于:https://www.cnblogs.com/douzujun/p/6262642.html

用c++/qt写的项目,项目都经测试过,真实可靠,可供自己学习c++/qtQt是一个用标准C++编写的跨平台开发类库,它对标准C++进行了扩展,引入了元对象系统、信号与槽、属性等特性,使应用程序的开发变得更高效。 Qt类库中大量的类以模块形式分类组织的,包括基本模块和扩展模块等。一个模块通常就是一个编程主题,如数据库、图表、网络等。 一、Qt核心特点 1.1.概述 Qt本身并不是一种编程语言,它本质上是一个跨平台的C++开发类库,是用标准C++编写的类库,它为开发GUI应用程序和非GUI应用程序提供了各种类。 Qt对标准C++进行了扩展,引入了一些新概念和功能,例如信号和槽、对象属性等。Qt的元对象编译器(Meta-Object Compiler,MOC)是一个预处理器,在源程序被编译前先将这些Qt特性的程序转换为标准C++兼容的形式,然后再由标准C++编译器进行编译。这就是为什么在使用信号与槽机制的类里,必须添加一个Q_OBJECT宏的原因,只有添加了这个宏,moc才能对类里的信号与槽的代码进行预处理。 Qt Core模块是Qt类库的核心,所有其他模块都依赖于此模块,如果使用qmake来构建项目,Qt Core模块则是被自动加入的。 Qt为C++语言增加的特性就是在Qt Core模块里实现的,这些扩展特性由Qt的元对象系统实现,包括信号与槽机制、属性系统、动态类型转换等。 1.2.元对象系统 Qt的元对象系统(Meta-Object-System)提供了对象之间通信的信号与槽机制、运行时类型信息和动态属性系统。 元对象系统由以下三个基础组成: 1.QObject类是所有使用元对象系统的类的基类; 2.在一个类的private部分声明Q_OBJECT宏,使得类可以使用元对象的特性,如动态属性、信号与槽。 3.MOC(元对象编译器)为每个QObject的子类提供必要的代码来实现元对象系统的特征。 构建项目时,MOC工具读取C++源文件,当它发现类的定义里有Q_OBJECT宏时,它就会为这个类生成另外一个包含有元对象支持代码的C++源文件,这个生成的源文件连同类的实现文件一起被编译和连接。 除了信号和槽机制外,元对象还提供如下一些功能。 1.QObject::metaObject()函数返回类关联的元对象,元对象类QMetaObject包含了访问元对象的一些接口函数,例如QMetaObject::className()函数可在运行时返回类的名称字符串。 QObject obj=new QPushButton; obj->metaObject()->className(); 2.QMetaObject::newInstance()函数创建类的一个新的实例。 3.QObject::inherits(const charclassName)函数判断一个对象实例是否是名称为className的类或QObject的子类的实例。 1.3.属性系统 1.属性定义 Qt提供一个Q_PROPERTY()宏可以定义属性,它也是属于元对象系统实现的。Qt的属性系统与C++编译器无关,可以用任何标准的C++编译器编译定义了属性的Qt C++程序。 2.属性的使用 不管是否用READ和WRITE定义了接口函数,只要知道属性名称,就可以通过QObject::property()读取属性值,并通过QObject::setProperty()设置属性值。 3.动态属性 QObject::setProperty()函数可以在运行时为类定义一个新的属性,称之为动态属性。动态属性是针对类的实例定义的。 动态属性可以使用QObject::property()查询,就如在类定义里用Q_PROPERTY宏定义的属性一样。 例如,在数据表编辑界面上,一些字段是必填字段,就可以在初始化界面时为这些字段的关联显示组件定义一个新的required属性,并设置值为“true"。 4.类的附加信息 属性系统还有一个宏Q_CLASSINFO(),可以为类的元对象定义”名称——值“信息。
实现简单的查询,各风景的查询,调用各函数,实现课程设计的目标。其中包含三个功能,一个是直接进入导航系统,利用主函数中已有的数据,进行查询:一个是进行创建数据,本程序中初始数据为农大的导航数据,如果需要也可以自己建立一个;最后一个是退出功能。设计该函数的目的是为了能够多次得应用dijkstra函数进行查询最短路径。同时该函数可以列出各景点的代号和对应的名称,这样大家只要输入代号就行了。方便进行查询。下面分别描述这些函数,建立它们函数原型。 1、主函数 函数原型:void main(void) 功 能:控制程序。 参 数:void 返 回 值:void 要 求:管理菜单命令并完成初始化。 2、菜单选择和处理函数 函数原型:int menu() 功 能:处理选择的菜单命令并接收用户选择的命令代码。 参 数:int 返 回 值:int 工作方式:返回命令代码的整数值,根据命令,调用相应函数。 要 求:只允许选择规定键,如果输入不合要求,则提醒用户重新输入。 3、建立邻接矩阵函数 函数原型:void createadj() 功 能:重新建立一个学生信息的记录。 参 数:void 返 回 值:void 工作方式:在需要的时候就可以有主菜单中调用 void createadj()函数。 要 求:必需输入信息记录,然后才能调用出search()函数进行查询。 4、dijkstra函数 函数原型:void dijkstra(intx,inty) 功 能:求两点间的最短路径 参 数:void 返 回 值:void 工作方式: 该函数被其它一些函数调用。 5、结束程序 函数原型:int Exit() 功 能:使程序正常结束运行 参 数:int 返 回 值:1 工作方式:在操作都完成后,可以调用int Exit()函数,使函数最终返回 1 运行exit(1),程序正常结束。 要 求:运行Exit()函数后可以选择是否要保存,选择y则先保存再返 回1值;如果选择n直接返回1值。详细的程序设计应从下到上,在本设计中就要先设计createadj函数;然后设计dijkstra函数;接着是search函数;menu函数;最后才是main函数。如此设计能大大提升设计速度,因为从下往上使编程时的高试过程简单许多,而做课程设计花费时间最多的就是调试过程。对于各函数的详细设计,各函数的N—S图如下: (1)Createadj函数 (2)Dijkstra函数          (3)Search函数          (4)Menu函数          (5)main函数          2.4 程序编码   把详细设计的结果进一步求精为程序设计语言程序。同时加入一些注解和断言,使程序中逻辑概念清楚;编写过程中参考各种的教材和材料,使程序编写的正确性大有提高,同时也许到许多实践知识,增加了实践经验。 2.5 程序调试与测试    程序编写总是出现各种各样的错误,但是难点不是修改错误,而是找出错误。在大量的源程序中找出错误难度很大,但有了一定的方法,就能节省大量的时间,在这次课程设计中我运用的调试方法主要有2种:     一是借助调试工具。利用Turbo C中提供的程序专门调试工具Debugger程序,可以很容易找出程序中的各种语法错误。但是遇到一些逻辑错误时却又无从着手。这时我就用下面一种方法。     二是在程序中插入打印语句。猜测出大致的错误位置,选则一些主要变量,在关键部位插入打印语句,打印出这个主要变量,看其是否与理论上的一样,在多个位置插入,如果有个位置的值与理论值一样,另一个位置与理论值不一样,则错误就落在这两个位置之间,然后再多测试几个位置缩小范围,直到找出错误。  例如;我在调试main()主函数时,程序能够运行,三个选项都能选择,创建函数能够正常运行,也能正常退出,但在选第一条进入校园导航后,打印出来的列表却是空的,源程序中的初始化数据没有显示出来,我又尝试输入两个结点进行查找,发现没有输出路线,所以我猜测初始化数据没有被正常写入。但不知道为何没有被正常写入,首先怀疑是初始化时附值发生错误,查阅各种资料进行校验,发现没有错误。后来经过综合分析,发现最有可能是n值在search()函数中发生错误,于是我在search()函数中插入打印n 的语句,运行后发现输出的n为0,初始化数据中有11个结点,n应该为11,所以n 在这个地方发生错误,我又在main()主函数中打印出n 的值,n=11,是正确的。所以错误就在search()函数中,也就说是当运行case1,运行到search()函数时,n从11变为0,针对这个错误,我把变量n改为宏定义,因为n 是代表结点个数,不管在哪个函数中它的值都是一样的才对。改完后运行程序,成功! 本设计文件的注释如上,已给出详细的说明,下面仅以文件为单位说明各个函数的作用和特点,在必要的地方给予一定说明。  3.1、guide.h文件 使用条件编译。以下是头文件中语句 /********************************************* *头文件(.h) ********************************************/ #include "stdio.h" #include "conio.h" #include "alloc.h" #define n0 100 #define infi 32767 /*“无穷大*/ int adjmatrix[n0+1][n0+1];     /*邻接矩阵*/ int n=11; struct node             /*表结点*/ { char name[20];       /*下一个表结点与它们之间的距离*/ }place[12]={{"ShiDiGongYuan"},   /*表结点初始化,即写各景点名称*/    {"CangRongGongYu"},    {"YinHuiLou"},    {"TuoHuanGuanChang"},    {"DiBaShiTang"},    {"XiaoYiYuan"},    {"TuShuGuan"},    {"TiYuGuan"},    {"ZhongHuaGuanChang"},    {"ChuangXinLou"},    {"YiFuTuShuGuan"},    {"BoXueLou"}};  void createadj()          /*建立邻接表*/  void dijkstra( int x,int y)     /*dijkstra求最小生树*/  void search()            /*搜索最短路径*/  menu()               /*菜单函数*/          /********************************************* *建立邻接表 ********************************************/ void createadj()  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值