QtRuby:堆栈级别太深(SystemStackError)

QtRuby:堆栈级别太深(SystemStackError),ruby,qtruby,Ruby,Qtruby,我有以下代码: 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

我有以下代码:

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

有人能告诉我应该做些什么更改吗?这样,当我单击按钮时,我就可以进入下一个屏幕了?

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

一旦我能够运行您的脚本,我意识到堆栈跟踪实际上就是您提供的
SystemStackError
消息。所以我四处看了看,发现了一个有用的片段:(显然,Ruby 2.2中不再需要这个,但我现在没有安装它,所以我没有费心尝试)

在执行应用程序之前将其添加到某个位置,堆栈跟踪将变得更加有用:

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'
因此,不知何故,它陷入了调用一个不存在的方法的无休止的循环中(因此堆栈级别太深)

现在,我无法解决您的问题,但似乎缺少某种方法。我在任何地方都看不到
的声明,我也不确定
quit()
是否可以像那样通过
槽访问

更新:我很确定现在的问题是
插槽的调用。
例如,这非常有效:

connect(exit, SIGNAL(:clicked)) { puts "Hello world." }
现在的问题是,
quit
不是在
QtWidget
上实现的,而是在应用程序上实现的。但是,您可以只关闭窗口,如果没有其他窗口打开,应用程序将默认终止:

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

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

一旦我能够运行您的脚本,我意识到堆栈跟踪实际上就是您提供的
SystemStackError
消息。所以我四处看了看,发现了一个有用的片段:(显然,Ruby 2.2中不再需要这个,但我现在没有安装它,所以我没有费心尝试)

在执行应用程序之前将其添加到某个位置,堆栈跟踪将变得更加有用:

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'
因此,不知何故,它陷入了调用一个不存在的方法的无休止的循环中(因此堆栈级别太深)

现在,我无法解决您的问题,但似乎缺少某种方法。我在任何地方都看不到
的声明,我也不确定
quit()
是否可以像那样通过
槽访问

更新:我很确定现在的问题是
插槽的调用。
例如,这非常有效:

connect(exit, SIGNAL(:clicked)) { puts "Hello world." }
现在的问题是,
quit
不是在
QtWidget
上实现的,而是在应用程序上实现的。但是,您可以只关闭窗口,如果没有其他窗口打开,应用程序将默认终止:

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

甚至我也觉得这个错误与定义on_click_uAuth()有关。基本上,我需要为on_click_uAuth()编写一个方法,这样在单击按钮时,它会将我指向一个新窗口。任何建议都可以在Ruby类中编写方法并连接信号,就像我回答中的最后一个代码片段一样(将close方法调用替换为您想要进行的调用,如果这只是一个简短的操作,您甚至可以将其直接写入块中)。我有另一个名为“Auth”的类,它位于不同的文件中。那么,我如何通过单击另一个文件来调用该方法呢?要调用该方法,您需要该类的一个实例。(您可以调用实例/对象上的方法。)现在您必须决定要在何处创建实例以及需要它的位置。此外,如果类位于另一个文件中,则必须导入该文件。在Ruby中,您很可能希望使用require_relative来实现这一点。这帮了大忙。就连我都觉得这个错误与定义on_click_uAuth()有关。基本上,我需要为on_click_uAuth()编写一个方法,这样在单击按钮时,它会将我指向一个新窗口。任何建议都可以在Ruby类中编写方法并连接信号,就像我回答中的最后一个代码片段一样(将close方法调用替换为您想要进行的调用,如果这只是一个简短的操作,您甚至可以将其直接写入块中)。我有另一个名为“Auth”的类,它位于不同的文件中。那么,我如何通过单击另一个文件来调用该方法呢?要调用该方法,您需要该类的一个实例。(您可以调用实例/对象上的方法。)现在您必须决定要在何处创建实例以及需要它的位置。此外,如果类位于另一个文件中,则必须导入该文件。在Ruby中,您很可能希望使用require_relative来实现这一点。这帮了大忙。