2013-11-24 9 views
2

Я в настоящее время подключения сигнала к функции, как это:Эквайринг ссылки на излучающий виджет с 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()); 

Edit:

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 
+0

Конечно. Это обычный подход. Однако QObject :: sender() является методом экземпляра и не может быть вызван из моего слота. Я могу сделать обработчик частью объекта HandlerContainer и наследовать от QObject. Проблема заключается в подключении сигнала. QtRuby ожидает символ, но какой символ я должен использовать для ссылки на метод экземпляра из объекта? –

+0

@JuanPablo 'connect (dashboard.ui.start_button_r1, SIGNAL (clicked()), reference_to_instance_of_Handler_Container, SLOT (обработчик());' хотя я не знаю точного синтаксиса SIGNAL (clicked()) и SLOT (handler()) синтаксис в QtRuby – Shf

+0

@JuanPablo 'Qt :: Object.connect (@ dashboard.ui.start_button_r1, SIGNAL (« clicked() »), @reference_to_instance_of_Handler_Container, SLOT (« обработчик() »))' также, вы можете найти эта ссылка полезна - https://www.ruby-forum.com/topic/192770 – Shf

 Смежные вопросы

  • Нет связанных вопросов^_^