前几天看了一下Qt的查找文件例程FindFilesExample。该例程可以在指定目录下根据搜索策略来查找特定的文件。实际运行时,在目录下文件数量较多或文件较大的情况下,搜索花费的时间会比较长。
本文是对例程说明文档的一个翻译。例程说明文档中部分内容与示例代码存在出入,下文已按照代码情况进行调整。运行例程的方法可以参考文章-QtCreator上手。
FindFilesExample文件查找示例,可以在指定目录下搜索文件,根据文件名称或通配符进行匹配。搜索时可以查找包含特定字符串的文件。搜索结果在列表中展示,包含文件名称及大小。状态栏将显示搜索到的文件数。
该示例列举了以下几个类的用法。
类名介绍QProgressDialog在搜索过程中提供反馈QFileDialog浏览文件列表QTextStream使用流操作读取文件QTableWidget在表中浏览搜索结果QDesktopServices使用合适的应用打开结果列表中的文件Window类定义Window类继承自QWidget,并且是主要的应用程序部件(widget)。它显示了搜索选项,并展示搜索结果。
classWindow:publicQWidget{Q_OBJECTpublic:Window(QWidget*parent=nullptr);privateslots:voidbrowse();voidfind();voidanimateFindClick();voidopenFileOfItem(introw,intcolumn);voidcontextMenu(constQPointpos);private:QStringListfindFiles(constQStringListfiles,constQStringtext);voidshowFiles(constQStringListpaths);QComboBox*createComboBox(constQStringtext=QString());voidcreateFilesTable();QComboBox*fileComboBox;QComboBox*textComboBox;QComboBox*directoryComboBox;QLabel*filesFoundLabel;QPushButton*findButton;QTableWidget*filesTable;QDircurrentDir;};
该应用具有几个私有槽函数:
槽介绍browse()在用户想浏览需要搜索的目录时调用find()在用户按下查找按钮进行搜索时调用animateFindClick()openFileOfItem()contextMenu()另外还声明了一些私有函数:
函数介绍findFiles()搜索匹配搜索参数的文件showFiles()展示搜索结果createComboBox()创建下拉框createFilesTable()创建文件表Window类实现在构造函数中首次创建了应用的部件。
Window::Window(QWidget*parent):QWidget(parent){setWindowTitle(tr("FindFiles"));QPushButton*browseButton=newQPushButton(tr("Browse..."),this);connect(browseButton,QAbstractButton::clicked,this,Window::browse);findButton=newQPushButton(tr("Find"),this);connect(findButton,QAbstractButton::clicked,this,Window::find);fileComboBox=createComboBox(tr("*"));connect(fileComboBox-lineEdit(),QLineEdit::returnPressed,this,Window::animateFindClick);textComboBox=createComboBox();connect(textComboBox-lineEdit(),QLineEdit::returnPressed,this,Window::animateFindClick);directoryComboBox=createComboBox(QDir::toNativeSeparators(QDir::currentPath()));connect(directoryComboBox-lineEdit(),QLineEdit::returnPressed,this,Window::animateFindClick);filesFoundLabel=newQLabel;createFilesTable();QGridLayout*mainLayout=newQGridLayout(this);mainLayout-addWidget(newQLabel(tr("Named:")),0,0);mainLayout-addWidget(fileComboBox,0,1,1,2);mainLayout-addWidget(newQLabel(tr("Containingtext:")),1,0);mainLayout-addWidget(textComboBox,1,1,1,2);mainLayout-addWidget(newQLabel(tr("Indirectory:")),2,0);mainLayout-addWidget(directoryComboBox,2,1);mainLayout-addWidget(browseButton,2,2);mainLayout-addWidget(filesTable,3,0,1,3);mainLayout-addWidget(filesFoundLabel,4,0,1,2);mainLayout-addWidget(findButton,4,2);
工程中创建这些部件来构建UI界面,并通过QGridLayout将它们添加到主布局中。
可选地,也可以使用QtDesigner来构建一个UI文件,通过UIC(UserInterfaceCompiler)来生成这些代码。
connect(newQShortcut(QKeySequence::Quit,this),QShortcut::activated,qApp,QApplication::quit);
工程中不创建具有退出菜单项的QMenuBar;但仍希望具有一个用于退出的键盘快捷键。因此我们构造一个参数为QKeySequence::Quit的QShortcut对象,并将其连接到QApplication::quit(),在大多数平台下,可以按下Q键退出(或该平台下配置的任何其它标准退出键)。(在macOS上,这是多余的,因为所有应用都自动添加了一个退出菜单项;但这有助于增强应用的可移植性。)
voidWindow::browse(){QStringdirectory=QDir::toNativeSeparators(QFileDialog::getExistingDirectory(this,tr("FindFiles"),QDir::currentPath()));if(!directory.isEmpty()){if(directoryComboBox-findText(directory)==-1)directoryComboBox-addItem(directory);directoryComboBox-setCurrentIndex(directoryComboBox-findText(directory));}}
browse()槽函数通过QFileDialog向用户显示一个文件对话框。QFileDialog允许用户遍历文件系统来选择一个或多个文件,或选择一个目录。创建QFileDialog最简单的方法是使用便利的静态函数。
此处使用静态的QFileDialog::getExistingDirectory()函数,该函数返回一个用户选择的现有目录。随后使用QComboBox::addItem()函数在目录的