修改
问题在于其他问题所以麻烦不是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
中选择了一个选项,则会发生魔术,创建对象,填充哈希值并使右侧的单元格填充适当的文本(通过Qt::StandardItem
)Qt::PushButton
之外的Qt::TableView
。然后,它会遍历模型,测试是否选中了复选框,并尝试访问相应ComboBox
中的值。问题是,当我插入试图访问Qt::ComboBox,
的代码时,我无法插入Qt::StandardItem
,因为我无法获取模型,因为Qt::TableView.model
返回{ {1}}(在某些时候)。
我不知道为什么以及如何发生这种情况。这是随机的,有时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