Добавление контекстного меню для определенных элементов в QTreeView

Я пишу настольное приложение Qt на C ++ с помощью Qt Creator.

Я объявил в своем главном окне treeView и совместимую модель.

Теперь я хотел бы иметь контекстное меню для элемента дерева. Не для всех элементов, а для их части, например: для элементов дерева с четным индексом.

Я попытался добавить простое контекстное меню со следующим кодом:

в файле .h:

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

и в файле .cpp:

в конструкторе:

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

и слот:

void MainWindow::uninstallAppletClickedSlot()
{

}

этот код дает мне контекстное меню с желаемым действием, но знаете ли вы, как я могу добавить это действие только для QStandardItem с четными индексами ??

Кстати, я добавляю элементы в treeView следующим образом:

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

Много гуглил, но ничего не нашел :(

заранее спасибо!


person user1835297    schedule 05.03.2014    source источник


Ответы (1)


Я бы сделал это следующим образом:

Настроить контекстное меню

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

Реализовать обработку контекстного меню

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));
    }    
}
person vahancho    schedule 05.03.2014
comment
спасибо, @vahancho, я выполнил ваши инструкции, но результат таков: как только я нажимаю строку с четным индексом - я вижу, что в форме появляется небольшая точка, и как только я нажимаю строку с нечетным индексом - ничего не появляется . это хорошо, но меню вообще не появляется! то есть функция exec () не выполняет желаемое действие. Есть еще идеи? большое спасибо! - person user1835297; 05.03.2014
comment
@ user1835297, на самом деле вам нужно заранее создать свое меню. Я не включил этот код в свой ответ. Вам просто нужно: contextMenu->addAction("Uninstall TA", this, SLOT(uninstallAppletClickedSlot()); или около того. - person vahancho; 05.03.2014
comment
Вместо этого используйте ui->treeview->viewport()->mapToGlobal(point), если вы видите странное смещение меню. - person Sebastian Wagner; 22.04.2017
comment
Это потому, что представления элементов - это области QAbstractScroll. Таким образом, исключением из этого правила является QAbstractScrollArea и его подклассы, которые отображают событие контекстного меню в координаты области просмотра (). из документов применяется. - person dom0; 11.08.2018