1

次のコードがあります。

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)

ボタンをクリックしたときに次の画面が表示されるようにするには、どのような変更を加える必要があるかを誰かに教えてもらえますか?

4

1 に答える 1

0

まず、大文字と小文字を区別するファイルシステムを使用しており、互換性の理由から、正しい大文字と小文字を使用することをお勧めするため、システムを変更require 'qt'する必要がありました。require 'Qt'

スクリプトを実行できるようになると、スタック トレースは実際にはSystemStackError提供されたメッセージにすぎないことがわかりました。だから私は少し周りを見回して、ここで便利なスニペットを見つけました:(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()どこにも宣言が表示されずquit()、そのような方法でアクセスできるかどうかもわかりませんSLOT

更新:SLOT問題は呼び出しであると確信しています。たとえば、これは完全に正常に機能します。

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

ここでの問題は、それが実装されているのではなく、アプリケーションにquit実装されていることです。QtWidgetただし、ウィンドウを閉じるだけで、開いているウィンドウがなくなると、デフォルトでアプリケーションが終了します。

connect(exit, SIGNAL(:clicked)) { close() }
于 2016-02-03T10:54:54.000 に答える