Получение ссылки на исходящий виджет с помощью QtRuby

В настоящее время я подключаю сигнал к такой функции:

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

где start_button_r1 это QPushButton

Теперь, что я хочу, это ссылка на отправляющий виджет внутри handler, так как я подключу этот сигнал к нескольким виджетам. В идеале я хотел бы, чтобы моя функция обработчика получала emitter аргумент, с которым я могу поиграть. Я мог бы поставить handlerв классе, наследующем от Qt::Object (сказать HandlerContainer) и позвоните sender(), но тогда как мне подключить сигнал к HandlerContainerвнутренний метод? Я старался instance.method(:handler)но соединение не получает слоты таким образом

Я обычно использую этот подход в PyQt, но не могу понять, как это сделать с Ruby. Я чувствую, что делаю что-то ужасно неправильное, так как нет большого количества дискуссий о том, как получить отправителя из слота, используя QtRuby. Как это обычно делается? Я читал о QSignalMapper, но это выглядит ужасно излишним для моего варианта использования.

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
Другие вопросы по тегам