Qt 深度解析QMap与QHash
一、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 23 24 QList<int> vlist = map.values(); 25 26 for(int i=0; i<vlistount(); i++) 27 30 31 32 33 QMapIterator<QString,int> it(map);//it指向第一个元素之前的位置 34 while(it.hasNext()) 35 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 22 23 QList<int> vlist = map.values(); 24 25 for(int i=0; i<vlistount(); i++) 26 29 30 31 32 QHash<QString,int>::const_iterator i; 33 34 for(i=maponstBegin(); i!=maponstEnd(); ++i) 35 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 , 12 , 13 14 15 }; 16 17 for(int i=0; fileArray[i][0] != NULL; i++) 18 22 23 fd.setWindowTitle(title); 24 fd.setAcceptMode(mode); 25 26 27 fd.setNameFilters(filters); 28 29 if(mode==QFileDialog::AcceptOpen) 30 33 34 if(fd.exec()==QFileDialog::Accepted) 35 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 ; 112 113 #endif // MAINWINDOW_H 114 #include "MainWindoh" 115 #include <QDebug> 116 117 MainWindow::MainWindow(QWidget *parent) 118 : QMainWindow(parent), statusLabel(this) 119 124 125 bool MainWindow::construct() 126 134 MainWindow* MainWindow::NewInstance() 135 143 144 return ret; 145 } 146 bool MainWindow::initMenuBar()//菜单栏 147 161 162 bool MainWindow::initToolBar()//工具栏 1 181 182 bool MainWindow::initStatusBar()//状态栏 183 204 else 205 208 return ret; 209 } 210 bool MainWindow::initinitMainEditor()//编辑窗口 211 221 222 /************************************************文件菜单********************************************************/ 223 bool MainWindow::initFileMenu(QMenuBar* mb) 224 240 241 menu>addSeparator(); 242 243 //Open 244 ret = ret && makeAction(action, menu,"Open(&O)...",Qt::CTRL + Qt::Key_O); 245 if(ret) 246 250 251 menu>addSeparator(); 252 253 //Save 254 ret = ret && makeAction(action, menu,"Save(&S)",Qt::CTRL + Qt::Key_S); 255 if(ret) 256 260 261 menu>addSeparator(); 262 2 //Save As 264 ret = ret && makeAction(action, menu, "Save As(&A)...",0); 265 if(ret) 266 271 272 menu>addSeparator(); 273 274 //print 275 ret = ret && makeAction(action, menu, "Print(&P)...",Qt::CTRL + Qt::Key_P); 276 if(ret) 277 280 281 menu>addSeparator(); 282 283 //Exit 284 ret = ret && makeAction(action, menu,"Exit(&X)",0); 285 if(ret) 286 289 290 } 291 if(ret) 292 295 else 296 299 return ret; 300 } 301 302 /************************************************编辑菜单********************************************************/ 303 bool MainWindow::initEditMenu(QMenuBar* mb) 304 319 320 menu>addSeparator(); 321 322 //Redo 323 ret = ret && makeAction(action, menu,"Redo(&R)...",Qt::CTRL + Qt::Key_Y); 324 if(ret) 325 328 329 menu>addSeparator(); 330 331 //Cut 332 ret = ret && makeAction(action, menu,"Cut(&T)",Qt::CTRL + Qt::Key_X); 333 if(ret) 334 337 338 menu>addSeparator(); 339 340 //Copy 341 ret = ret && makeAction(action, menu,"Copy(&C)...",Qt::CTRL + Qt::Key_C); 342 if(ret) 343 346 347 menu>addSeparator(); 348 349 //Pase 350 ret = ret && makeAction(action, menu,"Pase(&P)...",Qt::CTRL + Qt::Key_V); 351 if(ret) 352 355 356 menu>addSeparator(); 357 358 //Delete 359 ret = ret && makeAction(action, menu, "Delete(&L)",Qt::Key_Delete); 360 if(ret) 361 364 365 menu>addSeparator(); 366 367 //Find 368 ret = ret && makeAction(action, menu,"Find(&F)...",Qt::CTRL + Qt::Key_F); 369 if(ret) 370 373 374 menu>addSeparator(); 375 376 //Replace 377 ret = ret && makeAction(action, menu,"Replace(&R)...",Qt::CTRL + Qt::Key_H); 378 if(ret) 379 382 383 menu>addSeparator(); 384 385 //Goto 386 ret = ret && makeAction(action, menu,"Goto(&G)",Qt::CTRL + Qt::Key_G); 387 if(ret) 388 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 401 } 402 if(ret) 403 406 else 407 410 return ret; 411 } 412 413 /************************************************格式菜单********************************************************/ 414 bool MainWindow::initFormatMenu(QMenuBar* mb) 415 430 431 menu>addSeparator(); 432 433 //Font 434 ret = ret && makeAction(action, menu,"Font(&F)...",0); 435 if(ret) 436 439 440 } 441 if(ret) 442 445 else 446 449 return ret; 450 } 451 452 /************************************************视图菜单********************************************************/ 453 bool MainWindow::initViewMenu(QMenuBar* mb) 454 469 470 menu>addSeparator(); 471 472 //Status Bar 473 ret = ret && makeAction(action, menu,"Status Bar(&S)",0); 474 if(ret) 475 478 479 } 480 if(ret) 481 484 else 485 488 return ret; 489 } 490 491 /************************************************帮助菜单********************************************************/ 492 bool MainWindow::initHelpMenu(QMenuBar* mb) 493 508 509 menu>addSeparator(); 510 511 //About NotePad 512 ret = ret && makeAction(action, menu,"About NotePad...",0); 513 if(ret) 514 517 518 } 519 if(ret) 520 523 else 524 527 return ret; 528 } 529 /*****************************************工具************************************************************/ 530 bool MainWindow::initFileToolItem(QToolBar* tb) 531 542 543 ret = ret && makeAction(action, tb,"Open", ":/Res/pic/open.png"); 544 if(ret) 545 549 550 ret = ret && makeAction(action, tb,"Save", ":/Res/pic/save.png"); 551 if(ret) 552 556 557 ret = ret && makeAction(action, tb,"Save As", ":/Res/pic/saveas.png"); 558 if(ret) 559 5 ret = ret && makeAction(action, tb,"Print", ":/Res/pic/print.png"); 564 if(ret) 565 568 return ret; 569 570 } 571 bool MainWindow::initEditToolItem(QToolBar* tb) 572 581 ret = ret && makeAction(action, tb,"Redo", ":/Res/pic/redo.png"); 582 if(ret) 583 586 587 ret = ret && makeAction(action, tb, "Cut", ":/Res/pic/cut.png"); 588 if(ret) 589 592 593 ret = ret && makeAction(action, tb,"Copy", ":/Res/pic/copy.png"); 594 if(ret) 595 598 599 ret = ret && makeAction(action, tb,"Paste", ":/Res/pic/paste.png"); 600 if(ret) 601 604 605 ret = ret && makeAction(action, tb,"Find", ":/Res/pic/find.png"); 606 if(ret) 607 610 ret = ret && makeAction(action, tb,"Replace", ":/Res/pic/replace.png"); 611 if(ret) 612 615 ret = ret && makeAction(action, tb,"Goto", ":/Res/pic/goto.png"); 616 if(ret) 617 620 621 return ret; 622 } 623 bool MainWindow::initFormatToolItem(QToolBar* tb) 624 3 ret = ret && makeAction(action, tb,"Font", ":/Res/pic/font.png"); 4 if(ret) 5 8 9 return ret; 640 } 641 bool MainWindow::initViewToolItem(QToolBar* tb) 642 651 ret = ret && makeAction(action, tb,"Status Bar", ":/Res/pic/status.png"); 652 if(ret) 653 656 657 return ret; 658 } 659 660 661 bool MainWindow::makeAction(QAction*& action,QMenu* menu, QString text, int key)//菜单项 662 669 else 670 673 674 return ret; 675 } 676 bool MainWindow::makeAction(QAction*& action,QToolBar* tb, QString tip, QString icon) 677 685 else 686 689 return ret; 690 } 691 MainWindow::~MainWindow() 692 695 #include <QFileDialog> 696 #include <QStringList> 697 #include <QFile> 698 #include <QDebug> 699 #include <QMessageBox> 700 #include "MainWindoh" 701 #include <QMap> 702 703 QString MainWindow::showFileDialog(QFileDialog::AcceptMode mode, QString title) 704 , 714 , 715 716 717 }; 718 719 for(int i=0; fileArray[i][0] != NULL; i++) 720 724 725 fd.setWindowTitle(title); 726 fd.setAcceptMode(mode); 727 728 729 fd.setNameFilters(filters); 730 731 if(mode==QFileDialog::AcceptOpen) 732 735 736 if(fd.exec()==QFileDialog::Accepted) 737 746 } 747 748 return ret; 749 } 750 751 void MainWindow::showErrorMessage(QString message) 752 762 7 int MainWindow::showQuesstionMessage(QString message) 764 774 775 QString MainWindow::saveCurrentData(QString path) 776 783 784 if(ret != "") 785 799 else 800 804 } 805 806 return ret; 807 808 } 809 void MainWindow::preEditorChanged() 810 826 827 } 828 } 829 void MainWindow::onFileNew() 830 842 } 843 void MainWindow::onFileOpen() 844 865 else 866 869 } 870 } 871 872 } 873 874 void MainWindow::onFlieSave() 875 882 } 883 884 void MainWindow::onFileSaveAs() 885 892 893 } 894 void MainWindow::onTextChanged() 895 900 m_isTextChanged = true; 901 902 } 903 #include <QtGui/QApplication> 904 #include "MainWindoh" 905 #include <QTextCodec> 906 907 908 int main(int argc, char *argv[]) 909 921 922 delete w; 923 return ret; 924 }四、小结
(1)、Qt中提供了用于存储键值的类模板
(2)、QHash与QMap遵循了相同的使用接口
(3)、QHash的查找速度快于QMap
(4)、QMap需要的内存少于QHash
(5)、QHash对于Key类型的要求高于QMap
上一篇:CODESYS 实例代码:可视化输出变量(Hello world!)
下一篇:VS打开Qt的ui界面几秒后闪退(ui无法打开文件)的解决办法
Qt
