使用QtRuby获取对发射小部件的引用

时间:2013-11-24 18:01:36

标签: ruby qt qtruby

我目前正在将信号连接到这样的函数:

 dashboard.ui.start_button_r1.connect(:clicked, dashboard.ui.start_button_r1, :handler)

其中start_button_r1QPushButton

现在我想要的是对handler内的发送小部件的引用,因为我将此信号连接到多个小部件。理想情况下,我希望我的处理函数能够接收我可以使用的emitter参数。我可以将handler放在继承自Qt::Object的类(比如HandlerContainer)并调用sender(),但是如何将信号连接到HandlerContainer的内在的方法?我尝试了instance.method(:handler),但是连接没有以这种方式接收插槽

我通常在PyQt中使用这种方法,但无法弄清楚如何使用Ruby。我觉得我做的事情非常糟糕,因为关于如何使用QtRuby从插槽中获取发件人的讨论不多。通常怎么做?我已经阅读了有关QSignalMapper的内容,但这对我的用例来说似乎太过分了。

1 个答案:

答案 0 :(得分:1)

您可以使用QObject::sender()功能执行此操作。正如您在handler插槽中所说的那样,对类型进行类型转换sender(),您希望在您的情况下QPushButton,并且您已获得对发件人对象的引用。

在c ++中可以这样做:

// inside handler method
QPushButton *tmpBtn= dynamic_cast<QPushButton*>(sender());

编辑:

 A minimal example on how to do this in Ruby:

class SlotContainer < Qt::Object
   slots "handler()"

   def handler
    puts "called by: " + sender().to_s
   end
end

if $0 == __FILE__
    app = Qt::Application.new(ARGV) 
    ui = Ui_MainWindow.new
    container = SlotContainer.new
    window = Qt::MainWindow.new
    ui.setupUi(window)
    Qt::Object.connect(ui.pushButton, SIGNAL("clicked()"), container, SLOT("handler()"))
    window.show
    app.exec
end