Kontextmenü nur bei selektierter Tabellenzeile

Alles rund um die Programmierung mit Qt
Antworten
spacer2004
Beiträge: 9
Registriert: 16. März 2007 13:55

Kontextmenü nur bei selektierter Tabellenzeile

Beitrag von spacer2004 »

Hi,
ich erstelle wie folgt mein Kontextmenu in meiner Tabelle:
QTableWidget::verticalHeader()->setContextMenuPolicy(Qt::ActionsContextMenu);
QTableWidget::verticalHeader()->addAction(m_pInsertRowOnTop);
QTableWidget::verticalHeader()->addAction(m_pInsertRowOnBottom);
QTableWidget::verticalHeader()->addAction(m_pDeleteRow);

Dieses Kontextmenu soll nur angezeigt werden, wenn eine Zeile selektiert ist. Leider wird es aber auch angezeigt, wenn keine Zeile selektiert ist. Gibt es eine Möglichkeit dies zu verhindern?
Ich habe auch schon die Policy CustomContextMenu ausprobiert, nur leider funktionieren dabei die Shortcuts nicht mehr.
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Beitrag von archer »

Ich denke da musst du das contextMenuEvent selber implementieren und dort abfragen ob eine Zeile markiert (QItemSelectionModel) ist.
Wenn ja Menü anzeigen, sonst nicht.
spacer2004
Beiträge: 9
Registriert: 16. März 2007 13:55

Beitrag von spacer2004 »

Wenn ich richtig verstehe, dann erstelle ich eine abgeleitete Klasse für den vertikalen Header, in der ich die Methode contextMenuEvent überschreibe. Dort prüfe ich ob eine Zeile selektiert ist. Aber wie schalte ich das Menü ein?
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Beitrag von archer »

Ich würde da eher einen eventFilter für schreiben.

Code: Alles auswählen

// MyWindow ist das Qidget in dem das Tablewidget steckt.
bool MyWindow::eventFilter(QObject *obj, QEvent *event)
{
     if (obj == myTable->verticalHeader()) 
     {
         if (event->type() == QEvent::ContextMenu) 
         {
             if (myTable->selectionModel()->selectedRows(0) > 0)
                 return false; // Event wird an das headerview weitergwleitet
             else 
                 return true;  // Event wird nichts gemacht
         } 
         else 
        {
             return true;
         }
     } 
     else 
     {
         // pass the event on to the parent class
         return MyWindow::eventFilter(obj, event);
     }
 }
Den eventfilter installieren, z.B. im Konstruktor

Code: Alles auswählen

myTable->verticalHeader()>installEventFilter(this);
So oder so ähnlich... ist nicht getestet... mal probieren...
spacer2004
Beiträge: 9
Registriert: 16. März 2007 13:55

Beitrag von spacer2004 »

Habe ich ausprobiert, funktioniert aber leider nicht.
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Beitrag von archer »

War ein Versuch, kann sein das das so nur mit dem defaultcontextmenü funktioniert.

Dann halt die Policy CustomContextMenu verwenden und das Menü selber zusammenbauen und aufrufen.

So in der Art mache ich das immer, alledings benutze ich ein View.

Code: Alles auswählen

// MyWindow ist das Qidget in dem das Tablewidget steckt.
bool MyWindow::eventFilter(QObject *obj, QEvent *event)
{
     if (obj == myTable)
     {
         if (event->type() == QEvent::ContextMenu)
         {
             QContextMenuEvent* pEvent = reinterpret_cast<QContextMenuEvent*>(event);
             pEvent->accept();

             if (myTable->selectionModel()->selectedRows(0) > 0)
             {
                 if (myTable->verticalHeader()->rect().contains(pEvent->pos()) == true)
                 {
                     QMenu menu("MyMenü");
                     menu.addAction(m_pInsertRowOnTop);
                     menu.addAction(m_pInsertRowOnBottom);
                     menu.addAction(m_pDeleteRow);
                     menu.exec(pEvent->globalPos());
                     return true;
                  }
             }
         }

         return false;
     }
     else
     {
         // pass the event on to the parent class
         return MyWindow::eventFilter(obj, event);
     }
 } 

Code: Alles auswählen

myTable->installEventFilter(this); 
spacer2004
Beiträge: 9
Registriert: 16. März 2007 13:55

Beitrag von spacer2004 »

OK, habe das Menü als CustomContextMenu erstellt. Ich musste aber auch die Shortcuts zu den Menüpunkten per Hand erstellen. Bei den CustomContextMenus werden anscheinend die Shortcuts von QAction wird ausgewertet.
Antworten