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

时间:2011-06-07 22:47:01

标签: qt user-interface qt4 qtruby

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

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

我已经设法通过所使用的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 个答案:

答案 0 :(得分:1)

您应该尝试连接模型的directoryLoaded(const QString&)广告位。它会在目录完全处理完毕后发出信号。

使用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

(善待,这是我的第一个红宝石“程序”......)