Получение ссылки на излучающий виджет с помощью 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, но это кажется ужасно излишним для моего варианта использования.


person Juan Pablo Santos    schedule 24.11.2013    source источник


Ответы (1)


Вы можете сделать это с помощью QObject::sender() функция. Как вы сказали внутри слота handler, приведите тип sender() к типу, который вы ожидаете, QPushButton в вашем случае, и вы получите ссылку на объект-отправитель.

В С++ это можно сделать так:

// 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
person Shf    schedule 27.11.2013
comment
Конечно. Это обычный подход. Однако QObject::sender() является методом экземпляра и не может быть вызван из моего слота. Я могу сделать обработчик частью объекта HandlerContainer и наследовать от QObject. Тогда проблема заключается в подключении сигнала. QtRuby ожидает символ, но какой символ следует использовать для ссылки на метод экземпляра из объекта? - person Juan Pablo Santos; 27.11.2013
comment
@JuanPablo connect(dashboard.ui.start_button_r1, SIGNAL(clicked()), reference_to_instance_of_Handler_Container, SLOT(handler()); хотя я не знаю точного синтаксиса синтаксиса SIGNAL(clicked()) и SLOT(handler()) в QtRuby - person Shf; 28.11.2013
comment
@JuanPablo Qt::Object.connect(@dashboard.ui.start_button_r1, SIGNAL("clicked()"), @reference_to_instance_of_Handler_Container, SLOT("handler()") ) также вам может пригодиться эта ссылка - ruby-forum.com/topic/192770< /а> - person Shf; 28.11.2013
comment
Я собираюсь попробовать это и сообщить. Я просто надеялся, что мне не нужно использовать строковую форму. - person Juan Pablo Santos; 29.11.2013
comment
@JuanPablo я не совсем специалист в QtRuby, это первое, что я нашел, по поводу подключения в QtRuby, если есть другой удобный способ - используйте его, но подключение должно быть в таком виде - connect (object_emmiting_signal, signal_itself, object_receiving_signal,receiving_slot_in_object). Также можно сделать это так: object_emitting_signal.connect(signal, object_receiving_signal,slot_in_object_receiving_signal) - person Shf; 29.11.2013
comment
Хорошо, это работает. Только то, что класс SlotContainer должен вызывать функцию слотов, чтобы сделать обработчик слотом. Я отредактирую ваш пост со своим кодом и награжу вас репутацией :) Спасибо! - person Juan Pablo Santos; 02.12.2013
comment
@JuanPablo рад, что это помогло вам, не знаю почему (имеет смысл добавить информацию о том, как это делается в QtRuby в вопросе, связанном с QtRuby), ваше редактирование было отклонено не мной, и после этого я не смог его одобрить, поэтому я сам отредактировал как ты хотел - person Shf; 02.12.2013
comment
Возможно слишком усердный мод. Еще раз спасибо. - person Juan Pablo Santos; 03.12.2013