Seite 1 von 1

ContextMenu erstellung in eigener Header file.

Verfasst: 5. Juni 2007 15:32
von Nash
Da mein ContextMenu recht umfangreich ist.
Möchte ich es von meinem Widget trennen und in eine seperate Header File "hauen".

Code: Alles auswählen

class ContextMenu3DView : public QMenu
	{
.....
};
in dem Contextmenu kann man optionen verändern, deswegen muss ich es ständig im speicher halte, weil sonst meine actions gelöscht werden.
Die haue ich natürlich auch gleich in die Klasse.

die Frage ist, wie könnte ich es am besten anzeigen?

Code: Alles auswählen


if(evt->button() == Qt::RightButton)
	{
m_ContextMenu->popup(evt->globalPos());
}
das hier führt zu komischen sprüngen meines contestmenüs, wenn ich es aktiviere.

Hat jemand sowas schonmal gemacht?

Verfasst: 5. Juni 2007 15:40
von macman
Es gibt extra einen contextMenuEvent. Hast Du es etwa im mousePressEvent untergebracht?

Verfasst: 5. Juni 2007 15:41
von Nash
ich kann es auch in ContextMenu Event unterbringen, das ist glaube ich egal.

Verfasst: 5. Juni 2007 15:45
von macman
Dann hast Du die Buttonabfrage schon mal gespart. Warum dein Menü rumhüpft, kann man aus dem bisschen Code aber nicht erkennen.

Verfasst: 5. Juni 2007 15:52
von Nash
das Fenster erscheint kurz an der richtigen cursor pos und verschwindet dann wieder, und erscheint 100 pixel weiter unten und recht.

hier mein code:

der konstruktor:

Code: Alles auswählen

ContextMenu3DView::ContextMenu3DView(OgreCamera* p_Camera, QWidget* p_Parent /* = 0*/)
{
	if(p_Camera)
		m_Camera = p_Camera;
	
	if(p_Parent)
		this->setParent(p_Parent);

	createActions();
	
	m_RenderModeMenu = new QMenu("RenderMode", this);
	m_ViewsMenu = new QMenu("Views", this);

	

	m_RenderModeMenu->addAction(m_SolidModeAct);
	m_RenderModeMenu->addAction(m_WireFrameModeAct);
	m_RenderModeMenu->addAction(m_PointsModeAct);
		
	m_ViewsMenu->addAction(m_PerspectiveViewAct);
	m_ViewsMenu->addAction(m_FrontViewAct);
	m_ViewsMenu->addAction(m_BackViewAct);
	m_ViewsMenu->addAction(m_TopViewAct);
	m_ViewsMenu->addAction(m_BottomViewAct);
	m_ViewsMenu->addAction(m_LeftViewAct);
	m_ViewsMenu->addAction(m_RightViewAct);
	
	addMenu(m_ViewsMenu);
	addSeparator();
	addMenu(m_RenderModeMenu);
	addSeparator();
	addAction(m_StatisticOverlayAct);
	setVisible(false);
}
diese Klasse kommt als instance in mein Widget wo ich das Menu zeigen will.
Die instance wird einmal im konstruktor des Widgets erstellt.
thats it.

aufrufen tue ich es so:

Code: Alles auswählen

void 3DView::contextMenuEvent(QContextMenuEvent* evt)
{

	m_ContextMenu->popup(evt->globalPos());
		
}

Verfasst: 5. Juni 2007 18:54
von Nash
kein Idee Jungs?

eigentlich müsse das doch öfter vorkommen, das man sowas auslagern will.

Verfasst: 6. Juni 2007 07:37
von macman
Nash hat geschrieben:eigentlich müsse das doch öfter vorkommen, das man sowas auslagern will.
Eigentlich nicht. Ein Contextmenü hat übersichtlich zu sein, ist selten statisch und ruft eigentlich immer Funktionen der aufrufenden Klasse auf. Deshalb habe ich es noch nie ausgelagert, sondern baue es meistens erst, wenn es gebraucht wird.

Was dein Problem angeht, prüf mal ob der Aufruf doppelt geschieht. Und dann hilft nur debuggen.

Verfasst: 6. Juni 2007 09:39
von Nash
und was ist, wenn ich die aktionen wo anders definiere?
ich würde den code halt gerne auslagern, die ganze aktions liste aufzubauen mit den slots und so, ist verdammt lang

Verfasst: 6. Juni 2007 11:04
von macman
Ich habe nicht gesagt das es nicht geht, ich habe es nur noch nie gemacht. Hast Du es denn jetzt mal debuggt? Kommt der Aufruf zweimal oder nicht?

Verfasst: 6. Juni 2007 11:26
von neuschi
Nash hat geschrieben:ich kann es auch in ContextMenu Event unterbringen, das ist glaube ich egal.
Nein, ist es nicht!
Es ist plattformabhängig, wann das Kontextmenü erscheint: Unter Linux erscheint es beim MousePress, unter Windows dagegen erst beim MouseRelease.

\Ralf

Verfasst: 6. Juni 2007 12:14
von Nash
cool, wusste ich noch nicht.