Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 当使用Nokogiri时,为什么::TableView.model返回nilClass?_Ruby_Nokogiri_Qtableview_Qcombobox_Qstandarditemmodel - Fatal编程技术网

Ruby 当使用Nokogiri时,为什么::TableView.model返回nilClass?

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

编辑

问题出在其他方面,所以问题不是真正的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 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。