使用 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 获取更改文件的路径?的主要内容,如果未能解决你的问题,请参考以下文章

Qt 之 QFileSystemWatcher

用QFileSystemWatcher来监视文件和目录的改变(内部还是使用了timer)

用QFileSystemWatcher来监视文件和目录的改变(内部还是使用了timer)

QFileSystemWatcher 不为另一个应用程序所做的更改发出 fileChanged 信号

Qt 文件监视器 QFileSystemWatcher

如何使用 PyQt/PySide 获取与特定文件类型关联的图标?