• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

KHelpMenu

Hallo,

ich versuche mich gerade durch diverse Tutorien zu arbeiten um das KDE Framework zu erlernen. Leider habe ich kein Tutorium gefunden welches fuer KDE 3.4 ist. Jetzt weiss ich nie wenn was nicht funktioniert ob ich es bloss mit meinen limitierten KDE (und C++) Kenntnissen nicht erkennen kann, oder ob sich was total geaendert hat. Zum Problem:

Ich habe eine HelloWorld Applikation erstellt und kann dort Menus einfuegen via:

QPopupMenu *file = new QPopupMenu();
file->insertItem(i18n("Open"),this,SLOT(MySlotMachWas()));
KMenuBar *menu = new KMenuBar(this);
menu->insertItem("&File",file);

Funzt prima.

Neben-Frage:
Bei dem Estellen der Pointer *file und *menu wird einmal das Objekt mit new ...() und einmal mit new ...(this) erstellt, woher weiss ich wann ich was nutzen muss? (ja ich bin Newbie...)

So nun zum eigentlichen Help Problem. Diverse Tutorials geben diverse Loesungen (bei denen mein Compiler diverse Fehler schmeisst).

Eine Moeglichkeit ist angeblich

about = i18n("bla");
helpmenu = helpMenu(about)
menu.insertItem(i18n("&Help"), helpmenu)

Eine andere:

QString about = i18n("bla");
QPopupMenu *helpmenu = helpMenu( about );
menu->insertItem( i18n( "&Help" ), helpmenu );


Die Doku http://developer.kde.org/documentation/library/3.3-api/kdeui/html/classKHelpMenu.html
sagt folgendes:

mHelpMenu = new KHelpMenu( this, <someText> );
kmenubar->insertItem(i18n("&Help"), mHelpMenu->menu() );

Wobei ich <someText> durch "bla" ersetzt habe.

Da ich als Anfaenger noch Probleme habe die "Doku und Fehlertexte zu deuten" waere es prima wenn mir einer auf die Spruenge helfen koennte. Kann einer von euch mir sagen wie ich das machen muss mit einem Coding anlog zu meinen "normalen" Menueintraegen?
 
Jochen_r schrieb:
Neben-Frage:
Bei dem Estellen der Pointer *file und *menu wird einmal das Objekt mit new ...() und einmal mit new ...(this) erstellt, woher weiss ich wann ich was nutzen muss? (ja ich bin Newbie...)

steht in der Doku. this ist ein Zeiger auf die aktuelle Instanz, d.h. wenn die neue Klasse einen Zeiger darauf braucht -> mitgeben, wenn nicht dann nicht ;)

zu Hauptfrage kann ich wegen NichtKDE-Coder nix sagen... evtl. solltest Du hier aber eher die relevanten Kompilermeldungen mitliefern daran kann man sich orientieren.

2. Punkt nimm Dir ein kleines KDE-tool und schau in den Code....
 
TeXpert schrieb:
steht in der Doku. this ist ein Zeiger auf die aktuelle Instanz, d.h. wenn die neue Klasse einen Zeiger darauf braucht -> mitgeben, wenn nicht dann nicht ;)

Ja, aber worran erkenne ich das in der Doku:

http://developer.kde.org/documentation/library/3.3-api/kdeui/html/classKMenuBar.html
http://doc.trolltech.com/3.3/qpopupmenu.html

Kannst du mir sagen an welcher Zeile ich das erkennen kann? Fuer mich sieht das irgendwie identisch aus....

TeXpert schrieb:
2. Punkt nimm Dir ein kleines KDE-tool und schau in den Code....

Das habe ich probiert (kshutdown war meine Wahl), dort wird

menu->insertItem(SmallIcon("help"), i18n("&Help"), helpMenu());

verwendet. Ueber SmallIcon meckert er, da man insertItem() auch mit zwei Parametern aufrufen kann habe ich das weg gelassen. Der Fehler lautet

