Skip to topic | Skip to bottom
Linux.LibQtPerlr1.1 - 16 Aug 2006 - 19:45 - TWikiGuest? [Zum Ende]

Start of topic | Direkt zum Menü

QT-Programme in Perl schreiben

Diese Seite bietet eine Anleitung zum schreiben von grafischen QT-basierten Programmen mit Perl unter zuhilfenahme des ScriptsFb -Skriptes qthelper . Dabei kommt QT3 zum Einsatz - für QT4 gibt's leider keine Perl-Unterstützung.

Worum geht's?

perl-Programme sind schnell geschrieben, jedoch nur dann, wenn sie textorientiert sind. Diverse Erweiterungen (z.B. TK ) ermöglichen es, grafische Dialoge zu programmieren, sind dabei aber für den Programmierer wenig intuitiv (-> kein WYSIWYG-Dialog-Editor).

Mit Hilfe von libqt-perl kann die QT-Bibiliothek in Perl nutzen, um Dialoge zu programmieren. Solche Anwendungen sehen dann wie KDE-Anwendungen aus. libqt-perl ermöglicht es ausserdem, den QT-Designer einzusetzen, um grafische Dialoge zu "zeichnen" .

Vorraussetzungen

In diesem Artikel wird davon ausgegangen, dass Debian GNU/Linux Sarge oder höher zum Einsatz kommt.

Folgende Pakete werden benötigt:

  • libqt-perl - die Perl-Bindings für QT3
  • designer-qt3 - der QT-Designer
  • scripts-fb - enthält den qthelper

Wozu braucht man qthelper ?

Der Arbeitsablauf in libqt-perl ist wie folgt:

  • Man zeichne einen Dialog (oder auch mehrere)
  • Per puic wird das entstandene .ui -File in ein Perl-Modul umgerechnet, dass dann vom Hauptprogramm eingebunden werden muss.
  • Im Perl-Modul müssen die nötigen Slots (= Callback-Funktion für Events wie Button gedrückt ) geschrieben werden.

Das hat einige Nachteile:

  • Es fallen mehrere Dateienen an (ein Perl-Skript ist viel sexier, wenn es nicht unnötig viele zusätzliche Dateien mitbringt)
  • Wenn man jetzt noch etwas am Dialog verändern will, muss man das im Perl-Modul machen - schlisslich hat man ja schon Funktionen im Perl-Modul geschrieben und kann deshalb puic nicht ein weiteres Mal aufrufen.

qthelper räumt mit diesen Nachteilen auf.

Der qthelper -Workflow

Ein QT-Programm entwickelt man wie folgt:

  • Man lege ein Verzeichnis für die Entwicklung an - für jede die Entwicklung einer Anwendung fallen mehrere Dateien an, allerdings reicht es später, ein einzelnes ausführbares Skript weiterzugeben.
  • Man erstelle das Basis-Skript (dieses heisst immer app.pl - unabhängig vom späteren Namen des Skriptes):
    user@host > qthelper -i
  • Man bearbeite die entstandene Konfigurations libqt.conf . Eine Zeile enthält immer eine Zuordnung "Name einer .ui -Datei" zu "Perlpackage" .
  • Man erzeuge Formulare mit dem QT-Designer (Debian-Paket qt3-designer ):
    user@host > designer-qt3
    Hinweise:
    • Die Formulare werden als XML-Files (Endung .ui ) abgespeichert.
    • Formulare können später noch bearbeitet werden.
  • Nach jeder Änderung an Formularen wirft man den Übersetzungsprozess an:
    user@host > qthelper -f
  • Das QT-Programm läßt sich testen, wenn man app.pl einfach ausführt:
    user@host > ./app.pl
  • Mit folgendem Kommando packt man alle Formular-Pakete sowie app.pl zusammen und erstellt ein einziges Skript daraus:
    user@host > qthelper -a [Name]
    Hinweise:
    • [Name] ist der Name des resultierenden Skriptes - z.B. qls für einen komfortablen ls -Ersatz.

Hinweise zur Benutzung des QT-Designers

Wenn man Widgets in Formularen anlegt, sollte man immer sinnvolle Namen vergeben. Der QT-Designer vergibt per default Namen wie button1 oder listwidget2 - das ist wenig aussagekräftig.

Wenn man alle Widgets angelegt hat, muss man eigene Slots definieren. Slots sind Event-Handler, die von bestimmten Aktionen des Benutzers abhängen. Hier ein Beispiel anhand eines Download-Dialoges:

  • download - Ein Slot der ausgelöst werden soll, wenn eine URL herunterzuladen ist. Das soll der Fall sein, wenn man eine URL in ein Eingabefeld eingegeben hat und man entweder auf Download drückt oder man im Eingabefeld Return betätigt.

Um Slots zu definieren, geht man im Menü Edit auf Slots und legt z.B. die Funktion download() an. Das () bedeutet, dass der Slot keine Parameter empfängt. Es gibt auch Signale, die Parameter übergeben - z.B. QListBox::selectionChanged(QListBoxItem? *) . Will man solche Signale benutzen, muss man auch einen passenden Slot einrichten (sprich: mit den selben Parametern). Das sollte aber nur sehr selten nötig sein.

Damit die selbstdefinierten Slots überhaupt benutzt werden, müssen sie mit sntsprechenden Widget-Signalen verbunden werden. Dafür gibt es den Connection Mode (im Menü Tools / Connect Signal/Slots ). In diesem Modus zieht man ein Widget (z.B. einen Button) auf das Formular - ein Dialog erscheint, in dem man die Verbindung konfiguriert. Man Wählt das gewünschte Signal (beim Button ist das z.B. clicked() und den selbstdefinierten Slot - fertig. Das kann man mit beliebig vielen Slots machen.

Benutzung der Slots

Wenn die Datei app.pl vom qthelper geschrieben wurde, enthält sie eine Methode _init_ . Diese ist dafür gedacht, die Anwendung zu initialisieren - also auch, die QT-Slots mit Programmlogik zu verbinden.

QT-Slots sind Event-Handler, die mit Ereignissen - z.B. dem Drücken eines Buttons - verbunden werden. Jetzt muss man nur noch Callbacks in das Basis-Skript einrichten:

$[Formularpaket]::callbacks{'[Slotcallback]'}=\&[Slotfunktion]

In eckigen Klammern stehen Platzhalter - hier ist deren Bedeutung erklärt:

Platzhalter Beschreibung Beispiel
Formularpaket Der Name des Perl-Modules (ohne .pm ), der das Formular enthält, aus dem das Ereignis stammen soll. main
Slotcallback Der Name des Slots - ohne Parameter buttonclicked
Slotfunktion Der Name einer Perl-Funktion in app.pl , die mit dem Slot verbunden werden soll mein_funktion

Tips zum Umgang mit Widgets

Wichtigster Tip: Alle QT-Klassen sind unter http://doc.trolltech.com/3.3/classes.html ausführlich dokumentiert.
[Zurück zum Start]


Aktuelle Wiki-Seite: Linux > LibQtPerl

[Zurück zum Start]