2

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

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

我已经设法通过rowsInserted使用的 QFileSystemModel 的信号连接“加载新目录”事件,工作得很好。我还可以通过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,无济于事),扫描了源代码,但我无法访问发送线程以检索更多文件的调用。压倒一切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

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

4

1 回答 1

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

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

于 2011-06-08T06:06:28.400 回答