【问题标题】:qt/c++ context menu - disable an itemqt/c++ 上下文菜单 - 禁用项目
【发布时间】:2015-05-05 16:33:56
【问题描述】:

我目前正在开发一个应用程序,例如使用 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 类来知道它是文件还是文件夹:

谢谢

【问题讨论】:

  • 您是否在每次用户右键单击时都创建新的上下文菜单?还是创建一次后重复使用?

标签: c++ qt qtreewidget


【解决方案1】:

您可以禁用 QAction。在这种情况下,“添加文件夹”菜单项将被禁用:

addFolderAction->setEnabled(false);

【讨论】:

    【解决方案2】:

    在“addFolderAction”上使用 QAction::setEnabled(bool) 方法。

    一种使用方式是这样的:

    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 类并在 Qt 自动处理它之后调用 createcontextmenu
    • 啊,对不起,我以为你有那个部分......你需要在 MyTreeWidget 中重载'contextMenuEvent': virtual void contextMenuEvent(QContextMenuEvent *event);您可以在那里调用 updateMenuActions 方法,然后只需调用: QTreeWidget::contextMenuEvent(event);像以前一样显示菜单。
    • 感谢它完成了。我在 MouseEvent 级别制作。万一它不稳定会继续 contextMenuEvent 重载
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多