web-dev-qa-db-fra.com

Ajout d'un menu contextuel pour des éléments spécifiques dans QTreeView

J'écris une application de bureau Qt en c ++ avec Qt Creator.

J'ai déclaré dans ma fenêtre principale une arborescence et un modèle compatible.

Maintenant, je voudrais avoir un menu contextuel pour l'élément d'arborescence. Pas pour tous les éléments, mais pour une partie d'entre eux, par exemple: pour les éléments d'arbre avec un index pair.

J'ai essayé d'ajouter un menu contextuel simple avec le code suivant:

dans le fichier .h:

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

et dans le fichier .cpp:

chez le constructeur:

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()));

et un slot:

void MainWindow::uninstallAppletClickedSlot()
{

}

ce code me donne un menu contextuel avec l'action souhaitée, mais avez-vous une idée comment puis-je ajouter cette action uniquement pour les QStandardItems avec les index pairs ??

BTW, j'ajoute des éléments à l'arborescence de la manière suivante:

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

J'ai beaucoup cherché sur Google, mais je n'ai rien trouvé :(

merci d'avance!

28
user1835297

Je le ferais de la manière suivante:

Configurer le menu contextuel

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

Implémenter la gestion du menu contextuel

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