yonutix
yonutix

Reputation: 2439

Right click on QTreeView item

I want to generate the right click menu from the entry of a QTreeView. Currently I tried this, but I don't want the whole treeView to generate the right click and then me to filter the position on which the mouse is. I want that the signal to be generated from the entry.

connect(mtreeView, SIGNAL(customContextMenuRequested(const QPoint&)),
        this, SLOT(showContextMenu(const QPoint&)));

Thanks!

Upvotes: 0

Views: 7256

Answers (3)

galinette
galinette

Reputation: 9292

What you mean by the entry is not represented by a QObject in Qt. Only the item model is a QObject, but the individual tree nodes are not QObjects in Qt item/view system.

Therefore, they cannot emit any signal

Upvotes: 0

galinette
galinette

Reputation: 9292

Method 1

It is better to use the ContextMenuEvent rather than MouseReleaseEvent as it is a more portable way to trigger the context menu, will support accessibility on certain platforms, etc... The right click is not the only way to open a context menu.

If you do not want to subclass QTreeView , install an event handler from the main window:

ui->myTreeView->installEventFilter(this);

Then handle the event in the main window filterEvent

bool MainWindow::eventFilter(QObject *target, QEvent *event)
{
    if (target == ui->myTreeView)
    {
        QContextMenuEvent* m = dynamic_cast<QContextMenuEvent*>(event);
        if (event->type() == QEvent::ContextMenu && e!=0)
        {
                //Create context menu here
                return true;
        }
    }
    return false;
}

Method 2

Change the context menu mode to a signal:

ui->myTreeView->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->myTreeView, SIGNAL(customContextMenuRequested(QPoint)),
    this, SLOT(treeCustomMenu(QPoint)));

Then implement your slot:

void MainWindow::treeCustomMenu(const QPoint & pos)
{
    //Implement your menu here using myTreeView->itemAt(pos);
}

Upvotes: 8

Ziming Song
Ziming Song

Reputation: 1346

What I do is to override mouseReleaseEvent and check manually.

void MyTreeView::mouseReleaseEvent(QMouseEvent *e) {
    if (e->button() == Qt::RightButton) {
        QTreeWidgetItem *item = itemAt(e->pos());
        if (item) {
            QMenu m;
            m.addAction("hello");
            m.addAction("world");
            QAction *selected = m.exec(mapToGlobal(e->pos()));
            if (selected) {
                qDebug() << "selected" << selected->text();
            }
        }
    } else {
        QTreeView::mouseReleaseEvent(e);
    }
}

Upvotes: 3

Related Questions