request_url_withoutHTTP=,canonical_url_withHTTP=,canonical_url_withoutHTTP=,request_url_withoutHTTP_realspaces=. Qt4 (Seite 1 von 1) « Tags « Blog « Bernhard Häussner
Bernhard Häussner
Tags: Artikel mit dem Tag «Qt4» durchstöbern

Qt4 Designer und Ruby - erste Schritte

06.01.2010, 11:23

Vor Kurzem habe ich ein bisschen mit Ruby herumgespielt und festgestellt, dass es keine ordentliche und aktuelle Kurzeinführung gibt, wie man die Interfaces aus dem Qt4 Designer mit Ruby Programmen verbindet. Darum habe ich die ersten Schritte hier kurz zusammengefasst:

Als erstes installiert man die Qt4-Development-Tools und die Ruby-Qt-Komponenten mit dem Paketmanager.

Interface im Qt4 Designer erstellen

Dann kann man sich ans Buttons zusammenklicken machen. Das Beispielinterface sieht im Qt Designer so aus:

Ich habe zwei QPushButtons und ein QListWidget in Layouts gepackt. Was es an Widgets gibt und was diese können steht in der Qt4 Dokumentation. In der Ruby API heißen die Klassen stets Qt::Name stat QName. Beim Basteln wichtig ist, dass ObjectName irgendwie Sinn hat, weil damit die Widgets dann benutzt werden können.

Rubycode mit rbuic erstellen

Als nächstes muss man die vom Designer erzeugte XML-Datei mit der Endung .ui in Ruby-Code umwandeln. Dazu gitb es rbuic bzw. rbuic4:

rbuic4 Sample.ui -o Sample.ui.rb

Jetzt haben wir ein Rubyscript in dem das Interface erstellt wird.

Interface in Rubyscript einbinden

Jetzt ist es Zeit dem Interface etwas Leben einzuhauchen. Dazu verbindet man die Signale - wer Webinterfaces Programmiert kennt das als „Events“ - mit den Entsprechenden Slots, die so ähnlich wie callbacks funktionieren. Das geht recht fix mit QMetaObject::connectSlotsByName. Damit dies funktioniert müssen die Funktionen, die aufgerufen werden sollen das Namensmuster on_ObjectName_Signal einhalten, wobei der ObjectName vorher im Designer festgelegt wurde und das Signal heißt z.B. triggered.

Wie man die GUI-Komponente in der Anwendung benutzt, z.B. hier durch Subclassing, und anderes will ich direkt am Beispiel erklären:

#!/usr/bin/ruby

#Laden der Qt-Klasse:
require 'Qt'

#Manchmal auch:
#require 'Qt4'

#Laden des generierten Interfaces:
require 'Sample.ui.rb'

#Initialisieren der Anwendung
app = Qt::Application.new ARGV

#Eine Klasse, um das Verhalten des Interfaces festzulegen:
class AppCommunicate < Qt::MainWindow
  #Die Liste der Slots
  #Sie werden von setupUi automatisch verbunden
  slots :on_actionQuit_triggered, :on_add_clicked, :on_rem_clicked
  def initialize
    puts "init"
    @item_count=0
    #Da wir vererben initialisieren wir so:
    super
    #Jetzt erstellen wir das Interface
    @ui=Ui_MainWindow.new
    #Und weisen es dem MainWindow zu
    @ui.setupUi self
    #Man könnte Slots auch manuell verbinden:
    #connect a.actionQuit, SIGNAL('triggered()'), $qApp, SLOT('quit()')
  end
  #Ein Handler für das Beenden:
  def on_actionQuit_triggered
    puts "Shutting down."
    #So wird die Anwendung gestoppt:
    $qApp.quit
  end
  # "add" ist der name des Buttons, bei click wird dieses signal gesendet
  def on_add_clicked
    puts "Adding item"
    #Es gibt attr_readers für alle Widgets
    #So können wir ihre Methoden aufrufen
    @ui.listWidget.addItem("Hallo Welt ##{@item_count} at #{Time.now.ctime}")
    #Hier könnten z.B. Daten der Anwendung ausgegeben werden
    #Zu demonstrationszwecken nummerieren wir die Einträge sichtbar
    @item_count+=1
  end
  def on_rem_clicked
    puts "Removing item"
    #In cpp könten wir die items deleten
    #Aber in ruby loopen wir über die markierten indizes
    @ui.listWidget.selectedIndexes.each do |i|
      #und nehmen sie aus der Liste
      @ui.listWidget.takeItem i.row
      #da wir keine Referenz speichern löscht sie der GC
    end
  end
end

#Wir erstellen eine Instanz unseres Verhaltens
wdg=AppCommunicate.new do |w|
    #Wir müssen das Interface zeigen
    #Wird auch alle child-widgets zeigen
    w.show
end

#Hier wird die GUI-Schleife gestartet:
app.exec

#TADA!

Wer das ganze ausprobieren will, kann sich die Beispieldateien hier herunterladen:

Ich hoffe das war hilfreich, ich finde es doch hin und wieder ganz nett ein Interface zu haben, vor allem für Scripte, die länger laufen und interaktiv sein sollen.

Kommentare: keine
[ Seite 1 ]
 
Χρόνογραφ
© 2008-2017 by Bernhard Häussner - Impressum - Login
Kurz-Link zur Homepage: http://1.co.de/