在前面的一系列文章中,您经常接触到文档操作,如打开和导入图像文件、保存图像文件和编辑文档。 本文详细介绍了Qt的文件操作接口类QFile如何处理文件的I/O操作。
QFile配置文件QFile类提供了用于读取和写入文件的接口。 QFile是用于读取和写入文本和二进制文件的I/O设备。 QFile可以单独使用,也可以与QTextStream和QDataStream一起使用。
q创建QFile对象时可以指定文件名,也可以在创建对象后随时使用setFileName ()函数进行设置。 无论操作系统如何,QFile的文件分隔符都是“/”。 QFile不支持使用其他分隔符,如: '”。
以下示例说明如何使用QFile逐行读取文本文件。
file=qfile(in.txt ) ifnotfile.open ) qiodevice.readonly|qiodevice.text ) :返回while not file.atend ) ) process_line(line ) QIODevice.Text标志指示Qt将Windows样式的行结束符(“ r n”)转换为c样式的结束符(“ n”)。 缺省情况下,QFile基于二进制文件,不转换文件中存储的字节。
此示例说明如何使用QTextStream逐行读取文本文件:
QFile=qfile(in.txt ) ) ifnotfile.open ) qiodevice.readonly|qiodevice.text ) :returnin=qtextstream ) )文件
打开open (自,)文件设备。 将copy(self,newName :当前文件名) )指定的文件复制到newName文件中。 将rename(self,newName :当前文件名) )中指定的文件重命名为newName。 重命名(oldname,newName ) :在静态函数中,将文件oldname重命名为newName。 设置文件名(self,str ) :设置文件名。 filename(self ):setFileName ()或QFile () )创建时设置的文件名。 关闭(自) :关闭文件设备。 测试代码演示使用QFile和QTextStream加载和保存文本文件。 完整的代码是以下:
importsysfromPyQt5importQtCore,QtGui,qtwidgetsfrompyqt5. qtcoreimportqt,QFile,QTextStream,QIODevice,qbyteararayfrayfrot QMenu、QAction、QFileDialog、QPlainTextEdit ) classdemofile(qmainwindow ) 3360 def parent=none (3360 super (de mofile, self ) _init_ ) parent ) # 集窗口标题self.setWindowTitle )实战qtforpython3360q 360 ) self.initui(definitui ) self ) : self.init menubar (self ) ) ) setcentralitor 3360 menubar=self.menubar (menu file=menubar.addmenu ) ' f ) #打开文件actionFileOpen=QAction self ) action fileopen.set shortcut (Qt.ctrl Qt.key _ o ) actionFileOpen.setToolTip (打开文本文件) action fileopen
actionFileSave = QAction('保存(&S)', self) actionFileSave.setShortcut(Qt.CTRL + Qt.Key_S) actionFileSave.setToolTip('保存文本文件') actionFileSave.triggered.connect(self.onFileSave) actionFileSaveAs = QAction('另存为(&A)...', self) actionFileSaveAs.triggered.connect(self.onFileSaveAs) actionExit = QAction('退出(&X)', self) actionExit.triggered.connect(QApplication.instance().quit) menuFile.addAction(actionFileOpen) menuFile.addAction(actionFileSave) menuFile.addAction(actionFileSaveAs) menuFile.addSeparator() menuFile.addAction(actionExit) def msgCritical(self, strInfo): dlg = QMessageBox(self) dlg.setIcon(QMessageBox.Critical) dlg.setText(strInfo) dlg.show() def onFileOpen(self): path,_ = QFileDialog.getOpenFileName(self, '打开文件', '', '文本文件 (*.txt)') if path: f = QFile(path) if not f.open(QIODevice.ReadOnly | QIODevice.Text): self.msgCritical('打开文件失败') return False self.path = path self.txtEditor.setPlainText(QTextStream(f).readAll()) f.close() #关闭文件 def onFileSave(self): if self.path is None: return self.onFileSaveAs() self._saveToPath(self.path) def _saveToPath(self, path): f = QFile(path) if not f.open(QIODevice.WriteOnly): self.msgCritical('打开文件失败') return False self.path = path outText = QTextStream(f) outText << self.txtEditor.toPlainText() f.close() def onFileSaveAs(self): path,_ = QFileDialog.getSaveFileName(self, '保存文件', '', '文本文件 (*.txt)') if not path: return self._saveToPath(path) if __name__ == '__main__': app = QApplication(sys.argv) window = DemoFile() window.show() sys.exit(app.exec())运行结果如下图:
测试QFile
本文知识点 QFile是用于读取和写入文本及二进制文件的I/O设备。QFile和QTextStream结合使用打开和保存文本文件。前一篇: 实战PyQt5: 125-使用配置文件来保存和恢复应用的设置