QTreeWidget Kontext Menü

Alles rund um die Programmierung mit Qt
Antworten
mike
Beiträge: 7
Registriert: 31. Oktober 2016 18:18

QTreeWidget Kontext Menü

Beitrag von mike »

Hallo,

ich möchte eine Qt3(KDE3) Anwendung an Qt4 anpassen. Ich bin dabei in der Anwendung die Klasse K3ListView durch die Klasse QTreeWidget zu ersetzen. Jetzt habe ich ein Problem mit dem Kontextmenü. Die Baumansicht besteht aus mehreren Spalten.

Es gibt zwei Kontextmenüs. Eines wenn man in der Baumansicht auf eine Element rechts klickt, und eines wenn man auf die Spaltenbezeichnung rechts klickt. Das Kontextmenü wenn man auf ein Baum-Element rechts klickt konnte ich anpassen, das funktioniert.

Ich weiß nicht welches "Signal" ich für das Kontextmenü der Spaltenbezeichnung verwenden muß.

Im alten Zustand (K3ListView Klasse) sieht der Quelltext bzgl. Kontextmenü/Signal für rechts Klick in der Baumansicht so aus:

Code: Alles auswählen

connect(h_drView, SIGNAL(contextMenu(K3ListView*, QTreeWidgetItem*, const QPoint&)),
          SLOT(slotArticleRMB(K3ListView*, QTreeWidgetItem*, const QPoint&)));             
Neu für QTreeWidget Klasse (das funktioniert soweit):

Code: Alles auswählen

h_drView->setContextMenuPolicy(Qt::CustomContextMenu);    


connect(h_drView, SIGNAL(customContextMenuRequested(const QPoint&)),   
          SLOT(slotArticleRMB(const QPoint&)));
Das Signal customContextMenuRequested() wird nicht ausgelöst wenn ich in die Spaltenbezeichnung rechts klicke.

Welches Signal muß ich verwenden um ein Kontext Menü für die Spaltenbezeichnung erstellen zu können?

Der alte Quelltext (K3ListView Klasse) für das Kontextmenü der Spaltenbezeichnung sieht so aus:

Code: Alles auswählen

// column selection RMB menu
  mPopup = new QMenu( this );
  mPopup->addTitle( i18n("View Columns") );
  KnHwPmenuSize = mPopup->addAction( i18n("Line Count") );
  KnHwPmenuSize->setCheckable(true);
  KnHwPmenuScore = mPopup->addAction( i18n("Score") );
  KnHwPmenuScore->setCheckable(true);

  connect( KnHwPmenuSize, SIGNAL(toggled(bool)), this, SLOT(toggleColumnSize(bool)) );
  connect( KnHwPmenuScore, SIGNAL(toggled(bool)), this, SLOT(toggleColumnScore(bool)) );
Dieser Code für das Kontexmenü der Spaltenbezeichnung funktioniert nicht mehr nachdem ich die K3ListView durch QTreeWidget ersetzt habe.

Ich habe versucht folgende Signale zu verwenden, sie werden allerdings nicht ausgelöst wenn ich in der Spaltenbezeichnung rechts klicke:

Code: Alles auswählen

  connect(mPopup, SIGNAL(customContextMenuRequested(const QPoint)), this, SLOT(slotMPopup(const QPoint)));

  connect(mPopup, SIGNAL(triggered(QAction *action)), this, SLOT(slotMPopup(QAction*)));

  connect(this, SIGNAL(contextMenuEvent(QContextMenuEvent*)), this, SLOT(slotMPopup(QContextMenuEvent*)));
Hat jemand vielleicht einen Hinweis für mich?

Es ist eine Opensource Anwendung, die Quellen liegen auf Github, falls jemand zum besseren Verständnis mehr Quelltext dazu anschauen möchte, kann ich einen Link dazu posten.


mike
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QTreeWidget Kontext Menü

Beitrag von Christian81 »

void QWidget::customContextMenuRequested(const QPoint &pos)
This signal is emitted when the widget's contextMenuPolicy is Qt::CustomContextMenu, and the user has requested a context menu on the widget.
von http://doc.qt.io/qt-5/qwidget.html#cust ... uRequested
D.h. hast Du die Policy korrekt gesetzt?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
mike
Beiträge: 7
Registriert: 31. Oktober 2016 18:18

Re: QTreeWidget Kontext Menü

Beitrag von mike »

Ich konnte das Problem mit dem Signal lösen.

Der folgende Beitrag hat mich in die richtige Richtung gewiesen: http://toto-share.com/2011/07/contextme ... tableview/

Die Spaltenbezeichnungen (Header) sind ein eigenes Objekt (Typ QHeaderView). Der Code um das Signal zu verwenden sieht nun so aus:

Code: Alles auswählen

// column selection RMB menu
  mPopup = new QMenu( this );
  mPopup->setTitle( i18n("View Columns") );      
  KnHwPmenuSize = mPopup->addAction( i18n("Line Count") );    
  KnHwPmenuSize->setCheckable(true);
  KnHwPmenuScore = mPopup->addAction( i18n("Score") );       
  KnHwPmenuScore->setCheckable(true);

  QHeaderView *columnHeader = header();     
  columnHeader->setContextMenuPolicy(Qt::CustomContextMenu);    

  connect(columnHeader, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(slotMPopup(const QPoint&)));   
Dieses Signal wird ausgelöst, nun muß ich noch die Slot-Funktion korrekt implementieren.

mike
Antworten