Tôi cho rằng câu hỏi của bạn không bao gồm phát hiện thay đổi, vì mẫu của bạn chỉ liên quan đến QgsMapCanvas.refresh()
Thay vào đó bạn phải gọi QgsRasterLayer.triggerRepaint()
Nếu lớp của bạn được gọi là myLayer:
myLayer.setCacheImage( None )
myLayer.triggerRepaint()
Phương pháp tương tự tồn tại cho các lớp vector là tốt.
Đối với thông báo thay đổi tệp trên không thấp, tôi đề xuất xem xét Qt QFileSystemWatcher
, sử dụng inotify trên linux và các kỹ thuật tương tự trên các nền tảng khác .
from PyQt4.QtCore import QFileSystemWatcher
def refreshLayer():
myLayer.setCacheImage( None )
myLayer.triggerRepaint()
watcher = QFileSystemWatcher()
watcher.addPath( '/path/to/your/raster' )
watcher.fileChanged.connect( refreshLayer )
Tất nhiên, điều này có thể được kết hợp với kiểm tra MD5 theo đề xuất của các biệt danh hoặc kiểm tra thời gian sửa đổi với os.stat
(đề xuất của Nathan W).