我在Ruby中使用Qt 4.6(通过QtRuby)并尝试创建一个通用的目录选择对话框,在查询文件系统并更新目录树(QTreeView)时显示一个小的“加载”字形。
UPDATE :我必须说动画没有按预期工作,是否有另一种方法来检测这些事件(加载,加载)?请参阅下面的“另一个注释”。
我已经设法通过所使用的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
任何帮助将不胜感激,提前感谢! 如果需要,我可以提供进一步的细节,没问题。
答案 0 :(得分: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
(善待,这是我的第一个红宝石“程序”......)