首页 > 其他分享 >Qt 深度解析QMap与QHash

Qt 深度解析QMap与QHash

时间:2024-01-28 14:11:39浏览次数:19  
标签:QHash QMap menu ret bool && action tb Qt

一、QMap深度解析

1、QMap是一个以升序键顺序存储键值对的数据结构

(1)QMap原型为class QMap<K, T>模板

(2)、QMap中的键值对根据key进行了排序

(3)、QMap中的key类型必须重载operator < (小于操作符)

2、QMap使用实例一

 3、QMap使用实例二

4、QMap的注意事项

(1)、通过key获取Value时

A、当key存在,返回对应的Value

B、当key不存在,返回值类型所对应的“零”值

(2)、插入键值对时

A、当key存在,更新Value的值

B、当key不存在,插入新的键值对

 1 #include <QtCore/QCoreApplication>
 2 #include <QDebug>
 3 #include <QMap>
 4 #include<QMapIterator>//迭代器
 5 
 6 int main(int argc, char *argv[])
 7 {
 8     QCoreApplication a(argc, argv);
 9     
10     QMap<QString, int> map;
11     map["key 2"] = 2;
12     map["key 0"] = 0;
13     map.insert("key 1", 1);
14 
15    //map.insert("key 1", 4);//前面已有key 1,所有这里会更新key的键值为4
16 
17     QList<QString> list = map.keys();
18 
19     for(int i=0; i<list.count(); i++)
20     {
21         qDebug() << list[i];//打印排序好的key 0、key 1、key 2
22     }
23 
24     QList<int> vlist = map.values();
25 
26     for(int i=0; i<vlist.count(); i++)
27     {
28         qDebug() << vlist[i];//打印0、1、2
29     }
30 
31 
32 
33     QMapIterator<QString,int> it(map);//it指向第一个元素之前的位置
34     while(it.hasNext())
35     {
36         it.next();
37         qDebug() << it.key() << ":" << it.value() ;
38     }
39 
40 
41     return a.exec();
42 }

二、QHash深度解析

1、QHash是Qt中的哈希数据结构

(1)、QHash原型为class QHash<K, T>模板

(2)、QHash中的键值对在内部无序排列

(3)、QHash中的Key类型必须重载operator ==

(4)、QHash中的Key对象必须重载全局哈希函数(qHash())

2、QHash使用示例

 1 #include <QtCore/QCoreApplication>
 2 #include <QDebug>
 3 #include <QHash>
 4 
 5 int main(int argc, char *argv[])
 6 {
 7     QCoreApplication a(argc, argv);
 8     
 9     QHash<QString, int> map;
10     map["key 2"] = 2;
11     map["key 0"] = 0;
12     map.insert("key 1", 1);
13 
14    //map.insert("key 1", 4);//前面已有key 1,所有这里会更新key的键值为4
15 
16     QList<QString> list = map.keys();
17 
18     for(int i=0; i<list.count(); i++)
19     {
20         qDebug() << list[i];//打印排序好的key 0、key 1、key 2
21     }
22 
23     QList<int> vlist = map.values();
24 
25     for(int i=0; i<vlist.count(); i++)
26     {
27         qDebug() << vlist[i];//打印0、1、2
28     }
29 
30 
31 
32     QHash<QString,int>::const_iterator i;
33 
34     for(i=map.constBegin(); i!=map.constEnd(); ++i)
35     {
36         qDebug() << i.key() << ":" << i.value() ;
37     }
38 
39     return a.exec();
40 }

三、QMap和QHash的对比分析

1、QMap和QHash的接口相同,可直接替换使用

(1)、QHash的查找速度明显快于QMap

(2)、QHash占用的存储空间明显多于QMap

(3)、QHash以任意的方式存储元素

(4)、QMap以Key顺序存储元素

(5)、QHash的键类型必须提供operator == () 和 qHash(key)函数

