编辑
问题出在其他东西上,所以问题并不是真正的 Qt,我仍然不知道为什么会这样。
问题是在display_filesize @yt.get_filesize(row_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::PushButton
、、复选框和组成Qt::ComboBox
。它是这样工作的:
- 用户会看到文本值,如果他们愿意,可以进一步探索。
- 用户单击
Qt::PushButton
,下一个单元格将填充一个Qt::ComboBox
包含其他可能的值以供选择。 - 如果用户从 中选择一个选项
Qt::ComboBox
,就会发生奇迹,创建对象,填充哈希,右侧的单元格会填充适当的文本(通过 aQt::StandardItem
) - 然后可以选中复选框。
- 选择用户想要的行后,可以单击
Qt::PushButton
位于之外的行。Qt::TableView
然后它遍历模型,测试复选框是否被选中,是否应该选中,尝试访问适当的ComboBox
.
问题是,当我插入尝试访问的代码时,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>'