Home / LinuxUser / 2008 / 10 / Fortgeschrittenes Basteln

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

Eingedost
(161 Punkte bei 4 Stimmen)
Aufteiler
(161 Punkte bei 4 Stimmen)

Heftarchiv

LinuxUser Heftarchiv

EasyLinux Heftarchiv

Ubuntu User Heftarchiv

Ubuntu User Heftarchiv

Partner-Links:

Das B2B Portal www.Linx.de informiert über Produkte und Dienstleistungen.

Fortgeschrittenes Basteln

Plasmoiden für KDE 4 programmieren

Einbinden von dynamischen Daten

Plasma trennt Darstellungen und Daten/Inhalte streng voneinander. Die Applets übernehmen die Darstellung, ihre Daten beziehen sie aus einer der bestehenden DataEngines [1].

Mehrere Plasmoiden können sich eine DataEngine teilen, die Plasma bei Bedarf lädt. Benötigt kein Plasmoid mehr den Datenmotor, entlädt Plasma ihn wieder, so dass er keine Ressourcen konsumiert. Dies alles regelt Plasma selbständig, als Entwickler müssen Sie sich nicht darum kümmern.

Ein Motor ist die Hotplug-DataEngine. Sie gibt ein Signal, wenn Sie ein neues Gerät mit dem Computer verbinden. Für "Dr. Ade" soll sie einen eingesteckten USB-Stick erkennen. Dazu verbinden Sie das Signal sourceAdded(const QString&) der DataEngine mit dem Slot onSourceAdded(const QString&) (Listing 4, Zeile 2). In Zeile 3 gibt hotplug ein Signal, sobald Sie das Gerät wieder entfernen.

// drade.cpp, Zeilen 83 und 84
connect(dataEngine("hotplug"), SIGNAL(sourceAdded(const QString&)), this, SLOT(onSourceAdded(const QString&)));
connect(dataEngine("hotplug"), SIGNAL(sourceRemoved(const QString&)), this, SLOT(onSourceRemoved(const QString&)));

Als Ergebnis liefern die Signal/Slot-Konstruktionen eine QString-Variable in den Methoden onSourceAdded() sowie onSourceRemoved() zurück. Die erste Methode benutzen Sie, um mit Hilfe von Solid – der Hardwarebibliothek von KDE 4 – herauszufinden, um was für ein Gerät es sich handelt (Listing 5). Im Beispiel soll der Produktname genügen (Solid::Device(name);, Zeile 6). Die Daten, die Solid liefert, zeichnet die Methode paintInferface() dann in das Plasmoid (Zeilen 222 bis 243 in drade.cpp).

// drade.cpp, Zeilen 124 bis 131
void DrAde::onSourceAdded(const QString &name)
{
    m_isPlugged = true;
    showScreen(true);
    Solid::Device m_device = Solid::Device(name);
    kDebug() << "Solid: vendor, product, icon" << m_device.vendor() << m_device.product() << m_device.icon();
    m_volumeName = m_device.product();
}

Die Funktion showScreen() startet die Animation der SVG-Grafik – dazu später mehr. Sie benutzen zunächst den Parameter &name, um über Solid ein neues Gerät anzumelden (Solid::Device), das Sie dann der Member-Variable m_device übergeben, auf die auch die paintInterface()- Funktion zugreifen kann.

Konfiguration und Einstellungen

Sie können Applets auch mit Konfigurationsdialogen ausstatten. Die Dialoge erstellen Sie recht einfach mit dem Qt-Designer. Das Beispiel zeigt, wie Sie eine Checkbox, eine Spinbox und ein Slider-Element einsetzen. Die Userinterface-Datei (.ui) koppelt dabei Slider und Spinbox aneinander, indem sie die Signale valueChanged() und die Slots setValue() der jeweiligen Elemente verbindet.

Abbildung 4

Abbildung 4: Im Qt-Designer entwerfen Sie die grafische Oberfläche für das Konfigurationsmenü des Plasmoids.

Den Konfigurationsdialog binden Sie in drei Schritten ein (Listing 6): Die Methode init() liest die gespeicherten Einstellungen aus einem KConfigGroup-Objekt, das Plasma über eine Funktion in der Applet-Klasse zur Verfügung stellt (config()). Dann liest das Programm über cg.readEntry die Werte der Schlüssel animate und animDuration aus. Der zweite Parameter in der Klammer (Zeilen 3 und 4) diktiert jeweils die Voreinstellung.

// drade.cpp, Zeilen 70 bis 72
KConfigGroup cg = config();
m_animDuration = cg.readEntry("animDuration", 200);
m_animate = cg.readEntry("animate", true);

Über die Member-Variablen m_animate und m_animDuration bestimmen Sie, ob Sie das Applet animieren wollen und wie lange die Animation dauert.

In der Methode createConfigurationInterface() (Listing 7) erstellen Sie den Konfigurationsdialog. Plasma führt die Methode aus, sobald der Benutzer den Konfigurationsdialog öffnet. Sie lädt das Interface der UI-Datei und ergänzt Knöpfe wie OK, Anwenden und Abbrechen automatisch.

In den Zeilen 7 und 8 übergeben Sie der Methode die Werte, die Sie vorher aus dem KConfig-Objekt ausgelesen haben. Schließen Sie den Konfigurationsdialog, muss das Applet davon erfahren. Dazu verbinden Sie die Signale applyClicked() und okClicked() mit dem Slot configAccepted() – einer Methode des Applets (Zeilen 10 und 11). Abschließend ergänzen Sie das Widget in Zeile 12 um den Konfigurationsdialog, wobei ein Pointer zum Einsatz kommt.