(6)、QMap的键类型必须提供operator <

  1 QString MainWindow::showFileDialog(QFileDialog::AcceptMode mode, QString title)
  2 {
  3     QString ret = "";
  4     QFileDialog fd;
  5     QStringList filters;
  6     QMap<QString, QString> map;
  7 
  8     const char* fileArray[][2]=
  9     {
 10 
 11         {"Text(*.txt)",    ".txt"},
 12         {"All Files(*.*)",   "*" },
 13         {NULL,               NULL}
 14 
 15     };
 16 
 17     for(int i=0; fileArray[i][0] != NULL; i++)
 18     {
 19         filters.append(fileArray[i][0]);
 20         map.insert(fileArray[i][0], fileArray[i][1]);
 21     }
 22 
 23     fd.setWindowTitle(title);
 24     fd.setAcceptMode(mode);
 25 
 26 
 27     fd.setNameFilters(filters);
 28 
 29     if(mode==QFileDialog::AcceptOpen)
 30     {
 31         fd.setFileMode(QFileDialog::ExistingFile);
 32     }
 33 
 34     if(fd.exec()==QFileDialog::Accepted)
 35     {
 36         ret = fd.selectedFiles()[0];
 37 
 38         QString posix = map[fd.selectedNameFilter()];//把下拉中选中的后缀对应键值取出
 39 
 40         if(posix != "*" && !ret.endsWith(posix))
 41         {
 42             ret += posix;
 43         }
 44     }
 45 
 46     return ret;
 47 }
 48 #ifndef MAINWINDOW_H
 49 #define MAINWINDOW_H
 50 #include <QMenuBar>
 51 #include <QMenu>
 52 #include <QAction>
 53 #include <QString>
 54 #include <QtGui/QMainWindow>
 55 #include <QToolBar>
 56 #include <QIcon>
 57 #include <QSize>
 58 #include <QStatusBar>
 59 #include <QLabel>
 60 #include <QPlainTextEdit>
 61 #include <QFileDialog>
 62 class MainWindow : public QMainWindow
 63 {
 64     Q_OBJECT
 65 private:
 66         QPlainTextEdit mainEdit;
 67         QLabel statusLabel;
 68         QString m_filePath;//记得在构造函数里初始化
 69         bool m_isTextChanged;//构造函数里初始化为false
 70 
 71         MainWindow(QWidget *parent = 0);
 72         MainWindow(const MainWindow& obj);
 73         MainWindow* operator = (const MainWindow& obj);
 74         bool construct();
 75 
 76         bool initMenuBar();//菜单栏
 77         bool initToolBar();//工具栏
 78         bool initStatusBar();//状态栏
 79         bool initinitMainEditor();//编辑窗口
 80 
 81         bool initFileMenu(QMenuBar* mb);//文件菜单
 82         bool initEditMenu(QMenuBar* mb);//编辑菜单
 83         bool initFormatMenu(QMenuBar* mb);//格式菜单
 84         bool initViewMenu(QMenuBar* mb);//视图菜单
 85         bool initHelpMenu(QMenuBar* mb);//帮助菜单
 86 
 87         bool initFileToolItem(QToolBar* tb);//工具选项
 88         bool initEditToolItem(QToolBar* tb);
 89         bool initFormatToolItem(QToolBar* tb);
 90         bool initViewToolItem(QToolBar* tb);
 91 
 92 
 93         bool makeAction(QAction*& action,QMenu* menu, QString text, int key);//菜单项
 94         bool makeAction(QAction*& action,QToolBar* tb, QString tip, QString icon);
 95 
 96         QString showFileDialog(QFileDialog::AcceptMode mode, QString title);//文件对话框
 97         void showErrorMessage(QString message);//错误消息对话框
 98         int showQuesstionMessage(QString message);//问题消息对话框
 99         QString saveCurrentData(QString path = "");
100         void preEditorChanged();
101 
102 private slots:
103         void onFileNew();
104         void onFileOpen();
105         void onFlieSave();
106         void onFileSaveAs();
107         void onTextChanged();
108 public:
109      static MainWindow* NewInstance();
110     ~MainWindow();
111 };
112 
113 #endif // MAINWINDOW_H
114 #include "MainWindow.h"
115 #include <QDebug>
116 
117 MainWindow::MainWindow(QWidget *parent)
118     : QMainWindow(parent), statusLabel(this)
119 {
120     m_filePath = "";
121     m_isTextChanged = false;
122     setWindowTitle("NotePad-[New]");
123 }
124 
125 bool MainWindow::construct()
126 {
127     bool ret = true;
128     ret = ret && initMenuBar();
129     ret = ret && initToolBar();
130     ret = ret && initStatusBar();
131     ret = ret && initinitMainEditor();
132     return ret;
133 }
134 MainWindow* MainWindow::NewInstance()
135 {
136     MainWindow* ret = new MainWindow();
137 
138     if((ret==NULL) || (!ret->construct()))
139     {
140         delete ret;
141         ret = NULL;
142     }
143 
144     return ret;
145 }
146 bool MainWindow::initMenuBar()//菜单栏
147 {
148     bool ret = true;
149 
150     QMenuBar* mb = menuBar();//一定要注意是menuBar(),这是普通成员函数,不是构造函数
151 
152     ret = ret && initFileMenu(mb);//传一个参数是为了在initFileMenu()函数将menu加入菜单栏
153     ret = ret && initEditMenu(mb);
154     ret = ret && initFormatMenu(mb);
155     ret = ret && initViewMenu(mb);
156     ret = ret && initHelpMenu(mb);
157 
158     return ret;
159 
160 }
161 
162 bool MainWindow::initToolBar()//工具栏
163 {
164     bool ret = true;
165 
166     QToolBar* tb = addToolBar("Tool Bar");
167     //tb->setMovable(false);
168     //tb->setFloatable(false);
169     tb->setIconSize(QSize(16,16));
170 
171     ret = ret && initFileToolItem(tb);
172     tb->addSeparator();
173     ret = ret && initEditToolItem(tb);
174     tb->addSeparator();
175     ret = ret && initFormatToolItem(tb);
176     tb->addSeparator();
177     ret = ret && initViewToolItem(tb);
178 
179     return ret;
180 }
181 
182 bool MainWindow::initStatusBar()//状态栏
183 {
184     bool ret = true;
185 
186     QStatusBar* sb = statusBar();
187 
188     QLabel* label = new QLabel("Made By LGC");
189 
190     if(label != NULL)
191     {
192         statusLabel.setMinimumWidth(200);
193         statusLabel.setAlignment(Qt::AlignHCenter);
194         statusLabel.setText("Ln:1    Col:1");
195 
196 
197         label->setMinimumWidth(200);
198         label->setAlignment(Qt::AlignHCenter);
199 
200         sb->addPermanentWidget(new QLabel());//单纯加入分隔符
201         sb->addPermanentWidget(&statusLabel);
202         sb->addPermanentWidget(label);
203     }
204     else
205     {
206         ret = false;
207     }
208     return ret;
209 }
210 bool MainWindow::initinitMainEditor()//编辑窗口
211 {
212     bool ret = true;
213 
214     mainEdit.setParent(this);
215     setCentralWidget(&mainEdit);
216 
217     connect(&mainEdit, SIGNAL(textChanged()), this, SLOT(onTextChanged()));
218 
219     return ret;
220 }
221 
222 /************************************************文件菜单********************************************************/
223 bool MainWindow::initFileMenu(QMenuBar* mb)
224 {
225     bool ret = true;
226 
227     QMenu* menu = new QMenu("File(&F)");//创建文件菜单,(&F)是为了可以Alt+F打开
228     ret = (menu != NULL);
229     if(ret)
230     {
231         QAction* action = NULL;
232 
233         //New
234         ret = ret &&  makeAction(action, menu, "New(&N)",Qt::CTRL + Qt::Key_N);
235         if(ret)
236         {
237            connect(action, SIGNAL(triggered()), this, SLOT(onFileNew()));
238            menu->addAction(action);
239         }
240 
241         menu->addSeparator();
242 
243         //Open
244         ret = ret &&  makeAction(action,  menu,"Open(&O)...",Qt::CTRL + Qt::Key_O);
245         if(ret)
246         {
247            connect(action, SIGNAL(triggered()), this, SLOT(onFileOpen()));
248            menu->addAction(action);
249         }
250 
251         menu->addSeparator();
252 
253         //Save
254         ret = ret &&  makeAction(action,  menu,"Save(&S)",Qt::CTRL + Qt::Key_S);
255         if(ret)
256         {
257             connect(action, SIGNAL(triggered()), this ,SLOT(onFlieSave()));
258             menu->addAction(action);
259         }
260 
261         menu->addSeparator();
262 
263         //Save As
264         ret = ret &&  makeAction(action, menu, "Save As(&A)...",0);
265         if(ret)
266         {
267            connect(action, SIGNAL(triggered()), this, SLOT(onFileSaveAs()));
268            menu->addAction(action);
269 
270         }
271 
272         menu->addSeparator();
273 
274         //print
275         ret = ret &&  makeAction(action, menu, "Print(&P)...",Qt::CTRL + Qt::Key_P);
276         if(ret)
277         {
278            menu->addAction(action);
279         }
280 
281         menu->addSeparator();
282 
283         //Exit
284         ret = ret &&  makeAction(action,  menu,"Exit(&X)",0);
285         if(ret)
286         {
287            menu->addAction(action);//将菜单项加入到菜单
288         }
289 
290     }
291     if(ret)
292     {
293         mb->addMenu(menu);//将菜单加入到菜单栏
294     }
295     else
296     {
297         delete mb;
298     }
299     return ret;
300 }
301 
302 /************************************************编辑菜单********************************************************/
303 bool MainWindow::initEditMenu(QMenuBar* mb)
304 {
305     bool ret = true;
306 
307     QMenu* menu = new QMenu("Edit(&E)");
308     ret = (menu != NULL);
309     if(ret)
310     {
311         QAction* action = NULL;
312 
313         //Undo
314         ret = ret &&  makeAction(action,  menu,"Undo(&U)",Qt::CTRL + Qt::Key_Z);
315         if(ret)
316         {
317            menu->addAction(action);
318         }
319 
320         menu->addSeparator();
321 
322         //Redo
323         ret = ret &&  makeAction(action,  menu,"Redo(&R)...",Qt::CTRL + Qt::Key_Y);
324         if(ret)
325         {
326            menu->addAction(action);
327         }
328 
329         menu->addSeparator();
330 
331         //Cut
332         ret = ret &&  makeAction(action,  menu,"Cut(&T)",Qt::CTRL + Qt::Key_X);
333         if(ret)
334         {
335            menu->addAction(action);
336         }
337 
338         menu->addSeparator();
339 
340         //Copy
341         ret = ret &&  makeAction(action,  menu,"Copy(&C)...",Qt::CTRL + Qt::Key_C);
342         if(ret)
343         {
344            menu->addAction(action);
345         }
346 
347         menu->addSeparator();
348 
349         //Pase
350         ret = ret &&  makeAction(action,  menu,"Pase(&P)...",Qt::CTRL + Qt::Key_V);
351         if(ret)
352         {
353            menu->addAction(action);
354         }
355 
356         menu->addSeparator();
357 
358         //Delete
359         ret = ret &&  makeAction(action, menu, "Delete(&L)",Qt::Key_Delete);
360         if(ret)
361         {
362            menu->addAction(action);
363         }
364 
365         menu->addSeparator();
366 
367         //Find
368         ret = ret &&  makeAction(action,  menu,"Find(&F)...",Qt::CTRL + Qt::Key_F);
369         if(ret)
370         {
371            menu->addAction(action);
372         }
373 
374         menu->addSeparator();
375 
376         //Replace
377         ret = ret &&  makeAction(action,  menu,"Replace(&R)...",Qt::CTRL + Qt::Key_H);
378         if(ret)
379         {
380            menu->addAction(action);
381         }
382 
383         menu->addSeparator();
384 
385         //Goto
386         ret = ret &&  makeAction(action,  menu,"Goto(&G)",Qt::CTRL + Qt::Key_G);
387         if(ret)
388         {
389            menu->addAction(action);
390         }
391 
392         menu->addSeparator();
393 
394         //Select All
395         ret = ret &&  makeAction(action, menu, "Select All(&A)",Qt::CTRL + Qt::Key_A);
396         if(ret)
397         {
398            menu->addAction(action);
399         }
400 
401     }
402     if(ret)
403     {
404         mb->addMenu(menu);
405     }
406     else
407     {
408         delete mb;
409     }
410     return ret;
411 }
412 
413 /************************************************格式菜单********************************************************/
414 bool MainWindow::initFormatMenu(QMenuBar* mb)
415 {
416     bool ret = true;
417 
418     QMenu* menu = new QMenu("Format(&O)");
419     ret = (menu != NULL);
420     if(ret)
421     {
422         QAction* action = NULL;
423 
424         //Auto Wrap
425         ret = ret &&  makeAction(action,  menu,"Auto Wrap(&W)",0);
426         if(ret)
427         {
428            menu->addAction(action);
429         }
430 
431         menu->addSeparator();
432 
433         //Font
434         ret = ret &&  makeAction(action,  menu,"Font(&F)...",0);
435         if(ret)
436         {
437            menu->addAction(action);
438         }
439 
440     }
441     if(ret)
442     {
443         mb->addMenu(menu);
444     }
445     else
446     {
447         delete mb;
448     }
449     return ret;
450 }
451 
452 /************************************************视图菜单********************************************************/
453 bool MainWindow::initViewMenu(QMenuBar* mb)
454 {
455     bool ret = true;
456 
457     QMenu* menu = new QMenu("View(&V)");
458     ret = (menu != NULL);
459     if(ret)
460     {
461         QAction* action = NULL;
462 
463         //Tool Bar
464         ret = ret &&  makeAction(action, menu,"Tool Bar(&T)",0);
465         if(ret)
466         {
467            menu->addAction(action);
468         }
469 
470         menu->addSeparator();
471 
472         //Status Bar
473         ret = ret &&  makeAction(action, menu,"Status Bar(&S)",0);
474         if(ret)
475         {
476            menu->addAction(action);
477         }
478 
479     }
480     if(ret)
481     {
482         mb->addMenu(menu);
483     }
484     else
485     {
486         delete mb;
487     }
488     return ret;
489 }
490 
491 /************************************************帮助菜单********************************************************/
492 bool MainWindow::initHelpMenu(QMenuBar* mb)
493 {
494     bool ret = true;
495 
496     QMenu* menu = new QMenu("Help(&H)");
497     ret = (menu != NULL);
498     if(ret)
499     {
500         QAction* action = NULL;
501 
502         //User Manual
503         ret = ret &&  makeAction(action,  menu,"User Manual",0);
504         if(ret)
505         {
506            menu->addAction(action);
507         }
508 
509         menu->addSeparator();
510 
511         //About NotePad
512         ret = ret &&  makeAction(action,  menu,"About NotePad...",0);
513         if(ret)
514         {
515            menu->addAction(action);
516         }
517 
518     }
519     if(ret)
520     {
521         mb->addMenu(menu);
522     }
523     else
524     {
525         delete mb;
526     }
527     return ret;
528 }
529 /*****************************************工具************************************************************/
530 bool MainWindow::initFileToolItem(QToolBar* tb)
531 {
532     bool ret = true;
533     QAction* action = NULL;
534 
535     ret = ret && makeAction(action, tb, "New", ":/Res/pic/new.png");
536     if(ret)
537     {
538         connect(action, SIGNAL(triggered()), this, SLOT(onFileNew()));
539         tb->addAction(action);
540 
541     }
542 
543     ret = ret && makeAction(action,  tb,"Open", ":/Res/pic/open.png");
544     if(ret)
545     {
546         connect(action, SIGNAL(triggered()), this, SLOT(onFileOpen()));
547         tb->addAction(action);
548     }
549 
550     ret = ret && makeAction(action,  tb,"Save", ":/Res/pic/save.png");
551     if(ret)
552     {
553         connect(action, SIGNAL(triggered()), this ,SLOT(onFlieSave()));
554         tb->addAction(action);
555     }
556 
557     ret = ret && makeAction(action,  tb,"Save As", ":/Res/pic/saveas.png");
558     if(ret)
559     {
560         connect(action, SIGNAL(triggered()), this, SLOT(onFileSaveAs()));
561         tb->addAction(action);
562     }
563     ret = ret && makeAction(action, tb,"Print",  ":/Res/pic/print.png");
564     if(ret)
565     {
566         tb->addAction(action);
567     }
568     return ret;
569 
570 }
571 bool MainWindow::initEditToolItem(QToolBar* tb)
572 {
573     bool ret = true;
574     QAction* action = NULL;
575 
576     ret = ret && makeAction(action, tb,"Undo",  ":/Res/pic/undo.png");
577     if(ret)
578     {
579         tb->addAction(action);
580     }
581     ret = ret && makeAction(action,  tb,"Redo", ":/Res/pic/redo.png");
582     if(ret)
583     {
584         tb->addAction(action);
585     }
586 
587     ret = ret && makeAction(action, tb, "Cut",  ":/Res/pic/cut.png");
588     if(ret)
589     {
590         tb->addAction(action);
591     }
592 
593     ret = ret && makeAction(action,  tb,"Copy", ":/Res/pic/copy.png");
594     if(ret)
595     {
596         tb->addAction(action);
597     }
598 
599     ret = ret && makeAction(action, tb,"Paste",  ":/Res/pic/paste.png");
600     if(ret)
601     {
602         tb->addAction(action);
603     }
604 
605     ret = ret && makeAction(action, tb,"Find",  ":/Res/pic/find.png");
606     if(ret)
607     {
608         tb->addAction(action);
609     }
610     ret = ret && makeAction(action, tb,"Replace",  ":/Res/pic/replace.png");
611     if(ret)
612     {
613         tb->addAction(action);
614     }
615     ret = ret && makeAction(action, tb,"Goto",  ":/Res/pic/goto.png");
616     if(ret)
617     {
618         tb->addAction(action);
619     }
620 
621     return ret;
622 }
623 bool MainWindow::initFormatToolItem(QToolBar* tb)
624 {
625     bool ret = true;
626     QAction* action = NULL;
627 
628     ret = ret && makeAction(action, tb, "Auto Wrap", ":/Res/pic/wrap.png");
629     if(ret)
630     {
631         tb->addAction(action);
632     }
633     ret = ret && makeAction(action, tb,"Font",  ":/Res/pic/font.png");
634     if(ret)
635     {
636         tb->addAction(action);
637     }
638 
639     return ret;
640 }
641 bool MainWindow::initViewToolItem(QToolBar* tb)
642 {
643     bool ret = true;
644     QAction* action = NULL;
645 
646     ret = ret && makeAction(action,  tb,"Tool Bar", ":/Res/pic/tool.png");
647     if(ret)
648     {
649         tb->addAction(action);
650     }
651     ret = ret && makeAction(action,  tb,"Status Bar", ":/Res/pic/status.png");
652     if(ret)
653     {
654         tb->addAction(action);
655     }
656 
657     return ret;
658 }
659 
660 
661 bool MainWindow::makeAction(QAction*& action,QMenu* menu, QString text, int key)//菜单项
662 {
663     bool ret = true;
664     action = new QAction(text, menu);
665     if(action != NULL)
666     {
667         action->setShortcut(QKeySequence(key));//创建快捷键
668     }
669     else
670     {
671         ret = false;
672     }
673 
674     return ret;
675 }
676 bool MainWindow::makeAction(QAction*& action,QToolBar* tb, QString tip, QString icon)
677 {
678     bool ret = true;
679     action = new QAction("", tb);
680     if(action != NULL)
681     {
682         action->setToolTip(tip);
683         action->setIcon(QIcon(icon));
684     }
685     else
686     {
687         ret = false;
688     }
689     return ret;
690 }
691 MainWindow::~MainWindow()
692 {
693 
694 }
695 #include <QFileDialog>
696 #include <QStringList>
697 #include <QFile>
698 #include <QDebug>
699 #include <QMessageBox>
700 #include "MainWindow.h"
701 #include <QMap>
702 
703 QString MainWindow::showFileDialog(QFileDialog::AcceptMode mode, QString title)
704 {
705     QString ret = "";
706     QFileDialog fd;
707     QStringList filters;
708     QMap<QString, QString> map;
709 
710     const char* fileArray[][2]=
711     {
712 
713         {"Text(*.txt)",    ".txt"},
714         {"All Files(*.*)",   "*" },
715         {NULL,               NULL}
716 
717     };
718 
719     for(int i=0; fileArray[i][0] != NULL; i++)
720     {
721         filters.append(fileArray[i][0]);
722         map.insert(fileArray[i][0], fileArray[i][1]);
723     }
724 
725     fd.setWindowTitle(title);
726     fd.setAcceptMode(mode);
727 
728 
729     fd.setNameFilters(filters);
730 
731     if(mode==QFileDialog::AcceptOpen)
732     {
733         fd.setFileMode(QFileDialog::ExistingFile);
734     }
735 
736     if(fd.exec()==QFileDialog::Accepted)
737     {
738         ret = fd.selectedFiles()[0];
739 
740         QString posix = map[fd.selectedNameFilter()];//把下拉中选中的后缀对应键值取出
741 
742         if(posix != "*" && !ret.endsWith(posix))
743         {
744             ret += posix;
745         }
746     }
747 
748     return ret;
749 }
750 
751 void MainWindow::showErrorMessage(QString message)
752 {
753     QMessageBox mb(this);
754 
755     mb.setWindowTitle("Quession");
756     mb.setText(message);
757     mb.setIcon(QMessageBox::Critical);
758     mb.setStandardButtons(QMessageBox::Ok);
759 
760     mb.exec();
761 }
762 
763 int MainWindow::showQuesstionMessage(QString message)
764 {
765     QMessageBox mb(this);
766 
767     mb.setWindowTitle("Error");
768     mb.setText(message);
769     mb.setIcon(QMessageBox::Question);
770     mb.setStandardButtons(QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);
771 
772     return  mb.exec();
773 }
774 
775 QString MainWindow::saveCurrentData(QString path)
776 {
777     QString ret = path;
778     if(ret == "")
779     {
780         ret = showFileDialog(QFileDialog::AcceptSave, "Save");
781 
782     }
783 
784     if(ret != "")
785     {
786         QFile file(ret);
787         if(file.open(QIODevice::WriteOnly | QIODevice::Text))
788         {
789             QTextStream out(&file);
790 
791             out << QString(mainEdit.toPlainText());
792 
793             file.close();
794 
795             setWindowTitle("NotePad - [" + ret + "]");
796 
797             m_isTextChanged = false;//保存后修改状态值
798         }
799         else
800         {
801             showErrorMessage(QString("Open file Error!\n\n") + "\"" + m_filePath + "\"");
802             ret = "";
803         }
804     }
805 
806     return ret;
807 
808 }
809 void MainWindow::preEditorChanged()
810 {
811     if(m_isTextChanged)
812     {
813         int r = showQuesstionMessage("Do you want to Save?");
814         switch (r)
815         {
816         case QMessageBox::Yes:
817             saveCurrentData(m_filePath);
818             break;
819         case QMessageBox::No:
820             m_isTextChanged = false;
821             break;
822         case QMessageBox::Cancel:
823             break;
824 
825         }
826 
827     }
828 }
829 void MainWindow::onFileNew()
830 {
831     preEditorChanged();
832     if(!m_isTextChanged)
833     {
834         mainEdit.clear();
835 
836         m_filePath = "";
837 
838         m_isTextChanged = false;
839 
840         setWindowTitle("NotePad-[New]");
841     }
842 }
843 void MainWindow::onFileOpen()
844 {
845 
846     preEditorChanged();
847 
848     if(!m_isTextChanged)
849     {
850         QString path = showFileDialog(QFileDialog::AcceptOpen, "open");
851 
852         if(path != "")
853         {
854             QFile file(path);
855             if(file.open(QIODevice::ReadOnly | QIODevice::Text))
856             {
857                 mainEdit.setPlainText(QString(file.readAll()));
858 
859                 file.close();
860 
861                 m_filePath = path;//报存当前文件路径
862 
863                 setWindowTitle("NotePad - [" + m_filePath + "]");
864             }
865             else
866             {
867                 showErrorMessage(QString("Open file Error!\n\n") + "\"" + m_filePath + "\"");
868             }
869         }
870     }
871 
872 }
873 
874 void MainWindow::onFlieSave()
875 {
876     QString path = saveCurrentData(m_filePath);
877 
878     if(path != "")
879     {
880         m_filePath = path;
881     }
882 }
883 
884 void MainWindow::onFileSaveAs()
885 {
886     QString path = saveCurrentData();//使用默认参数
887 
888     if(path != "")
889     {
890         m_filePath = path;
891     }
892 
893 }
894 void MainWindow::onTextChanged()
895 {
896     if(!m_isTextChanged)
897     {
898         setWindowTitle("*" + windowTitle());
899     }
900     m_isTextChanged = true;
901 
902 }
903 #include <QtGui/QApplication>
904 #include "MainWindow.h"
905 #include <QTextCodec>
906 
907 
908 int main(int argc, char *argv[])
909 {
910     QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK")); //路径名支持中文
911     QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK")); //QString支持中文
912     QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK")); //string支持中文
913     QApplication a(argc, argv);
914     MainWindow* w = MainWindow::NewInstance();
915     int ret = -1;
916     if(w != NULL)
917     {
918         w->show();
919         ret = a.exec();
920     }
921 
922     delete w;
923     return ret;
924 }

