使用 QFileSystemWatcher 获取更改文件的路径?
Posted
技术标签:
【中文标题】使用 QFileSystemWatcher 获取更改文件的路径?【英文标题】:Getting the path to changed file with QFileSystemWatcher? 【发布时间】:2015-10-28 15:46:00 【问题描述】:来自How do I watch a file for changes?中的sn-p:
...
@QtCore.pyqtSlot(str)
def file_changed(path):
print('File Changed!!!')
...
我假设处理程序的参数path
将是更改的文件的路径(http://doc.qt.io/qt-4.8/qfilesystemwatcher.html 并没有真正说明应该期待什么 说“ fileChanged
... 指定路径处的文件被修改、重命名或从磁盘中删除时发出信号。”)。但是,然后我运行以下示例(ubuntu 14.04,python 2.7.6,对应的 py-qt4):
import sys, os
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import SIGNAL
from PyQt4 import Qt
mydir = os.path.dirname( os.path.realpath(__file__) )
myfile = os.path.join( mydir, "file.dat" )
print("myfile", myfile)
with open(myfile,"a+") as f:
f.write("line 1\n")
class MyWindow(QtGui.QWidget):
def __init__(self):
global myfile
QtGui.QWidget.__init__(self)
self.button = QtGui.QPushButton('Test', self)
self.button.clicked.connect(self.handleButton)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.button)
self.fs_watcher = QtCore.QFileSystemWatcher( [myfile] )
self.fs_watcher.connect(self.fs_watcher, QtCore.SIGNAL('fileChanged(const QString &)'), self.file_changed) # or just 'fileChanged(QString)'
def handleButton(self):
print ('Hello World')
@QtCore.pyqtSlot(str) #
def file_changed(path):
print('File Changed!!!' + str(path)) #
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
window = MyWindow()
# try to trigger file change here:
with open(myfile,"a+") as f:
f.write("line 2\n")
window.show()
sys.exit(app.exec_())
...它输出:
...
File Changed!!!<__main__.MyWindow object at 0xb5432b24>
...
那么,这个参数似乎不是接收更改文件的路径,而是对包含类的引用?!
那么如何获取更改文件的路径?
【问题讨论】:
def file_changed(self, path):
.
感谢@ekhumoro - 效果很好;随意发布作为答案,我最终会接受它......
【参考方案1】:
file_changed
插槽如果要成为MyWindow
的方法,则需要一个self
参数:
@QtCore.pyqtSlot(str)
def file_changed(self, path):
print('File Changed!!!' + str(path))
【讨论】:
以上是关于使用 QFileSystemWatcher 获取更改文件的路径?的主要内容,如果未能解决你的问题,请参考以下文章
用QFileSystemWatcher来监视文件和目录的改变(内部还是使用了timer)
用QFileSystemWatcher来监视文件和目录的改变(内部还是使用了timer)