Using the Qt binding: creating a custom dialog

Macro file: qtdialog.lym

This example employs the Qt binding of KLayout. It will bring up a custom dialog with a screenshot button and a display area. When you press the screenshot button, it will take a snapshot of the current view and show it in the display area until you take a new one. To run it choose "Run current script" (Shift+F5) in the macro IDE. The new dialog will appear and stay open when the IDE is closed.

Source code

require 'tempfile'

module Examples
  
  # This class implements a dialog with a screenshot display area and a
  # screenshot button
  class ScreenshotDialog < RBA::QDialog
  
    def initialize(parent = nil)
  
      super(parent)
  
      setWindowTitle("Screenshot Saver")
  
      resize(400, 120)
  
      layout = RBA::QVBoxLayout.new
      setLayout(layout)
  
      @image = RBA::QLabel.new("Press the button to fetch a screenshot", self)
      layout.addWidget(@image)
  
      button = RBA::QPushButton.new('Screenshot', self)
      button.setFont(RBA::QFont.new('Times', 18, RBA::QFont::Bold))
      layout.addWidget(button)
  
      button.clicked do 
        self.button_clicked
      end
  
    end
  
    def button_clicked
      view = RBA::Application.instance.main_window.current_view
      if view
        tmp = Tempfile.new("klayout-screenshot")
        view.save_image(tmp.path, 400, 400)
        @image.setPixmap(RBA::QPixmap.new(tmp.path))
      end
    end
  
  end
  
  # Locate the main window's qtruby object:
  qt_main_window = RBA::QApplication.topLevelWidgets.select { |w| w.class.to_s == "RBA::MainWindow" } [0]
  
  # Delete any existing instance
  @screenshot_dialog && @screenshot_dialog._destroy
  
  # Instantiate the dialog and make it visible initially.
  # Passing the $main_window will make it stay on top of the main window.
  @screenshot_dialog = ScreenshotDialog.new(qt_main_window)
  @screenshot_dialog.show

end