2014-03-05 12 views
22

Ich schreibe eine Qt-Desktop-Anwendung in C++ mit Qt Creator.Hinzufügen eines Rechtsklick-Menüs für bestimmte Elemente in QTreeView

Ich erklärte in meinem Hauptfenster ein TreeView und ein kompatibles Modell.

Jetzt möchte ich ein Rechtsklick-Menü für die Baumstruktur haben. Nicht für alle Elemente, sondern für einen Teil von ihnen, zum Beispiel: für die Baumelemente mit einem geraden Index.

ich mit dem folgenden Code ein einfaches Kontextmenü versuchte, fügte hinzu:

in der H-Datei:

QStandardItemModel* model; 
QMenu* contextMenu; 
QAction* uninstallAction; 
private slots: 
    void uninstallAppletClickedSlot(); 

und in der CPP-Datei:

in der Erbauer:

ui->treeView->setModel(model); 
contextMenu = new QMenu(ui->treeView); 
ui->treeView->setContextMenuPolicy(Qt::ActionsContextMenu); 
uninstallAction = new QAction("Uninstall TA",contextMenu); 
ui->treeView->addAction(uninstallAction); 
connect(uninstallAction, SIGNAL(triggered()), this, SLOT(uninstallAppletClickedSlot())); 

und ein Schlitz:

void MainWindow::uninstallAppletClickedSlot() 
{ 

} 

dieser Code gibt mir ein Kontextmenü mit der gewünschten Aktion, aber Sie haben keine Ahnung, wie kann ich diese Aktion nur für den QStandardItem s mit dem geraden Indizes hinzufügen ??

BTW, ich bin das Hinzufügen von Elementen zu dem TreeView durch die folgende Weise:

void MainWindow::AddItem(QString name) 
{ 
QStandardItem *parentItem = model->invisibleRootItem(); 
QStandardItem *app = new QStandardItem(name); 
parentItem->appendRow(app); 
} 

gegoogelt ich viel, aber nichts gefunden :(

Dank im Voraus

Antwort

39

! Ich würde dies auf folgende Weise tun:

Konfigurieren Sie das Kontextmenü

ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu); 
connect(ui->treeView, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onCustomContextMenu(const QPoint &))); 

Implementieren Sie das Kontextmenü Handhabung

void MainWindow::onCustomContextMenu(const QPoint &point) 
{ 
    QModelIndex index = ui->treeView->indexAt(point); 
    if (index.isValid() && index.row() % 2 == 0) { 
     contextMenu->exec(ui->treeView->mapToGlobal(point)); 
    }  
} 
+0

Dank, @vahancho, ich Ihre Anweisungen befolgt, aber das Ergebnis ist: wenn ich auf einer Zeile mit einem geraden Index drücken - ich kann ein wenig Punkt sehen erscheint in der Form, und sobald ich auf eine Zeile mit ungeraden Index drücken - nichts erscheint. Das ist gut, aber das Menü erscheint überhaupt nicht! die exec() -Funktion führt die gewünschte Aktion nicht durch. Hast du noch eine Idee? Danke vielmals! – user1835297

+2

@ user1835297, eigentlich musst du dein Menü vorher aufbauen. Ich habe diesen Code nicht in meine Antwort aufgenommen. Sie müssen nur: 'contextMenu-> addAction (" Deinstallieren TA ", dieses, SLOT (uninstallAppletClickedSlot());' oder so. – vahancho

+1

Verwenden Sie 'ui-> treeview-> viewport() -> mapToGlobal (Punkt)' stattdessen, wenn Sie einen merkwürdigen Offset des Menüs erfahren. –

Verwandte Themen