Seite 1 von 1

QMenuBar extern erstellen

Verfasst: 22. September 2008 11:20
von komaton
Hallo,

wie man sieht bin ich hier genauso neu wie bei der QT programmierung.
Bin 28, Student der Informatik und bin grad im Praktikum wo ich ne Anwendung mit QT4 programmieren soll.

Mein derzeitiges Problem besteht darin das ich eine separate Klasse zur erstellung der Menus geschrieben habe (damit flexibilitaet beim ersetzen/abaendern der Menus gewahrt bleibt) und ich nun die MenuBar in mein Main Widget (application Window) einfuegen will.
Das erstellen scheint ohne problem zu funktionieren, laut kdbg.
Leider zeigt es die Menus nicht an, und ich finde einfach das Problem nicht.
Ich kann nicht bestreiten das es moeglicherweise auch ein allgemeiner Verstaendnissfehler QT betreffend ist.

Ich wuerde einfach mal die Kostrkutoren der klassen und die betreffenden Funktionen posten.

Aufruf zum erstellen der Menus im Main Widget

Code: Alles auswählen

void gemo::addMenus( void )
{
	menu* fm = new menu(this, this);
	QMenuBar *bar = new QMenuBar(this);
	bar = fm->getMenuBar();
}
Konstruktor der Menuklasse

Code: Alles auswählen

menu::menu(QObject *that, QWidget *thatthat)
{
	parentObjectPointer = that;
	parentWidgetPointer = thatthat;
	applicationBar = new QMenuBar(parentWidgetPointer);
	fileMenu = new QMenu(parentWidgetPointer);

	createActions();

	applicationBar->addMenu(fileMenu);
	applicationBar->addMenu(editMenu);
	applicationBar->addMenu(drawMenu);
	applicationBar->addMenu(vMenu);
	applicationBar->addMenu(viewMenu);
	applicationBar->addMenu(helpMenu);
}
prinzipiell wird der this Pointer des Main Widgets an die Klasse uebergeben und als parentPointer fuer die Menus und die MenuBar verwendet.

Beispiel fuer Konstruktfnkt der Actionen im Menu

Code: Alles auswählen

	newAction = new QAction(tr("&New"), parentObjectPointer);
	newAction->setShortcut(tr("Ctrl+N"));
	newAction->setIcon(QIcon(":/images/filenew..xpm"));
	newAction->setStatusTip(tr("Create a new network file"));
	connect(newAction, SIGNAL(triggered()),parentObjectPointer, SLOT(newFile()));
	createMenus(fileMenu, newAction, 0, "New", "File");
die fnkt die die einzelnen Menus baut

Code: Alles auswählen

void menu::createMenus(QMenu* tmpMenu, QAction* tmpAction, int MultiMenu, QString Name, QString MenuName)
{
	if ( MultiMenu > 0 )
	{
		for ( int i=0;i<MultiMenu;i++ )
		{
			tmpMenu->addAction(recentFileActions[i]);
		}
	}
	else
	{
		tmpMenu->addAction (tmpAction);
	}

	if(MenuName == "File")
	{
		fileMenu=tmpMenu;
	}
	else if(MenuName == "Edit")
	{
		editMenu=tmpMenu;
	}
	else if(MenuName == "Draw")
	{
		drawMenu=tmpMenu;
	}
	else if(MenuName == "Vis")
	{
		vMenu=tmpMenu;
	}
	if(MenuName == "View")
	{
		viewMenu=tmpMenu;
	}
	if(MenuName == "Help")
	{
		helpMenu=tmpMenu;
	}
}
die Fnkt die den Pointer auf die Menubar ans Main Widget zurueck gibt ist eine eiinfache getfnkt die nen QMenuBar pointer zurueck gibt.

Und so wie es aussieht scheint von seitens der Pointer kein problem zu bestehten, die werden alle korrekt durchgereicht. Nur das mein Menu nicht erscheint wenn ich die Anwendung starte.

Entwicklungsumgebung ist KDevelop 3.5.7 und QT 4.4.1 und ich schreibe die Anwendung von Hand, ohne QTDesigner.

Gut, ich hoffe das waren ausreichend Informationen und ihr koennt mir moeglicherweise helfen.

MfG koma

Verfasst: 22. September 2008 12:38
von ElwoodJ
Hallo,

void QMainWindow::setMenuBar ( QMenuBar * menuBar ) sollte des Rätsels Lösung sein :)

Gruß

Elwood

Verfasst: 22. September 2008 13:08
von komaton
hm,

also

Code: Alles auswählen

this->setMenuBar(bar);
scheint die MenuBar korrekt zu setzen.
Problem ist, das die MenuBar leer ist.

Geh ich recht in der Annahme das die Actionhaendler fuer das Menu in der Klasse des Main Widgets erzeugt werden muessen?
Wenn ja wuerde das die ganzen Anstrengungen unnuetz machen, da ich gerade das vermeiden wollte. Ich wollte es gern so halten das die komplette Menustruktur ausserhalb des Main Widgets erzeugt wird und nur an dieses uebergeben wird, via QMenuBar Pointer zb.

Verfasst: 22. September 2008 13:18
von ElwoodJ
komaton hat geschrieben: Ich wollte es gern so halten das die komplette Menustruktur ausserhalb des Main Widgets erzeugt wird und nur an dieses uebergeben wird, via QMenuBar Pointer zb.
Da spricht meiner Meinung nach auch nichts gegen. Ich kann es hier gerade nicht direkt überblicken, aber ich gehe davon aus, dass du irgendwo einen Parent nicht sauber setzt.

Du kannst mittels addMenuBar eine vorher erzeugte MenuStruktur deinem MainWindow zuweisen. In welchen Objekten du diese erzeugst sollte da keine Rolle spielen.

Gruß

Verfasst: 22. September 2008 13:38
von komaton
danke,

ich hab das Problem gefunden.
Ich hatte bei dem Aufruf fuers erstellen der MenuBar den this pointer des Main Widgets uebergeben, hab ich mich wohl in der Reference verkuckt.

Code: Alles auswählen

QMenuBar * QMainWindow::menuBar () const
erstellt eine leere MenuBar und der uebergeb ich dann den Pointer meines extern erzeugten Menus.

Danke nochmal fuer die Hilfe, war bestimmt nicht das letzte mal das ich die in anspruch nehmen muss .

MfG Koma :P