[SOLVED] Context menu for QListView entries

  • I know how to set Qt::CustomContextMenu for QListView. I want to make two different menus for QListView and for items inside of it.

    I mean, when user click item in QListView he may want to see something like properties or edit this entry.

    If he click on QListView beyond items he may want to add new item to this list.

    How to make different menu for item? ( and know what item it was )

  • Hi!
    Maybe what you want isn't an item specific context menu but a custom item delegate (see: http://doc.qt.io/qt-5/model-view-programming.html#delegate-classes).

  • Working code:

    void MainWindow::listWidgetContextMenu(const QPoint &pos)
        QPoint globalpos = ui->listWidget->mapToGlobal(pos);
        QMenu menuBeyondItem;
        QAction* action_addElement = menuBeyondItem.addAction("Add");
        QMenu menuForItem;
        QAction* action_editElement = menuForItem.addAction("Edit");
        QListWidgetItem* pointedItem = ui->listWidget->itemAt(pos);
        QAction* selectedAction;
        if(!pointedItem) {
            selectedAction = menuBeyondItem.exec(globalpos);
            if(selectedAction) {
                if(selectedAction == action_addElement) {
                    qDebug() << "Add";
        else {
            selectedAction = menuForItem.exec(globalpos);
            if(selectedAction) {
                if(selectedAction == action_editElement) {
                    qDebug() << "Edit";

    What I didn't know was existence of QListWidget::itemAt(QPoint) function.

    For QListView use QModelIndex QListView::indexAt(const QPoint & p) const function.

Log in to reply