我在 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
我的问题是:如果加载的文件夹是空的,我怎样才能不播放动画?不能事先过滤空目录,不是吗?
另一方面,除了上述方法之外,还有其他方法可以实现此类“加载”/“加载”事件处理程序吗?我查看了信号、虚拟信号(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
任何帮助将不胜感激,在此先感谢!如果需要,我可以提供更多详细信息,没问题。