QFileSystemModel - 检测空文件夹(使用“AllDirs”过滤器)?
Posted
技术标签:
【中文标题】QFileSystemModel - 检测空文件夹(使用“AllDirs”过滤器)?【英文标题】:QFileSystemModel -- Detecting empty folder (with 'AllDirs' filter)? 【发布时间】:2011-06-07 22:47:00 【问题描述】:我在 Ruby 中使用 Qt 4.6(通过 QtRuby)并尝试制作一个通用的目录选择对话框,该对话框在查询文件系统和更新目录树 (QTreeView) 时显示一个小的“加载”字形.
更新:我必须说动画没有按预期工作,是否有另一种检测这些事件的方法(加载、加载)?请参阅下面的“关于另一个说明”。
我已经设法通过使用的 QFileSystemModel 的rowsInserted
信号连接“加载新目录”事件,工作得很好。我还可以通过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
,无济于事)、scanned the source,但我无法访问发送线程以检索更多文件的调用。覆盖 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
(请客气,这是我的第一个 ruby “程序”...)
【讨论】:
我喜出望外,然后我才看到:“这个功能是在Qt 4.7中引入的”,我只能使用Qt 4.6(经过一些努力让它工作!),因为'最新' QtRuby 绑定(2.1.0,2010 年更新)仅提供与 4.6 的兼容性。感谢您的意见,非常感谢! 我刚刚尝试了我发布的示例代码,没有问题(除了我不知道 Ruby :-))。 qt4-ruby 针对 Qt 4.7.3(我安装的唯一版本)构建得很好。 看起来确实不错,我猜你不是在 Windows 上,对吧?我在让 QtRuby 使用 Qt 4.7.3 中的 .dll 时遇到问题,对此有什么想法吗?这是我写的一篇博文,描述了在 Windows 上安装 QtRuby 并使其绑定到提供的 4.6.1 .dll 的(痛苦的)方法:dr1ku.posterous.com/qt-461-ruby-187-on-win32。我很想知道您如何让 QtRuby 2.1.0 与 Qt 4.7.3 配合得很好。再次感谢您! 不,我在 Linux 上。使用针对 Qt 4.6 创建的 Qt4 Ruby .dll 不适用于 Qt 4.7。不确定在 Windows 上构建 qt4-ruby 有多么容易 - 因为它是基于 cmake 的,所以可能会起作用,但我对此没有任何经验。 是的,有一个安装程序很久没有更新了 (vision.eng.shu.ac.uk/mmvlwiki/index.php/…),它使用的是 Qt 4.3。我想我可以尝试联系作者来帮助那些(仍然)喜欢他们的 Win32 的可怜的开发人员 sap :) 感谢您的回复,它应该被接受。我可能会就另一个事件(“加载”)提出一个新问题,不确定是否可以覆盖 fetchMore。以上是关于QFileSystemModel - 检测空文件夹(使用“AllDirs”过滤器)?的主要内容,如果未能解决你的问题,请参考以下文章
在 QFileSystemModel 中查找第 n 个文件/文件夹
如何按文件名过滤 QFileSystemModel 的文件列表?
在 QFileSystemModel() 中列出文件的最佳方法?