Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding a right-click menu for specific items in QTreeView

I'm writing a Qt desktop application in c++ with Qt Creator.

I declared in my main window a treeView, and a compatible model.

Now, I would like to have a right-click menu for the tree item. Not for all of the items, but for a part of them, for example: for the tree elements with an even index.

I tried adding a simple context menu with the following code:

in the .h file:

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

and in the .cpp file:

in the constructor:

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

and a slot:

void MainWindow::uninstallAppletClickedSlot() {  } 

this code gives me a context menu with the wanted action, but do you have any idea how can I add this action only for the QStandardItems with the even indexes??

BTW, I'm adding items to the treeView by the following way:

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

I googled a lot, but found nothing :(

thanks in advance!

like image 436
user1835297 Avatar asked Mar 05 '14 12:03

user1835297


Video Answer


1 Answers

I would do this in the following way:

Configure the context menu

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

Implement the context menu handling

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));     }     } 
like image 60
vahancho Avatar answered Sep 23 '22 01:09

vahancho