qt - 在上下文管理方面,QFile.open() 的行为与 Python 的 open() 类似吗?

标签 qt pyqt pyside with-statement qfile

Qt4.8 文档(如提到的 here )建议 QtCore.QFile 对象在销毁时关闭其文件(如果文件已打开)。

这是否意味着这个 PyQt4 代码片段

my_file = QtCore.QFile('some_file.bin')
my_file.open(QtCore.QFile.ReadOnly)
... do stuff that might raise an exception ...

与此非 PyQt 代码片段类似,它使用 open() 作为上下文管理器?

with open('some_file.bin', 'rb') as my_file:
   ... do stuff that might raise an exception ...

也就是说,当出现问题并且程序退出时,文件会自动关闭(如所讨论的,例如 here )。

最佳答案

没有。如果发生错误,QFile 不会自动关闭。事实上,也不会有异常(exception)。 Qt 根本不执行异常,因此您需要检查返回值并查询 error() 方法。

以下是一些示例输出:

>>> f = QtCore.QFile('/tmp/test.txt')
>>> f.open(QtCore.QIODevice.ReadWrite)
True
>>> f.resize(10)
True

请注意,Qt 在此仅返回 True/False,而 Python 在出现问题时会引发 OSError/IOError

>>> f.readAll()
PyQt4.QtCore.QByteArray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
>>> f.error() == QtCore.QFile.NoError
True

这里需要进行显式检查,以确保读取时没有发生错误。

>>> f.close()
>>> f.open(QtCore.QIODevice.ReadOnly)
True
>>> f.resize(20)
False
>>> f.error() == QtCore.QFile.ResizeError
True

现在已经引发了一个错误 - 但没有引发异常,并且文件仍然打开且可读:

>>> f.isOpen()
True
>>> f.readAll()
PyQt4.QtCore.QByteArray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
>>> f.error() == QtCore.QFile.NoError
True

删除QFile会自动关闭它;但否则,您将需要显式关闭它以释放资源 - 即使在其生命周期内发生错误。

关于qt - 在上下文管理方面,QFile.open() 的行为与 Python 的 open() 类似吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45333784/

相关文章:

c++ - 如何在 QT 框架的 UI 上显示一个 "*.png"文件?

Qt 模型/ View : how to handle underlying data properly

QMimeData 中的 Python 对象

python - 如何使 super() 在 python 中的这种非理想情况下工作?

python - Phonon 可以播放 FLAC 文件吗?

python - 通过 QValidator 验证可编辑的 QCombobox 输入是否是目录

c++ - 与使用 Qt 处理 ZeroMQ 的永久线程通信

c++ - 使用脚本运行 Qt 程序会导致程序在退出时重新启动

python - PyQT - 如何获取图像选择的坐标

python - QProcess 未调用完成?