为什么:: TableView.model在使用Nokogiri时返回nilClass?

时间:2013-06-16 08:28:50

标签: ruby nokogiri qtableview qcombobox qstandarditemmodel

修改

问题在于其他问题所以麻烦不是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中选择了一个选项,则会发生魔术,创建对象,填充哈希值并使右侧的单元格填充适当的文本(通过Qt::StandardItem
  4. 然后可以选中该复选框。
  5. 选择用户想要的行后,可以点击位于Qt::PushButton之外的Qt::TableView。然后,它会遍历模型,测试是否选中了复选框,并尝试访问相应ComboBox中的值。
  6. 问题是,当我插入试图访问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
    

0 个答案:

没有答案