ContextMenu erstellung in eigener Header file.

Alles rund um die Programmierung mit Qt
Antworten
Nash
Beiträge: 118
Registriert: 27. April 2007 14:49

ContextMenu erstellung in eigener Header file.

Beitrag 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?
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Es gibt extra einen contextMenuEvent. Hast Du es etwa im mousePressEvent untergebracht?
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
Nash
Beiträge: 118
Registriert: 27. April 2007 14:49

Beitrag von Nash »

ich kann es auch in ContextMenu Event unterbringen, das ist glaube ich egal.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Dann hast Du die Buttonabfrage schon mal gespart. Warum dein Menü rumhüpft, kann man aus dem bisschen Code aber nicht erkennen.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
Nash
Beiträge: 118
Registriert: 27. April 2007 14:49

Beitrag 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());
		
}
Nash
Beiträge: 118
Registriert: 27. April 2007 14:49

Beitrag von Nash »

kein Idee Jungs?

eigentlich müsse das doch öfter vorkommen, das man sowas auslagern will.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag 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.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
Nash
Beiträge: 118
Registriert: 27. April 2007 14:49

Beitrag 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
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag 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?
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
neuschi
Beiträge: 78
Registriert: 23. Mai 2007 10:59

Beitrag 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
Nash
Beiträge: 118
Registriert: 27. April 2007 14:49

Beitrag von Nash »

cool, wusste ich noch nicht.
Antworten