2017-07-26 57 views
0

Qt4.8文檔(如提到的here)表明QtCore.QFile對象在銷燬時關閉其文件(如果該文件已打開)。PyQt4.QtCore.QFile.open()的行爲與Python的open()一樣嗎?

難道說,這PyQt4的片斷

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

類似於這種非PyQt的片段?

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

即,在該文件的條件時出現錯誤,並且程序退出(如例如討論here)被自動關閉。

回答

3

如果發生錯誤,則不會自動關閉No. A QFile。事實上,也不會有任何例外。 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會自動關閉;但除此之外,即使在其生命週期中發生錯誤,您也需要明確地關閉它以釋放資源。

+0

感謝您的明確答案和很好的例子。還有一件事:假設在QFile.open()之後,我做了一些與該文件無關的事情,即_does_引發了一個異常,該異常未被捕獲並導致程序退出。在那種情況下,我猜QFile會被刪除,所以文件_will_會自動關閉? – Dennis

+1

@丹尼斯。它取決於是否還有對'QFile'的引用。如果有任何事情保持活躍狀態​​,一個例外*本身*不會導致它自動關閉。但是,當然,如果程序退出,它最終會被刪除。 – ekhumoro