在QTreeView中为特定项添加右键单击菜单

use*_*297 30 qt right-click qtreeview qstandarditem

我用Qt Creator用c ++编写了一个Qt桌面应用程序.

我在主窗口中声明了一个treeView和一个兼容的模型.

现在,我想为树项目提供一个右键单击菜单.不是针对所有项目,而是针对其中的一部分,例如:对于具有偶数索引的树元素.

我尝试使用以下代码添加一个简单的上下文菜单:

在.h文件中:

QStandardItemModel* model;
QMenu* contextMenu;
QAction* uninstallAction;
private slots:
    void uninstallAppletClickedSlot();
Run Code Online (Sandbox Code Playgroud)

并在.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()));
Run Code Online (Sandbox Code Playgroud)

和一个插槽:

void MainWindow::uninstallAppletClickedSlot()
{

}
Run Code Online (Sandbox Code Playgroud)

这段代码给了我一个带有想要动作的上下文菜单,但你知道我怎么能只为QStandardItem带有偶数索引的s 添加这个动作?

顺便说一句,我是通过以下方式向treeView添加项目:

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

我google了很多,但一无所获:(

提前致谢!

vah*_*cho 49

我会用以下方式做到这一点:

配置上下文菜单

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

实现上下文菜单处理

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));
    }    
}
Run Code Online (Sandbox Code Playgroud)

  • @ user1835297,实际上你必须事先构建你的菜单.我的回答中没有包含该代码.你只需要:`contextMenu-> addAction("卸载TA",这个,SLOT(uninstallAppletClickedSlot());`左右. (2认同)
  • 如果您遇到奇怪的菜单偏移,请使用`ui-> treeview-> viewport() - > mapToGlobal(point)`. (2认同)