Я использую 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
Любая помощь будет оценена, спасибозаблаговременно!Я могу предоставить дополнительную информацию, если возникнет такая необходимость, без проблем.