/home/jochen/kfcalc/src/kfcalc.cpp:77: error: invalid conversion from ` KPopupMenu*' to `int'
/home/jochen/kfcalc/src/kfcalc.cpp:77: error: initializing argument 2 of `int QMenuData::insertItem(const QString&, int, int)'

Wie bekomme ich jetzt aus der Doku raus was man uebergeben muss?
 
Jochen_r schrieb:
Kannst du mir sagen an welcher Zeile ich das erkennen kann? Fuer mich sieht das irgendwie identisch aus....
es gibt kaum eine bessere Doku als die von Trolltech:

Doku schrieb:
QPopupMenu::QPopupMenu ( QWidget * parent = 0, const char * name = 0 )
Constructs a popup menu called name with parent parent.

Although a popup menu is always a top-level widget, if a parent is passed the popup menu will be deleted when that parent is destroyed (as with any other QObject).

das ist in diesem Fall also eine Designentscheidung.

menu->insertItem(SmallIcon("help"), i18n("&Help"), helpMenu());

verwendet. Ueber SmallIcon meckert er, da man insertItem() auch mit zwei Parametern aufrufen kann habe ich das weg gelassen. Der Fehler lautet

/home/jochen/kfcalc/src/kfcalc.cpp:77: error: invalid conversion from ` KPopupMenu*' to `int'
/home/jochen/kfcalc/src/kfcalc.cpp:77: error: initializing argument 2 of `int QMenuData::insertItem(const QString&, int, int)'
2 Parameter ja, aber es kommt auf die Typen an ;)
Code:
i18n("&Help")
ist ein QString aber die Fehlermeldung sagt doch klar aus, dass er einen Int erwartet... Du musst Dir schon die richtige Funktion raussuchen :)
 
TeXpert schrieb:
Jochen_r schrieb:
Kannst du mir sagen an welcher Zeile ich das erkennen kann? Fuer mich sieht das irgendwie identisch aus....
es gibt kaum eine bessere Doku als die von Trolltech:

Doku schrieb:
QPopupMenu::QPopupMenu ( QWidget * parent = 0, const char * name = 0 )
Constructs a popup menu called name with parent parent.

Although a popup menu is always a top-level widget, if a parent is passed the popup menu will be deleted when that parent is destroyed (as with any other QObject).

das ist in diesem Fall also eine Designentscheidung.
?! Ich kann leider aus der zitierten Antwort nichts erkennen... Kannst du die fuer einen Anfaenger auseinanderpfluecken und sagen was dort in "Klartext" steht? Designentscheidung hoert sich so an, als ob ich das "this" weg lassen kann oder auch nicht. Ohne "this" funzt es aber nicht.
menu->insertItem(SmallIcon("help"), i18n("&Help"), helpMenu());

verwendet. Ueber SmallIcon meckert er, da man insertItem() auch mit zwei Parametern aufrufen kann habe ich das weg gelassen. Der Fehler lautet

/home/jochen/kfcalc/src/kfcalc.cpp:77: error: invalid conversion from ` KPopupMenu*' to `int'
/home/jochen/kfcalc/src/kfcalc.cpp:77: error: initializing argument 2 of `int QMenuData::insertItem(const QString&, int, int)'
2 Parameter ja, aber es kommt auf die Typen an ;)
Code:
i18n("&Help")
ist ein QString aber die Fehlermeldung sagt doch klar aus, dass er einen Int erwartet... Du musst Dir schon die richtige Funktion raussuchen :)

Ja ja, ich brauche die richtige uebergeladene Funktion, wenn ich in die Doku schaue sehe ich aber nur Funktionen mit mehr 2 Parametern. Einige davon sind also wohl offensichtlich nicht verpflichtend, aber wie erkenne ich welche?
 
Jochen_r schrieb:
TeXpert schrieb:
das ist in diesem Fall also eine Designentscheidung.
?! Ich kann leider aus der zitierten Antwort nichts erkennen... Kannst du die fuer einen Anfaenger auseinanderpfluecken und sagen was dort in "Klartext" steht? Designentscheidung hoert sich so an, als ob ich das "this" weg lassen kann oder auch nicht. Ohne "this" funzt es aber nicht.
es kommt darauf an, ob Du das Popup-Menu selber verwalten (z.B. in einer eigenen Ressourcen-Klasse mit entsprechendem Singleton-Pattern) und dann am Programmende selber aufräumen lassen willst, oder ob Du das Menü eindeutig dem Fenster (genauer der Instanz) zuordnest und automagisch von dem aufräumen lassen willst.

Ja ja, ich brauche die richtige uebergeladene Funktion, wenn ich in die Doku schaue sehe ich aber nur Funktionen mit mehr 2 Parametern. Einige davon sind also wohl offensichtlich nicht verpflichtend, aber wie erkenne ich welche?

verpflichtend sind alle Parameter, es kann aber ein passender Defaultwert (int foo=0) mitgegeben werden, den kannst Du dann weglassen.

da hast geschrieben:
menu->insertItem(SmallIcon("help"), i18n("&Help"), helpMenu());

Ueber SmallIcon meckert er, da man insertItem() auch mit zwei Parametern aufrufen kann habe ich das weg gelassen. Der Fehler lautet
daraus schließe ich: Du hast menu->insertItem(i18n("&Help"), helpMenu());
benutzt. aber Helpmenu schein kein int zu liefern :) sondern ein KPopuzpMenu, hier weiß ich als nicht KDE-Coder aber nicht, wie das von den QtKlassen abgeleitet ist daher kann ich Dir da nicht genau helfen., Du brauchst eine Funktion <TYP> insertItem(Qstring, <TYP2>)
dabei ist <TYP> wahrscheinlich ein int, aber das ist Dir ja egal und TYP2 eben das was helpMenu() liefert.
 
Oben