0

编辑

问题出在其他东西上,所以问题并不是真正的 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。它是这样工作的:

  1. 用户会看到文本值,如果他们愿意,可以进一步探索。
  2. 用户单击Qt::PushButton,下一个单元格将填充一个Qt::ComboBox包含其他可能的值以供选择。
  3. 如果用户从 中选择一个选项Qt::ComboBox,就会发生奇迹,创建对象,填充哈希,右侧的单元格会填充适当的文本(通过 a Qt::StandardItem
  4. 然后可以选中复选框。
  5. 选择用户想要的行后,可以单击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>'
4

0 回答 0