QFileSystemModel - Обнаружение пустой папки (с фильтром AllDirs)? - PullRequest
2 голосов
/ 08 июня 2011

Я использую Qt 4.6 в Ruby (через 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

Мой вопрос будет : Как я могу предотвратить воспроизведение анимации, если загруженная папка пуста?Нельзя предварительно фильтровать пустые каталоги, не правда ли?

В другом примечании , есть ли другой способ реализации таких обработчиков событий «загрузки» / «загрузки», кроме описанного выше?Я просмотрел сигналы, виртуальные (fetchMore и canFetchMore, но безрезультатно), отсканировал источник , но все же не могу дозвониться до вызова, который отправляет нить на поиски получения дополнительных файлов.Переопределение event или timerEvent не помогает.

Для завершения, я также использую 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 Ответ

1 голос
/ 08 июня 2011

Вы должны попробовать подключить слот модели 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

(Будьте добрыэто моя самая первая рубиновая "программа" ...)

...