Seite 1 von 1

[erledigt] Rechtsklick auf Item

Verfasst: 6. Juli 2007 22:49
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.

Verfasst: 6. Juli 2007 22:56
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

Verfasst: 7. Juli 2007 15:33
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.

Verfasst: 9. Juli 2007 07:25
von macman
Ich habe mit Views noch nicht gearbeitet, aber es sollte mich sehr wundern, wenn es da nicht auch ein contextMenuEvent gibt.

Verfasst: 9. Juli 2007 11:27
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

Verfasst: 9. Juli 2007 11:38
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.

Verfasst: 27. Juli 2007 21:07
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.

Verfasst: 28. Juli 2007 00:25
von Malriks
mit dem Ableiten geht jetzt danke! :D mit den Events weiss ich nicht wie das geht.

Verfasst: 28. Juli 2007 10:49
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

Verfasst: 28. Juli 2007 12:30
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

Verfasst: 28. Juli 2007 14:40
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

Verfasst: 4. Juli 2008 13:55
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();
        }
    }