PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Kde&Qt] Kickerapplet



tuxipuxi
23-03-2003, 17:17
Hallo Leute,


das ist wirklich zum verzweifeln :

ich mochte jetzt gerne ein kickerapplet programmieren und waehlte mir dafuer ein beispiel aus, hier der code:

helloworldapplet.h:



#ifndef HELLOWORLD_H
#define HELLOWORLD_H
#include <kpanelapplet.h>

class HelloWorldApplet : public KPanelApplet
{


public:

HelloWorldApplet( const QString& configFile, Type t = Stretch,
int actions = 0, QWidget *parent = 0,
const char *name = 0 );

int widthForHeight( int height ) const;

int heightForWidth( int width ) const;

};
#endif //HELLOWORLD_H


helloworldapplet.cpp:




#include <kpanelapplet.h>
#include <klocale.h>
#include <kglobal.h>
#include "helloworldapplet.h"


HelloWorldApplet::HelloWorldApplet( const QString& configFile,
Type type, int actions,
QWidget *parent, const char *name )

: KPanelApplet( configFile, type, actions, parent, name )

{
setBackgroundColor( blue );

setFrameStyle( StyledPanel | Sunken );
}

int HelloWorldApplet::widthForHeight( int h ) const
{
return h; // we want to be quadratic
}

int HelloWorldApplet::heightForWidth( int w ) const
{
return w; // we want to be quadratic
}






extern "C"
{
KPanelApplet* init( QWidget *parent, const QString& configFile )
{
KGlobal::locale()->insertCatalogue( "libhelloworldapplet");

return new HelloWorldApplet( configFile, KPanelApplet::Normal,
0, parent, "libhelloworldapplet");
}
}



und letztendlich die helloworldapplet.desktop:




[Desktop Entry]
Name = Hello World
Comment = Hello World Applet
X-KDE-Library = libhelloworldapplet
X-KDE-UniqueApplet = true




ihr koennt mir glauben, ich HABE es versucht, 2 stunden lang, aber ich bekomme das nicht zum laufen. ich wuerde mal behaupten, am code stimmt alles, nur mit den hinweisen von developer.kde.org und mit qmake bekomme ich kein makefile hin was funktioniert. deswegen poste ich mal keine fehlermeldungen und aehnliches sondern frage euch einfach:

wie kriege ich den oben genannten code zu einem richtigen applet?



als executable darf man das ja scheinbar auch net linken oder?


ueber hilfe waere ich SEHR erfreut ;)


gruss tuxipuxi

anda_skoa
23-03-2003, 21:09
Hmm, bei solchen Plugins sind die Makefiles nicht mehr ganz trivial, da braucht man Haufenweise Compiler- und Linkerflags.

Ich schätze am einfachsten ist es da, sich von KDevelop ein Kickerapplet generieren zu lassen.

Ciao,
_

tuxipuxi
28-03-2003, 17:17
hi anda_skoa,

habe ich jetzt getan. habe in kdevelop (2.15) new project -> kde kicker applet gemacht.
das erste was mich verwirrte, war, dass da stand "[...] for kde2 " .

naja also hab ich das gemacht und files generieren lassen und am code UEBERHAUPT nichts gemacht, nur kompiliert und installiert... hat auch geklappt. nur finden kann ich das applet nun nicht in der appletliste. muss man vielleicht irgendeine variable mit searchpath anpassen?

ciao tuxipuxi

anda_skoa
28-03-2003, 18:19
Kommt drauf an, mit welchem Prefix du configure aufgerufen hast.
Wenn ohne, dass hat er glaub ich nach /usr/local/kde installiert.

Finde das Verzeichnis herraus und mach dann in einer Konsole

#> export KDEDIRS=/usr/local/kde:/normaler/kde/prefix
#> kbuildsycoca

/usr/local/kde durch den Pfad ersetzen, in dem dein Applet installiert wurde.
/normaler/kde/prefix erhälts du am einfachsten mit
#> kde-config --prefix

Ciao,
_

tuxipuxi
28-03-2003, 18:31
hi,




[tuxipuxi@localhost kdetection2]$ export KDEDIRS=/usr/local/kde:/usr:/usr/local/kde/lib


und kbuildsycoca hab ich gemacht, das applet steht noch immer nicht in der liste.
ich versteh das einfach nicht. ich hab daran ja garnichts gemacht, kdevelop sollte doch irgendwie funktionierende makefiles erstellen :-/

anda_skoa
28-03-2003, 19:11
Hmm.

Schau mal, ob das .so des Applets installiert wurde.
Wenn ja, dann steht vielleicht im .desktop des Applets ein falscher Name.
Kontrollier auch, ob es in /usr/local/kde/share/apps/kicker/applets auftaucht.

Ciao,
_

tuxipuxi
28-03-2003, 21:14
hi,

abgesehen vom projektordner existieren:



