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 QStandardItem
s 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!
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));
}
}