[erledigt] Rechtsklick auf Item

Alles zum Qt Framework für Java
Antworten
Malriks
Beiträge: 14
Registriert: 28. Juni 2007 18:53

[erledigt] Rechtsklick auf Item

Beitrag von Malriks »

Weiss jemand von euch wie man ein eigenes ContextMenu definiert, dass erscheint, wenn man auf ein Item rechts klickt?

ich habe ein treeWidget erstellt und ich möchte, dass sich bei einem Rechtsklick auf ein Item ein Menü öffnet, wo man dann verschiedene QActions anklicken kann.
Zuletzt geändert von Malriks am 28. Juli 2007 00:26, insgesamt 2-mal geändert.
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag von CaptnChaos »

also, du musst von deinem TreeView eine Subclass bilden, in der du dann mousePressEvent neu implementierst und bei einem Rechtsklick ein QMenu öffnest
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

ich habe ein solches Signal des Views auch schon vermisst.

Allerdings muss man nicht notwendig eine Klasse von TreeView ableiten wenn man das nicht will (z.B. weil man den Dialog im Designer erstellt hat), sondern kann auch einen eventFilter installieren.

Gruß Arne

PS: wichtig ist, dass Du den Viewport und nicht das TreeView überwachst.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Ich habe mit Views noch nicht gearbeitet, aber es sollte mich sehr wundern, wenn es da nicht auch ein contextMenuEvent gibt.
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.
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

Ich habe mit Views noch nicht gearbeitet, aber es sollte mich sehr wundern, wenn es da nicht auch ein contextMenuEvent gibt.
... gibt es natürlich, es ist aber eben ein Event und kein Signal

Gruß Arne
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Es wurde auch nicht nach einem Signal gefragt. Der Ursprungsposter geht sogar von einem TreeWidget aus und da ist gar kein Problem mit dem ContextMenu. Im contextMenuEvent holt man sich das entsprechende Item mit itemAt(QPos), erstellt ein entsprechendes Menü und zeigt es an.
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.
Malriks
Beiträge: 14
Registriert: 28. Juni 2007 18:53

Beitrag von Malriks »

ArneStocker hat geschrieben:Allerdings muss man nicht notwendig eine Klasse von TreeView ableiten wenn man das nicht will (z.B. weil man den Dialog im Designer erstellt hat), sondern kann auch einen eventFilter installieren.
und wie geht das? also ich habe das mit dem Rechtsklick noch nicht hinbekommen.
Malriks
Beiträge: 14
Registriert: 28. Juni 2007 18:53

Beitrag von Malriks »

mit dem Ableiten geht jetzt danke! :D mit den Events weiss ich nicht wie das geht.
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

hi

Zum Installieren des Eventfilters

Code: Alles auswählen

     View.installEventFilter(this);
und zum Reagieren auf die Events

Code: Alles auswählen


public boolean eventFilter(QObject watched, QEvent event) {
    	if (watched == null) return false;
    	
    	// Ereignisse für den Viewport
    	if (watched == this.m_view.viewport()) {
    		// MousePress: rechte Maustaste beachten
    		if (event.type() == QEvent.Type.MouseButtonPress) {
	    		QMouseEvent mouseevent = (QMouseEvent) event;
	    		if (mouseevent.button() == Qt.MouseButton.RightButton) {
	    			// aktuelles Item auswählen
	    			QPoint screen_pos = QCursor.pos();
	    			QPoint local_pos = this.m_view.viewport().mapFromGlobal(screen_pos);
	    			QModelIndex new_index = this.m_view.indexAt(local_pos);
	    			if (new_index != null) {
	    				QObjectInfo new_select = GetObjectInfo(new_index.row()); 
	    				if (new_select != this.GetSelectedObject()) {
	    					this.SelectObject(new_select);
	    				}
	    			}
	    			// Nachricht aussenden
	    			this.m_rightClickEvent.emit(this.m_view);
	    			return true;
	    		}
    		}
    	}
    	// sonst weiterleiten des Events
    	return super.eventFilter(watched, event);
    }

Gruß Arne
henbug
Beiträge: 2
Registriert: 28. Juli 2007 11:47
Kontaktdaten:

Beitrag von henbug »

Auch wenn ich jetzt nicht der Verfasser vom Thread bin, ich klink mich mal ein
ArneStocker hat geschrieben:hi

Zum Installieren des Eventfilters

Code: Alles auswählen

     View.installEventFilter(this);
... noch ne Menge mehr ...
Gruß Arne

Ohman, du glaubst garnicht wie dankbar ich bin für den Code
Dankeschön

Oh sollte man vieleicht erwähnen
View = QTreeWidget.viewport()

Hab mir nen Wolf gesucht :-)

gruss henug
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

View = TreeView

.. also bei mir funktioniert es auch, wenn ich nur die Events des Views filtere, wahrscheinlich erhält der View auch die Events des Viewports (zum Filtern)

Gruß Arne
ChMaster
Beiträge: 252
Registriert: 23. Februar 2005 14:44
Wohnort: RP -> Alzey
Kontaktdaten:

Beitrag von ChMaster »

Servus zusammen,

bisschen spät für meine Antwort. :-)

Ich hatte auch das Problem mit dem Kontextmenu. Ich habe es so gelöst, ohne den installEventFilter(...);

Natürlich kann man es noch verfeinern, wie abfragen ob man auf einem QTreeWidgetItem oder sonstwas ist.

Code: Alles auswählen


treeWidgetRegistry.customContextMenuRequested.connect( this, "contextRequested( QPoint )" );
treeWidgetRegistryEntry.customContextMenuRequested.connect( this, "contextRequested( QPoint )" );
treeWidgetPackages.customContextMenuRequested.connect( this, "contextRequested( QPoint )" );

    /**
     * Requested from {@link QTreeWidget}
     */
    private void contextRequested( QPoint pos )
    {
        try
        {
            if( QPoint.signalSender() instanceof QTreeWidget )
            {
                QTreeWidget treeWidget = (QTreeWidget)QPoint.signalSender();
                if( treeWidget != null )
                {
                    if( treeWidget.objectName().equalsIgnoreCase( "treeWidgetRegistry" ) )
                    {
                        cntxRegistryMenu.exec( treeWidget.mapFrom( treeWidget, QCursor.pos() ) );
                    }
                    if( treeWidget.objectName().equalsIgnoreCase( "treeWidgetRegistryEntry" ) )
                    {
                        cntxRegValueMenu.exec( treeWidget.mapFrom( treeWidget, QCursor.pos() ) );
                    }
                    if( treeWidget.objectName().equalsIgnoreCase( "treeWidgetPackages" ) )
                    {
                        cntxPackagesMenu.exec( treeWidget.mapFrom( treeWidget, QCursor.pos() ) );
                    }
                }
            }
        }
        catch( Exception ex )
        {
            ex.printStackTrace();
        }
    }
ChMaster
------------ Projekte------------
DBoxFE
DMS
First4 (Plugin-Develper)
Antworten