Ruby 当使用Nokogiri时,为什么::TableView.model返回nilClass?
编辑 问题出在其他方面,所以问题不是真正的Qt,我仍然不知道为什么会发生这种情况 问题是,在方法Ruby 当使用Nokogiri时,为什么::TableView.model返回nilClass?,ruby,nokogiri,qtableview,qcombobox,qstandarditemmodel,Ruby,Nokogiri,Qtableview,Qcombobox,Qstandarditemmodel,编辑 问题出在其他方面,所以问题不是真正的Qt,我仍然不知道为什么会发生这种情况 问题是,在方法display\u filesize@yt.get\u filesize(row\u id,format)中,我使用Nokogiri解析XML。我不知道XML是否损坏(它是从quvi加载的),但它肯定是罪魁祸首。切换到XMLSimple后,一切正常 我使用的代码是: def get_filesize(video_id, format) video = @videos[video_id] if
display\u filesize@yt.get\u filesize(row\u id,format)
中,我使用Nokogiri解析XML。我不知道XML是否损坏(它是从quvi
加载的),但它肯定是罪魁祸首。切换到XMLSimple后,一切正常
我使用的代码是:
def get_filesize(video_id, format)
video = @videos[video_id]
if video.formats[format].empty?
to_parse = `quvi --xml --format #{format} #{video.player_url}`
parsed = Nokogiri.parse(to_parse)
video.formats[format] = { :size => parsed.at('length_bytes').text,
:url => parsed.at('link').at('url').text }
end
video.formats[format][:size]
end
现在我使用这样的方法:
def get_filesize(video_id, format)
video = @videos[video_id]
if video.formats[format].empty?
to_parse = `quvi --xml --format #{format} #{video.player_url}`
parsed = XmlSimple.xml_in(to_parse, {'KeyAttr' => 'name'})
video.formats[format] = { :size => parsed['link'][0]['length_bytes'][0],
:url => URI.decode(parsed['link'][0]['url'][0]) }
end
video.formats[format][:size]
end
它工作得很好。不过,我不知道它为什么会坠毁。这才是真正的问题
老问题 我有一个
Qt::TableView
包含Qt::StandardItemModel
。模型中的一行由文本、Qt::butdown
、复选框和Qt::ComboBox
组成。它的工作原理如下:
def get_filesize(video_id, format)
video = @videos[video_id]
if video.formats[format].empty?
to_parse = `quvi --xml --format #{format} #{video.player_url}`
parsed = XmlSimple.xml_in(to_parse, {'KeyAttr' => 'name'})
video.formats[format] = { :size => parsed['link'][0]['length_bytes'][0],
:url => URI.decode(parsed['link'][0]['url'][0]) }
end
video.formats[format][:size]
end
Qt::butdown
,下一个单元格将填充一个Qt::ComboBox
,其中包含其他可供选择的值Qt::ComboBox
中选择一个选项,就会发生神奇的事情,创建对象,填充哈希,并用适当的文本填充右侧的单元格(通过Qt::StandardItem
)Qt::TableView
外部的Qt::button
。然后,它遍历模型,测试复选框是否被选中,是否应该选中,并尝试访问相应的组合框中的值
Qt::ComboBox的代码时,
我无法插入Qt::StandardItem
,因为我无法获取模型,因为Qt::TableView.model
在某个点返回NilClass
我不知道为什么会这样,怎么会这样。这是一件随机的事情,有时Qt::ComboBox
的值可以更改几次,有时第一次尝试以错误结束
下面是我如何创建Qt::StandardItem
:
def display_filesize
row_id = row_id_from_object_name(sender.objectName)
format = sender.currentText
filesize = @yt.get_filesize(row_id, format) # get the text
filesize_item = Qt::StandardItem.new("#{(filesize.to_i/1024/1024)} MB ")
# @tc simply stores the indexes of columns so I can access them easily
@ui.tableView.model.setItem(row_id, @tc[:filesize], filesize_item)
end
下面是我如何尝试访问Qt::ComboBox
值:
model = @ui.tableView.model
checked = model.rowCount.times.map do |i|
if model.item(i, @tc[:check]).checkState == Qt::Checked
# if I remove the following two lines it works...
index = model.index(i, @tc[:formats])
format = @ui.tableView.indexWidget(index).currentText
@yt.videos[i][format]
end
end
这就是我试图摆脱的错误:
searcher.rb:86:in `display_filesize': undefined method `index' for nil:NilClass (NoMethodError)
from /var/lib/gems/1.9.1/gems/qtbindings-4.8.3.0/lib/Qt/qtruby4.rb:469:in `qt_metacall'
from /var/lib/gems/1.9.1/gems/qtbindings-4.8.3.0/lib/Qt/qtruby4.rb:469:in `method_missing'
from /var/lib/gems/1.9.1/gems/qtbindings-4.8.3.0/lib/Qt/qtruby4.rb:469:in `exec'
from qutub-player.rb:17:in `<main>'
searcher.rb:86:in'display_filesize':nil:NilClass(NoMethodError)的未定义方法'index'
from/var/lib/gems/1.9.1/gems/qtbindings-4.8.3.0/lib/Qt/qtruby4.rb:469:in'Qt_metacall'
from/var/lib/gems/1.9.1/gems/qtbindings-4.8.3.0/lib/Qt/qtruby4.rb:469:in'method_missing'
from/var/lib/gems/1.9.1/gems/qtbindings-4.8.3.0/lib/Qt/qtruby4.rb:469:in'exec'
来自qutub播放器。rb:17:in`'
您没有显示任何XML,那么我们如何回答您的问题呢?Nokogiri可以很容易地判断XML是否有问题;解析后只需检查parsed.errors
,看看它是空的还是有内容。使用Nokogiri.XML(…)
解析XML。依赖于parsed=Nokogiri.parse(to_parse)
,如果Nokogiri在文档顶部找到一个“HTML”标记,则可以将其解析为HTML。这会在搜索时导致糟糕的结果。这并不是很相关,但我已经发布了ruby的quvi绑定,并且可以走捷径,不使用XML。