【问题标题】:QtRuby: Stack Level too deep (SystemStackError)QtRuby:堆栈级别太深(SystemStackError)
【发布时间】:2016-02-03 01:29:52
【问题描述】:

我有以下代码:

require 'qt'

class Menu < Qt::Widget
  slots 'on_clicked_uAuth()'
  slots 'quit()'

  def initialize(parent = nil)
    super(parent)
    setWindowTitle "Menu"
    uAuth_ui
    exit_ui
    resize 350, 500
    move 300, 300
    show
  end
  def uAuth_ui
    uAuth = Qt::PushButton.new 'Auth', self
    uAuth.resize 150, 35
    uAuth.move 100, 100
    connect uAuth, SIGNAL('clicked()'), self, SLOT('on_clicked_uAuth()')
  end
  def exit_ui
    exit = Qt::PushButton.new 'Exit', self
    exit.resize 120, 40
    exit.move 115, 420
    connect exit, SIGNAL('clicked()'), self, SLOT('quit()')
  end
end

app = Qt::Application.new(ARGV)
Menu.new
app.exec

当我单击任一按钮时,我收到以下错误:

stack level too deep (SystemStackError)

有人可以告诉我应该做哪些更改,以便在我单击按钮时进入下一个屏幕吗?

【问题讨论】:

    标签: ruby qtruby


    【解决方案1】:

    首先,我必须在我的系统上将 require 'qt' 更改为 require 'Qt',因为我使用区分大小写的文件系统,并且出于兼容性原因,我建议使用正确的大小写。

    一旦我能够运行您的脚本,我意识到堆栈跟踪实际上只是您提供的 SystemStackError 消息。所以我环顾四周,发现了一个有用的 sn-p here:(显然你在 Ruby 2.2 中不再需要它,但我现在没有安装它,所以我没有费心去尝试)

    set_trace_func proc {
      |event, file, line, id, binding, classname| 
      if event == "call"  && caller_locations.length > 500
        fail "stack level too deep"
      end
    }
    

    您在执行应用程序之前将其添加到某处,堆栈跟踪将更加有用:

    from /usr/lib/ruby/vendor_ruby/2.1.0/Qt/qtruby4.rb:2531:in `debug_level'
    from /usr/lib/ruby/vendor_ruby/2.1.0/Qt/qtruby4.rb:2714:in `do_method_missing'
    from /usr/lib/ruby/vendor_ruby/2.1.0/Qt/qtruby4.rb:2711:in `do_method_missing'
    from /usr/lib/ruby/vendor_ruby/2.1.0/Qt/qtruby4.rb:2667:in `do_method_missing'
    from /usr/lib/ruby/vendor_ruby/2.1.0/Qt/qtruby4.rb:469:in `method_missing'
    from /usr/lib/ruby/vendor_ruby/2.1.0/Qt/qtruby4.rb:469:in `qt_metacall'
    from /usr/lib/ruby/vendor_ruby/2.1.0/Qt/qtruby4.rb:469:in `method_missing'
    from /usr/lib/ruby/vendor_ruby/2.1.0/Qt/qtruby4.rb:469:in `qt_metacall'
    from /usr/lib/ruby/vendor_ruby/2.1.0/Qt/qtruby4.rb:469:in `method_missing'
    from /usr/lib/ruby/vendor_ruby/2.1.0/Qt/qtruby4.rb:469:in `qt_metacall'
    from /usr/lib/ruby/vendor_ruby/2.1.0/Qt/qtruby4.rb:469:in `method_missing'
    

    所以不知何故,它陷入了调用不存在的方法的无限循环中(因此堆栈级别最终太深)。

    现在我无法解决您的问题,但似乎缺少某些方法。我在任何地方都看不到on_clicked_uAuth() 的声明,我也不确定是否可以像这样使用SLOT 访问quit()

    更新:我现在很确定问题是 SLOT 调用。 例如,这工作得很好:

    connect(exit, SIGNAL(:clicked)) { puts "Hello world." }
    

    现在这里的问题是quit 没有在QtWidget 上实现,而是在应用程序上实现。但是,您可以关闭窗口,如果没有更多窗口打开,应用程序将默认终止:

    connect(exit, SIGNAL(:clicked)) { close() }
    

    【讨论】:

    • 即使我觉得错误与定义 on_click_uAuth() 有关。基本上,我需要为 on_click_uAuth() 编写一个方法,以便在单击按钮时,它应该将我引导到一个新窗口。欢迎任何建议
    • 在 Ruby 类中编写方法,并像我的答案中最后一个代码 sn-p 一样连接信号(如果只是一个简短的操作,请将 close 方法调用替换为您要进行的调用你甚至可以将它直接写入块中)
    • 我在另一个文件中定义了另一个名为“Auth”的类。那么如何通过单击 on_click_uAuth 从另一个文件中调用该方法?
    • 要调用该方法,您需要一个该类的实例。 (您在实例/对象上调用方法。)现在您必须决定要在哪里创建实例以及在哪里需要它。此外,如果您的课程在另一个文件中,您必须导入该文件。在 Ruby 中,您很可能希望为此使用 require_relative。
    • 上面的代码块对我有用。这很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 2013-10-05
    • 2014-10-25
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多