首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用directoryChanged只发出一个QFileSystemWatcher信号

如何用directoryChanged只发出一个QFileSystemWatcher信号
EN

Stack Overflow用户
提问于 2015-02-17 21:57:54
回答 1查看 1.1K关注 0票数 1

下面是我的应用程序的基本前提:

我已经建立了一个QFileSystemWatcher来查看目录。

代码语言:javascript
复制
Path = [r'C:\Users\user\Documents\Images']
DirectoryWatcher = QtCore.QFileSystemWatcher(Path)
DirectoryWatcher.directoryChanged.connect(showImages.UpdateImages)

我过去使用过QFileSystemWatcher,它总是完美地工作(用于目录和文件的更改)。

应用程序将在\Image文件夹中显示图像的幻灯片。当新图像放置在“图像”文件夹中时,将重新设置幻灯片以包含新图像。如果从“图像”文件夹中删除图像,则将再次重置幻灯片。

我遇到的问题是:如果我将多个图像拖到\Image文件夹中,则会多次触发directoryChanged信号。会触发信号,并对添加到文件夹中的每个图像运行相应的UpdateImages()例程,即使同时添加它们(即选择多个图像,将它们拖放到\ image中)。

这是在破坏我的日常生活。是否有任何方法为一批目录更改触发一次directoryChanged信号?也就是说,在最终图像被添加到目录之前,我可以禁用信号吗?

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-18 01:07:52

解决方案是避免将directoryChanged信号连接到更新图像的插槽。相反,只要在发生任何更改时设置一个标志,然后定期检查该标志是否需要更新(这可以通过一个简单的计时器机制来完成)。

下面是一个基本的脚本,它演示了这个想法:

代码语言:javascript
复制
import sys, os
from PyQt4 import QtCore, QtGui

class Window(QtGui.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.list = QtGui.QListWidget(self)
        self.button = QtGui.QPushButton('Choose Directory', self)
        self.button.clicked.connect(self.handleSetDirectory)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.list)
        layout.addWidget(self.button)
        self.watcher = QtCore.QFileSystemWatcher(self)
        self.watcher.directoryChanged.connect(self.handleDirectoryChanged)
        self.timer = QtCore.QTimer(self)
        self.timer.setInterval(500)
        self.timer.timeout.connect(self.handleTimer)
        self.handleSetDirectory(QtCore.QDir.tempPath())

    def handleDirectoryChanged(self):
        self.timer.stop()
        print('Directory Changed')
        self._changed = True
        self.timer.start()

    def handleSetDirectory(self, directory=None):
        if not directory:
            directory = QtGui.QFileDialog.getExistingDirectory(self)
        if directory:
            self.timer.stop()
            self.watcher.removePaths(self.watcher.directories())
            self._changed = False
            self.watcher.addPath(directory)
            self.updateList()
            self.timer.start()

    def handleTimer(self):
        if self._changed:
            self._changed = False
            self.updateList()

    def updateList(self):
        print('Update List')
        self.list.clear()
        for directory in self.watcher.directories():
            self.list.addItems(os.listdir(directory))

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.resize(250, 600)
    window.show()
    sys.exit(app.exec_())
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28571899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档