/home/tuxipuxi/.kde/share/apps/RecentDocuments/lo32-app-kdetection.png.desktop
/usr/local/kde/lib/libkdetection.so.1.0.0
/usr/local/kde/lib/libkdetection.so.1
/usr/local/kde/lib/libkdetection.so
/usr/local/kde/lib/libkdetection.la
/usr/local/kde/share/apps/kicker/applets/kdetection.desktop
/usr/local/kde/share/icons/locolor/32x32/apps/kdetection.png

anda_skoa
28-03-2003, 23:14
Hmm, sieht alles korrekt aus.
Im .desktop File steht auch libkdetection, oder?

Schon probiert ob es hilft, kicker neu zu starten?
Eventuell mit
#> dcop kicker Panel restart

Ciao,
_

tuxipuxi
29-03-2003, 10:24
hi,

im .desktop file steht das:

[Desktop Entry]
Comment=A panel applet called KDetection
Name=kdetection
X-KDE-Library=libkdetection


restart vom panel bringt auch nichts :(

anda_skoa
29-03-2003, 12:45
Ich habs jetzt herumprobier, bis es doch noch gegangen ist.

Probier mal, das export KDEDIRS=/usr/local/kde:/usr
ins dein startkde Script zu schreiben.

Wenn du nicht dein Haupt KDE neu starten willst, bietet es sich an, einen User für KDE Tests anzulegen.
Dann startest du eine Xnest Session, machst auf einem Terminal su - testuser und setzt dort die nötigen Variablen.
Also KDEDIRS, DISPLAY und startest dann startkde

also
1#> Xnest :1

2#> xhost +localhost
2#> su - testuser
2#> export KDEDIRS=...
2#> export DISPLAY=:1
2#> startkde

Ciao,
_

tuxipuxi
29-03-2003, 13:31
hi,

vielen dank schonmal. :)

wo schreib ich denn am besten das mit dem export hin? da sind ja doch rechtviele anweisungen und ich moechte das ungerne an eine gefaehrliche stelle setzen.

Xnest hab ich irgendwie nicht.

anda_skoa
29-03-2003, 13:54
Wenn du aus einer Shell startest, brauchts du KDEDIRS nicht in startkde einfügen.
Sonst am Anfang.

bei mir steht es so drinnen


#!/bin/sh
#
# DEFAULT KDE STARTUP SCRIPT ( KDE-3.1 )
#

export KDEDIRS=/usr/:/usr/local/:/usr/local/kde:$KDEDIRS



Xnest gibt es sein XFree4, ist aber wahrscheinlich in einem extra Paket.
Ganz feine Sache, startet einen XServer im Fenster einer laufenden XSession.

Das erspart das starten einer neuen XSession auf VT8

Ciao,
_

tuxipuxi
29-03-2003, 21:49
hey spitze das geht jetzt.... vielen dank :)
echt super.

tuxipuxi
30-03-2003, 14:14
hi,

ich hab jetzt mal in die generierte appletklasse meine includet und ein objekt davon erzeugt, das eigentlich nur eine KLed enthaelt. nach dem appletstart konnte ich die aber nicht sehen.
im beispiel wird fuer das erzeugte objekt die methode show() aufgerufen, hab ich auch gemacht aber es kommt beim kompilieren:




In file included from detect_applet.cpp:23:
applet_view.h:45:1: warning: no newline at end of file
/usr/lib/qt3/include/qwidget.h: In constructor `Detect_applet::Detect_applet(const QString&, KPanelApplet::Type, int, QWidget*, const char*)':
/usr/lib/qt3/include/qwidget.h:343: `virtual void QWidget::show()' is inaccessible
detect_applet.cpp:45: within this context



woran kann das liegen?

gruss tuxipuxi


edit: und schon ein update:

es funktioniert gerade was aehnliches, ich melde mich gleich zurueck

editedit:

gaannzz mysterioes. also in derapplet klasse( also von KPanelApplet abgeleitet ),
darf ich fuer mein widget mit der KLed drin kein show aufrufen( meldung siehe oben ).

wenn ich jetzt in meiner Widgetklasse show fuer den button aufrufe, oeffnet sich nach appletstart ein eigenes fenster mit dem widget dadrin.

rufe ich in der widget show fuer this auf zeigt sich wieder garnix ... wofuer muss man jetzt show aufrufen?

editeditedit:

bei dem kde tutorial "extending the KDE Panel" bin ich bei den tips auf folgendes gestossen:



Tips 'n' tricks

Never call show() in the applet's constructor. There is absolutely no reason to call show() in a widget constructor. The reason why this is important for panel applets is that QXEmbed (kdelibs/kdecore/qxembed.h), the class used to embed external applets (those run via the proxy) into kicker, often suffers from race conditions when a window is visible before it is reparented.

As panel applets provide but a very small GUI it is often easier to do the layouting by hand in the resizeEvent() instead of using QLayout.



ja nun, ohne show sehe ich doch aber nix?

anda_skoa
30-03-2003, 18:06
Normalerweise sollte es auch ohne explizites show() gehen.
Denn das PanelApplet bekommt ja das show und leitet es entsprechend an seine Kinder weiter.

Ist das Applet auch sicher das Parent Widget deines Views?

Ciao,
_