QtRuby соединяет сигналы и слоты с параметрами/аргументами

Я хотел бы знать, как я могу подключиться к сигналу, который принимает параметры (используя блоки Ruby).

Я знаю, как подключиться к тому, который не принимает параметры:

myCheckbox.connect(SIGNAL :clicked) { doStuff }

Однако это не работает:

myCheckbox.connect(SIGNAL :toggle) { doStuff }

Это не работает, потому что слот переключателя принимает параметр void QAbstractButton::toggled ( bool checked ). Как я могу заставить его работать с параметрами?

Спасибо.


person Jean-Luc    schedule 04.12.2012    source источник
comment
никогда раньше не пробовал QtRuby, но, возможно, попробуйте это, посмотрите, работает ли это: myCheckbox.connect(SIGNAL :toggle) { |checked| делать вещи }   -  person Kokizzu    schedule 04.12.2012
comment
да думал об этом, не работает :(   -  person Jean-Luc    schedule 04.12.2012
comment
попробуйте реализовать это: pcapriotti.wordpress. com/2010/09/24/efficient-qt-in-ruby-part-2   -  person Kokizzu    schedule 04.12.2012
comment
Я думаю, это становится немного нелепо... Я просто решил сделать checkbox.connect( :SIGNAL "toggle(bool)" ) { |x| puts x }   -  person Jean-Luc    schedule 04.12.2012


Ответы (1)


Краткий ответ на ваш вопрос заключается в том, что вы должны объявить свою подпись метода для слота для подключения, используя метод slots:

class MainGUI < Qt::MainWindow
  # Declare all the custom slots that we will connect to
  # Can also use Symbol for slots with no params, e.g. :open and :save
  slots 'open()', 'save()',
        'tree_selected(const QModelIndex &,const QModelIndex &)'

  def initialize(parent=nil)
    super
    @ui = Ui_MainWin.new # Created by rbuic4 compiling a Qt Designer .ui file
    @ui.setupUi(self)    # Create the interface elements from Qt Designer
    connect_menus!
    populate_tree!
  end

  def connect_menus!
    # Fully explicit connection
    connect @ui.actionOpen, SIGNAL('triggered()'), self, SLOT('open()')

    # You can omit the third parameter if it is self
    connect @ui.actionSave, SIGNAL('triggered()'), SLOT('save()')

    # close() is provided by Qt::MainWindow, so we did not need to declare it
    connect @ui.actionQuit,   SIGNAL('triggered()'), SLOT('close()')       
  end

  # Add items to my QTreeView, notify me when the selection changes
  def populate_tree!
    tree = @ui.mytree
    tree.model = MyModel.new(self) # Inherits from Qt::AbstractItemModel
    connect(
      tree.selectionModel,
      SIGNAL('currentChanged(const QModelIndex &, const QModelIndex &)'),
      SLOT('tree_selected(const QModelIndex &,const QModelIndex &)')
    )
  end

  def tree_selected( current_index, previous_index )
    # …handle the selection change…
  end

  def open
    # …handle file open…
  end

  def save
    # …handle file save…
  end
end

Обратите внимание, что подписи, переданные SIGNAL и SLOT, не содержат имен переменных.

Кроме того, как вы пришли к выводу в своем комментарии, проще (и более похоже на Ruby) полностью отказаться от концепции «слота» и просто использовать блок Ruby для подключения сигнала для вызова любого метода, который вам нравится (или поставить логику в линию). Используя следующий синтаксис, вам не нужно использовать метод slots для предварительного объявления вашего метода или кода обработки.

changed = SIGNAL('currentChanged(const QModelIndex &, const QModelIndex &)')

# Call my method directly
@ui.mytree.selectionMode.connect( changed, &method(:tree_selected) )

# Alternatively, just put the logic in the same spot as the connection
@ui.mytree.selectionMode.connect( changed ) do |current_index, previous_index|
  # …handle the change here…
end
person Phrogz    schedule 19.10.2014