四、小结

(1)、Qt中提供了用于存储键值的类模板

(2)、QHash与QMap遵循了相同的使用接口

(3)、QHash的查找速度快于QMap

(4)、QMap需要的内存少于QHash

(5)、QHash对于Key类型的要求高于QMap

标签:QHash,QMap,menu,ret,bool,&&,action,tb,Qt
From: https://www.cnblogs.com/ybqjymy/p/17992833

相关文章

  • CLion搭建Qt开发环境,并解决目录重构问题(最新版)
    序言Qt版本不断更新,QtCreator也不断更新。在Qt4和Qt5时代,我一直认为开发Qt最好的IDE就是自带的QtCreator,可是时至今日,到了Qt6时代,QtCreator已经都12.0.1版本了,不仅没变的更好用,反而变得更难用了。一方面可能是我被JetBrains全家桶和各种AI代码提示插件给惯坏了,另一方面也可能是开......
  • 【QT】选择和打开中文路径文件目录
    场景:Qt选择和打开目录,支持中文、空格等实现:#选择目录QStringstrDir="D:\\";QStringqslPath=QFileDialog::getExistingDirectory(this,"",strDir);ui->l_path->setText(qslPath);#打开目录QStringpath=ui->l_path->text();if(!path.isEmpty())QDe......
  • pyqt5基本安装过程(内含pip改变默认安装路径的方法)
    今天安装pyqt的时候发现pip总是会安装到一个我自己都找不到的地方,安装完和没安装一样,每次都只能靠pycharm中设置的安装库来救命。为了愉快的用命令行下载软件包(其实是因为qt需要安装的包太多),我改变了它的默认安装路径。如何改变pip默认安装路径先看一下python安装的默认位置以......
  • python--pyQt 基础框架代码 pyside6
    importsysfromPySide6importQtWidgets,QtCore,QtGuifromPySide6.QtCoreimportQt,QRectfromPySide6.QtGuiimportQColor,QEnterEventfromPySide6.QtWidgetsimportQApplication,QDialog,QMainWindow,QGraphicsDropShadowEffectimportyiqi_uiclassMain......
  • Qt中qreal的坑
    今天在写Qt的时候遇到了一个bug:同样一个方程在PC机上算的结果是11,但在arm-Linux设备上算出来的结果是12,我自己用计算器按出来的结果也是12。该段程序是这样的: maxnumbar=qreal((ItemHeight-radian*2)/height_rect);   其中 ItemHeight、radian、height_rect......
  • (QT) UDP监听断开
    UDP通讯只需要是用bind绑定对IP和Port的监听,断开监听可以使用函数abort() 做实验的时候用自定义类 classUDPClient:publicQObject{Q_OBJECTpublic:explicitUDPClient(QObject*parent=nullptr);publicslots:voidstartClient();voide......
  • Qt6
    第一章认识Qt新建一个GUI项目NewProject模板:Application(Qt)->QtWidgetsApplicationbuiltsystem:qmakespecifybasicinformation:Baseclass:QWidget语言:<无>kits:DesktopQt6.6.1MinGW64-bits项目的组成first_qt_project.pro:使用qmake构建系统时的项......
  • Qt编写手机端视频播放器/推流工具/Onvif工具
    一、视频播放器同时支持多种解码内核,包括qmedia内核(Qt4/Qt5/Qt6)、ffmpeg内核(ffmpeg2/ffmpeg3/ffmpeg4/ffmpeg5/ffmpeg6)、vlc内核(vlc2/vlc3)、mpv内核(mpv1/mp2)、mdk内核、海康sdk、easyplayer内核等。非常完善的多重基类设计,新增一种解码内核只需要实现极少的代码量,就可以应用整......
  • SpringBoot:Springboot整合Mqtt并处理问题
    搭建mqtt服务Docker搭建MQTT服务:https://www.cnblogs.com/nhdlb/p/17960641项目结构这是我的项目结构,主要有两个模块base-modules(业务模块)、base-utils(工具模块)组成,其中base-mqtt服务为工具模块,用于提供给其他业务模块引用依赖的。base-mqtt模块pom.xml这里我的Sprin......
  • Qt开发程序用QProcess调用curl命令上传文件并获取响应的文件
    1.需求做一个批量数字签名的工具,从一个文件夹内寻找所有的exe文件,然后复制到另外一个文件夹中,并且保存源文件的路径,将目标文件夹内的所有exe文件上传到公司的数字签名平台去做数字签名,并且返回接收后的文件;尝试了libcurl的post请求,发现总是返回参数错误; intHttpClient::Po......