QFileSystemModel - Обнаружение пустой папки (с фильтром AllDirs)?
Я использую 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 ответ
Вы должны попробовать подключить модель 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
(Будьте добры, это моя самая первая рубиновая "программа"...)