PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Systray in KDE



axeljaeger
17-01-2003, 17:11
Ich versuche seit gestern meiner KDE-Applikation ein Systray-Icon zu verpassen. Gibt es dazu ein ganz billiges Beispielprogramm? Ich hab hier nur die API-Reference auf der Platte (http://developer.kde.org/documentation/library/2.2-api/classref/kdeui/KSystemTray.html), die hilft aber nicht, da ich, wenn ich einfach ein neues KSystray erzeuge einen niedlichen Segfault kriege. Ich verwende wirklich noch KDE 2.2, aber daran sollte es eigentlich nicht liegen, andere Applikationen kreigen das ja auch gebacken.

anda_skoa
17-01-2003, 17:33
Hmm, wie sieht der Code davon aus?

Sollte nämlich wirklich ganz einfach sein.

Ciao,
_

axeljaeger
17-01-2003, 19:47
So:


#include <kapplication.h>
#include <ksystemtray.h>
#include <qwidget.h>

class Outpost : public QWidget
{
Q_OBJECT
public:
Outpost(QWidget* parent = 0, const char * name = 0);
~Outpost();
protected:
KSystemTray* trayicon;
};

Outpost::Outpost(QWidget* parent, const char * name) : QWidget(parent, name)
{
trayicon = new KSystemTray(this, "kashmere outpost");
}
Outpost::~Outpost()
{

}

#include "output.moc.cpp"

int main(int argc, char **argv)
{
KApplication app(argc, argv);
Outpost outpost;
app.setMainWidget(&outpost);
outpost.show();
return app.exec();
}

anda_skoa
17-01-2003, 20:20
Bei mir gabs einen Fehler beim Starten, weil KCmdLineArgs nicht benutzt wurde.

Ich hab ein paar Ergänzungen gemacht, die ich aus einem anderen Programm kopiert habe.
So gehts bei mir unter KDE3.0



#include <kcmdlineargs.h>
#include <kapplication.h>
#include <ksystemtray.h>
#include <qwidget.h>

class Outpost : public QWidget
{
Q_OBJECT
public:
Outpost(QWidget* parent = 0, const char * name = 0);
~Outpost();
protected:
KSystemTray* trayicon;
};

Outpost::Outpost(QWidget* parent, const char * name) : QWidget(parent, name)
{
trayicon = new KSystemTray(this, "kashmere outpost");
trayicon->show();
}
Outpost::~Outpost()
{

}

#include "outpost.moc.cpp"

int main(int argc, char **argv)
{
KCmdLineArgs::init( argc, argv, "outpost", "test app", "0.1" );
KApplication app(argc, argv);
Outpost outpost;
app.setMainWidget(&outpost);
outpost.show();
return app.exec();
}


Ciao,
_

axeljaeger
18-01-2003, 11:44
Ja, den Fehler mit den Commandline-Argumenten hatte ich auch. Jetzt krieg ich wieder nen normalen Segfault. Das mag aber daran liegen, das ich mit Qt 3 arbeite und gegen KDE 2.2.2 Bibliotheken linke

anda_skoa
18-01-2003, 12:05
Wäre möglich.

Du mußt beim Starten in der Shell LD_LIBRARY_PATH so gesetzt haben, dass das lib Verzeichnis von KDE2 und Qt2 enthalten sind.

Du kannst auch den Segfault untersuchen.

In der Shell, von wo aus du startest
#> ulimit -c unlimited

Das erlaubt der Shell, einen core beliebiger Größe anzulegen.

Dann starten
#> ./outpost
Segfault

#> gdb outpost corefile
Das Corefile heiß meist "core"

Dann am gdb Prompt
gdb> bt

Das zeigt die den Aufrufstack zum Zeitpunkt des Crash, also in welcher Funktion und woher die aufgerufen wurde.

Ciao,
_