// drade.cpp, Zeilen 141 bis 159
void DrAde::createConfigurationInterface(KConfigDialog *parent)
{
    QWidget *widget = new QWidget;
    ui.setupUi(widget);
    parent->setButtons( KDialog::Ok | KDialog::Cancel | KDialog::Apply );
    ui.speedSlider->setValue(m_animDuration);
    ui.speedSpin->setValue(m_animDuration);
[…]
    connect( m_dialog, SIGNAL(applyClicked()), this, SLOT(configAccepted()) );
    connect( m_dialog, SIGNAL(okClicked()), this, SLOT(configAccepted()) );
    parent->addPage(widget, parent->windowTitle(), "drade");
}

Die Methode configureAccepted() (Listing 8) gibt ein Signal, sobald der Anwender im Konfigurationsbereich die Buttons OK oder Anwenden drückt. Die Methode gleicht die Daten des Applets mit jenen des Benutzers ab und schreibt sie meist auch direkt in die Konfiguration. Zum Speichern dient hier KConfig, KDEs Konfigurationssystem, das auch dafür sorgt, dass Sie die Daten einfach wieder auslesen können. Da KConfig viele Qt-Typen unterstützt, brauchen Sie sich kaum Gedanken über das Format zu machen, oder wie Sie verschiedene Datentypen speichern und einlesen. Es genügt, abstrakte Daten – wie zum Beispiel eine QColor-Farbe – in einen Konfigurationseintrag zu schreiben und sie später wieder auszulesen.

In der Methode von Listing 8 lesen Sie die Werte aus dem UI-Objekt. Dann schreiben Sie sie in die Konfigurationsdatei sowie in die Member-Variable, um bei Bedarf einfach auf die Daten zuzugreifen. Da sich möglicherweise interne Daten geändert haben, erneuern Sie die Verbindung mit der DataEngine (update()).

// drade.cpp, Zeilen 161 bis 172
void DrAde::configAccepted()
{
    m_animDuration = ui.speedSlider->value();
    m_animate = ui.Animate->isChecked();
    config().writeEntry("animate", m_animate);
    config().writeEntry("animDuration", m_animDuration);
    update();
    emit configNeedsSaving();
}

Indem Sie update() aufrufen, malt Plasma das Applet neu. Zugleich geben Sie auf diese Weise an, dass sich die Konfiguration geändert hat. Plasma kümmert sich in der Folge darum, dass die Konfigurationsdaten "in Kürze" auf der Festplatte landen. Es speichert die Daten nicht direkt: Bringen bestimmte Einstellungen den KDE-4-Desktop zum Absturz, soll er bei einem Neustart nicht gleich wieder den Geist aufgeben. Zugleich bündeln Sie durch die Verzögerung die Schreibzugriffe auf die Festplatte, was Energie spart.

Tip a friend    Druckansicht Bookmark and Share
Kommentare

Hits
Wertung: 110 Punkte (8 Stimmen)

Schlecht Gut

Infos zur Publikation

Infos zur Publikation

LinuxUser 05/2014

Aktuelle Ausgabe kaufen:

Heft als PDF kaufen

LinuxUser erscheint monatlich und kostet in der Nomedia-Ausgabe EUR 5,95 und mit DVD EUR 8,50. Weitere Informationen zum Heft finden Sie auf der LinuxUser-Homepage.

Im LinuxUser-Probeabo erhalten Sie drei Ausgaben für 3 Euro. Das Jahresabo (ab EUR 60,60) können Sie im Medialinx-Shop bestellen.

Tipp der Woche

Bilder vergleichen mit diffimg
Bilder vergleichen mit diffimg
Tim Schürmann, 01.04.2014 12:40, 1 Kommentare

Das kleine Werkzeug diffimg kann zwei (scheinbar) identische Bilder miteinander vergleichen und die Unterschiede optisch hervorheben. Damit lassen sich nicht nur Rätsel a la „Orignial und Fäls...

Aktuelle Fragen

programm suche
Hans-Joachim Köpke, 13.04.2014 10:43, 8 Antworten
suche noch programme die zu windows gibt, die auch unter linux laufen bzw sich ähneln sozusagen a...
Funknetz (Web-Stick)
Hans-Joachim Köpke, 04.04.2014 07:31, 2 Antworten
Bei Windows7 brauche ich den Stick nur ins USB-Fach schieben dann erkennt Windows7 Automatisch, a...
Ubuntu 13.10 überschreibt immer Windows 8 Bootmanager
Thomas Weiss, 15.03.2014 19:20, 8 Antworten
Hallo Leute, ich hoffe das ich richtig bin. Ich habe einen Dell Insipron 660 Ich möchte gerne Ub...
USB-PTP-Class Kamera wird nicht erkannt (Windows-only)
Wimpy *, 14.03.2014 13:04, 15 Antworten
ich habe meiner Frau eine Digitalkamera, AGFA Optima 103, gekauft und wir sind sehr zufrieden dam...
Treiber
Michael Kristahn, 12.03.2014 08:28, 5 Antworten
Habe mir ein Scanner gebraucht gekauft von Canon CanoScan LiDE 70 kein Treiber wie bekomme ich de...