Seite 1 von 1
Kontextmenü nur bei selektierter Tabellenzeile
Verfasst: 24. August 2009 10:05
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.
Verfasst: 24. August 2009 12:05
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.
Verfasst: 24. August 2009 13:30
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?
Verfasst: 24. August 2009 13:58
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
So oder so ähnlich... ist nicht getestet... mal probieren...
Verfasst: 24. August 2009 15:35
von spacer2004
Habe ich ausprobiert, funktioniert aber leider nicht.
Verfasst: 24. August 2009 16:15
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);
}
}
Verfasst: 25. August 2009 16:42
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.