Qt/C++上下文菜单 - 禁用一个选项

4

我目前正在使用Qt和C++开发一个类似于浏览器的应用程序。

我已经创建了一个上下文菜单,允许右键单击操作,例如删除、重命名和添加文件夹。

void MyTreeWidget::createContextMenu() {    
    contextMenu = new QMenu();
    setContextMenuPolicy(Qt::ActionsContextMenu);

    addFolderAction = new QAction("Add Folder", contextMenu);
    addAction(addFolderAction);
    connect(addFolderAction, SIGNAL(triggered()),this,SLOT(onAddFolderActionTree()));

    deleteAction = new QAction("Delete", contextMenu);
    addAction(deleteAction);
    connect(deleteAction, SIGNAL(triggered()),this,SLOT(onDeleteAction()));

    RenameAction = new QAction("Rename", contextMenu);
    addAction(RenameAction);
    connect(RenameAction, SIGNAL(triggered()),this,SLOT(onRenameAction()));

}

这个功能运行良好。当您在我的树形窗口小部件中选择文件或文件夹并右键单击时,将使用此上下文菜单。我的问题是,即使我选择了一个文件,我也会提出“添加文件夹”选项。您无法在文件内创建文件夹。

我想要的是当选择文件时禁用该选项,并在选择文件夹时启用它。

我可以通过获取我已重载的TreeWidgetItem类来知道它是文件还是文件夹:

谢谢


你是每次用户右键单击时都创建这个上下文菜单吗?还是只创建一次并重复使用? - Rolf Andreassen
2个回答

2
您可以禁用QAction。在这种情况下,“添加文件夹”菜单项将被禁用:
addFolderAction->setEnabled(false);

2

使用QAction::setEnabled(bool)方法来操作你的“addFolderAction”。

一个使用方法如下:

void
MyTreeWidget::updateMenuActions()
{
    if(!contextMenu)
        return;
    bool addFolderEnabled = <check TreeWidgetItem here to enable / disable>;
    addFolderAction->setEnabled(bEnabled);
}

在显示上下文菜单之前,请调用updateMenuActions()方法。
实际上,我更喜欢下面的代码,以防您有可能拥有指向操作的NULL指针的情况(例如您甚至没有添加它们的情况):
void
MyTreeWidget::updateMenuActions()
{
    if(!contextMenu)
        return;
    bool addFolderEnabled = <check TreeWidgetItem here to enable / disable>;
    updateAction(addFolderAction, bEditEnabled);
}

void
MyTreeWidget::updateAction(QAction* pAction, const bool& bEnabled)
{
    if(pAction)
        pAction->setEnabled(bEnabled);
}

享受吧。


我什么时候找到显示上下文菜单的请求?我只是在实例化MyTreeWidget类时调用createcontextmenu,然后Qt会自动处理它。 - Seb
1
啊,抱歉,我以为你已经做了那部分... 你需要在MyTreeWidget中重载'contextMenuEvent'方法: virtual void contextMenuEvent(QContextMenuEvent *event); 你可以在这里调用updateMenuActions方法,然后只需调用: QTreeWidget::contextMenuEvent(event); 就像以前一样显示菜单。 - Devan Williams
谢谢,已完成。我是在 MouseEvent 级别上实现的。如果不稳定,将转移到 contextMenuEvent 重载。 - Seb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接