QFileSystemModel - 检测空文件夹(使用“AllDirs”过滤器)?

Posted

技术标签:

【中文标题】QFileSystemModel - 检测空文件夹(使用“AllDirs”过滤器)?【英文标题】:QFileSystemModel -- Detecting empty folder (with 'AllDirs' filter)? 【发布时间】:2011-06-07 22:47:00 【问题描述】:

我在 Ruby 中使用 Qt 4.6(通过 QtRuby)并尝试制作一个通用的目录选择对话框,该对话框在查询文件系统和更新目录树 (QTreeView) 时显示一个小的“加载”字形.

更新:我必须说动画没有按预期工作,是否有另一种检测这些事件的方法(加载、加载)?请参阅下面的“关于另一个说明”。

我已经设法通过使用的 QFileSystemModel 的rowsInserted 信号连接“加载新目录”事件,工作得很好。我还可以通过rowsAboutToBeInserted 信号捕获“加载新目录”事件。然而,我正在尝试播放的动画(表示进度的简单动画 GIF,加载在 QMovie 中)正在播放即使已“扩展”的目录为空。这是我正在使用的代码:

# FileSystemModel extension which shows a 'busy' animation
# in a given Qt::Label
class FileSystemModelEx < Qt::FileSystemModel

  # Slot declarations
  slots "handle_ready(QModelIndex, int, int)"
      slots "handle_busy(QModelIndex, int, int)"

  # Parametrised constructor, initializes fields
  def initialize(p_parent, p_label, p_busy_icon, p_ready_icon)

      # Call superclass constructor
      super(p_parent)

      # Set instance vars
      @label = p_label
      @busy_icon = p_busy_icon
      @ready_icon = p_ready_icon

      # Connect 'finished loaded' event
      Qt::Object.connect(self,
                        SIGNAL('rowsAboutToBeInserted(QModelIndex, int, int)'),
                        self,
                        SLOT('handle_busy(QModelIndex, int, int)'))

      # Connect 'loading' event
      Qt::Object.connect(self, 
                        SIGNAL('rowsInserted(QModelIndex, int, int)'),
                        self,
                        SLOT('handle_ready(QModelIndex, int, int)'))
  end

  # Loading finished event, changes icon state to ready
  def handle_ready(p_index, p_start, p_end)
      set_icon(false)   

      puts "    done - loaded #rowCount(p_index) folders"
  end

  # Loading started event, changes icon state to busy
  def handle_busy(p_index, p_start, p_end)
      set_icon(true)

      path = fileInfo(p_index).canonicalFilePath
    puts "Loading . . . path = '#path'"
  end

  # Overriden start loading event
  def fetchMore(p_index)
      handle_busy(p_index, nil, nil)
      super(p_index)
  end

  # Utility method, switches icons, depending on a given state
  def set_icon(p_busy) 
      movie = (p_busy ? @busy_icon : @ready_icon)
      @label.setMovie(movie)
      movie.start
  end   

end # class FileSystemModelEx

我的问题是:如果加载的文件夹是空的,我怎样才能不播放动画?不能事先过滤空目录,不是吗?

另外说明,除了上述方法之外,还有其他方法可以实现此类“加载”/“加载”事件处理程序吗?我查看了信号、虚拟信号(fetchMorecanFetchMore,无济于事)、scanned the source,但我无法访问发送线程以检索更多文件的调用。覆盖 eventtimerEvent 没有帮助。

为了完整起见,这也是我正在使用的 QFileSystemModel:

# Creates a FileSystemModel which display folders only
def create_model
    @model = FileSystemModelEx.new(self, 
                @form.iconPlaceholderDir, 
                @loading_icon, @folder_icon)

    @model.setReadOnly(true)
    @model.setFilter(Qt::Dir::NoDotAndDotDot | Qt::Dir::AllDirs)
    @model.setRootPath(Qt::Dir.rootPath)


    @form.shellTreeView.setModel(@model)
end

任何帮助将不胜感激,在此先感谢! 如果需要,我可以提供更多详细信息,没问题。

【问题讨论】:

【参考方案1】:

您应该尝试连接模型的directoryLoaded(const QString&amp;) 插槽。它在目录已完全处理时发出信号。

使用 qt4-ruby (2.1.0) 构建与 Ruby 1.8.7 和 Qt 4.7.3 的示例应用

#!/usr/bin/ruby -w
require 'Qt4'

class MyObject < Qt::Object
    slots "mySlot(QString)"
    def mySlot(path)
        print "Done loading ", path, "\n"
    end
end

a = Qt::Application.new(ARGV)
m = Qt::FileSystemModel.new
v = Qt::TreeView.new
m.setRootPath("/")
v.setModel(m)
o = MyObject::new
Qt::Object.connect(m, SIGNAL('directoryLoaded(QString)'), o, SLOT('mySlot(QString)'))
v.show
a.exec

(请客气,这是我的第一个 ruby​​ “程序”...)

【讨论】:

我喜出望外,然后我才看到:“这个功能是在Qt 4.7中引入的”,我只能使用Qt 4.6(经过一些努力让它工作!),因为'最新' QtRuby 绑定(2.1.0,2010 年更新)仅提供与 4.6 的兼容性。感谢您的意见,非常感谢! 我刚刚尝试了我发布的示例代码,没有问题(除了我不知道 Ruby :-))。 qt4-ruby 针对 Qt 4.7.3(我安装的唯一版本)构建得很好。 看起来确实不错,我猜你不是在 Windows 上,对吧?我在让 QtRuby 使用 Qt 4.7.3 中的 .dll 时遇到问题,对此有什么想法吗?这是我写的一篇博文,描述了在 Windows 上安装 QtRuby 并使其绑定到提供的 4.6.1 .dll 的(痛苦的)方法:dr1ku.posterous.com/qt-461-ruby-187-on-win32。我很想知道您如何让 QtRuby 2.1.0 与 Qt 4.7.3 配合得很好。再次感谢您! 不,我在 Linux 上。使用针对 Qt 4.6 创建的 Qt4 Ruby .dll 不适用于 Qt 4.7。不确定在 Windows 上构建 qt4-ruby 有多么容易 - 因为它是基于 cmake 的,所以可能会起作用,但我对此没有任何经验。 是的,有一个安装程序很久没有更新了 (vision.eng.shu.ac.uk/mmvlwiki/index.php/…),它使用的是 Qt 4.3。我想我可以尝试联系作者来帮助那些(仍然)喜欢他们的 Win32 的可怜的开发人员 sap :) 感谢您的回复,它应该被接受。我可能会就另一个事件(“加载”)提出一个新问题,不确定是否可以覆盖 fetchMore。

以上是关于QFileSystemModel - 检测空文件夹(使用“AllDirs”过滤器)?的主要内容,如果未能解决你的问题,请参考以下文章

在 QFileSystemModel 中查找第 n 个文件/文件夹

如何在 QFileSystemModel 上隐藏文件扩展名

如何按文件名过滤 QFileSystemModel 的文件列表?

在 QFileSystemModel() 中列出文件的最佳方法?

在一个 QFileSystemModel 上应用两个 FileFilterProxyModel

遍历 QTreeView + QFileSystemModel 上具有所需文件扩展名的所有项目