Acquérir une référence au widget émetteur avec QtRuby

Je suis en train de connecter le signal à une fonction comme celle-ci:

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

where start_button_r1 is a QPushButton

Maintenant, ce que je veux, c'est une référence au widget d'envoi dans handler , puisque je vais connecter ce signal à plusieurs widgets. Idéalement, j'aimerais que mon gestionnaire reçoive un argument émetteur avec lequel je peux jouer. Je pourrais mettre handler dans une classe héritant de Qt :: Object (dire HandlerContainer ) et appeler sender() , mais alors comment connecter le signal à la méthode interne de HandlerContainer ? J'ai essayé instance.method (: handler) , mais connect ne reçoit pas les slots de cette façon

J'utilise habituellement cette approche dans PyQt, mais je n'arrive pas à comprendre comment le faire avec Ruby. J'ai l'impression de faire quelque chose de terriblement mal, car il n'y a pas beaucoup de discussions sur la façon d'obtenir l'expéditeur à partir d'un emplacement en utilisant QtRuby. Comment cela se fait-il habituellement? J'ai lu sur QSignalMapper, mais cela semble terriblement exagéré pour mon cas d'utilisation.

0

1 Réponses

// inside handler method
QPushButton *tmpBtn= dynamic_cast(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
0
ajouté
Sûr. C'est l'approche habituelle. Cependant, QObject :: sender() est une méthode d'instance et ne peut pas être appelée à partir de mon emplacement. Je peux faire partie du gestionnaire d'un objet HandlerContainer et hériter de QObject. Le problème est alors de connecter le signal. QtRuby attend un symbole, mais quel symbole dois-je utiliser pour référencer une méthode d'instance à partir d'un objet?
ajouté l'auteur Juan Pablo Santos, source
Je vais essayer cela et faire un rapport. J'espérais juste ne pas avoir besoin d'utiliser la forme de cordes.
ajouté l'auteur Juan Pablo Santos, source
Ok, ça fonctionne. Seulement que la classe SlotContainer doit appeler la fonction slots pour faire du handler un slot. Je vais modifier votre message avec mon code et vous attribuer le représentant :) Merci!
ajouté l'auteur Juan Pablo Santos, source
Peut-être un mod trop zélé. Encore merci.
ajouté l'auteur Juan Pablo Santos, source
@JuanPablo connect (dashboard.ui.start_button_r1, SIGNAL (clicked ()), reference_to_instance_of_Handler_Container, SLOT (gestionnaire ()); bien que je ne connaisse pas la syntaxe exacte de SIGNAL (cliqué ()) et SLOT (handler ()) syntaxe dans QtRuby
ajouté l'auteur Shf, source
@JuanPablo Qt :: Object.connect (@ dashboard.ui.start_button_r1, SIGNAL ("clicked ()"), @reference_to_instance_of_Handler_Container, SLOT ("handler ()")) aussi, vous pouvez trouver ceci lien utile - ruby-forum.com/topic/192770
ajouté l'auteur Shf, source
@JuanPablo je ne suis pas vraiment expert en QtRuby, c'est la première chose que je trouve, à propos de connect dans QtRuby, s'il y a un autre moyen pratique - utilisez-le, mais connectez-vous sous cette forme - connect (object_emmiting_signal, signal_itself, object_receiving_signal , receive_slot_in_object) . Il est également possible de le faire de la façon suivante: object_emitting_signal.connect (signal, object_receiving_signal, slot_in_object_receiving_signal)
ajouté l'auteur Shf, source
@JuanPablo heureux, il vous a aidé, ne sais pas pourquoi (il est logique d'ajouter des informations sur la façon dont cela est fait dans QtRuby en question associée à QtRuby), votre édition n'a pas été rejetée par moi et je ne pouvais pas l'approuver après édité moi-même comme vous le vouliez
ajouté l'auteur Shf, source