Получение ссылки на исходящий виджет с помощью 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