【问题标题】:Qt shortcut for custom context menu自定义上下文菜单的 Qt 快捷方式
【发布时间】:2017-03-22 20:04:26
【问题描述】:

我一直在阅读一些示例和帖子,但我只是不知道如何为我的自定义上下文菜单添加快捷方式。我的 GUI 有几个元素。其中之一是树视图。对于我的 treeView 中的元素,我想要一个自定义上下文菜单。

我的第一个方法是根据本教程here。上下文菜单本身有效,但如果您在 show 函数中创建肌动蛋白,则快捷方式无法工作。 所以我的第二种方法是根据this教程。但是我的快捷方式仍然不起作用,如果我使用上下文菜单,所有操作都会被调用两次......

由于我没有找到与我的情况相匹配的教程或代码示例,我希望这里的人可以向我解释这在理论上是如何正确完成的。为自定义上下文菜单的操作添加快捷方式。

  1. 我必须在哪里声明我的行为?
  2. 动作的父级需要什么?
  3. 我需要在哪个小部件上调用 addAction?

感谢任何提示。

【问题讨论】:

  • 可能,带有快捷方式的(上下文菜单)操作也必须添加到树视图中。 (动作可能会添加到多个实例中。)否则,只要上下文菜单尚未打开(或什至创建),我就无法想象如何触发动作。
  • @Scheff 感谢您的提示,您完全正确!我还需要将操作添加到 treeView。在我查看的所有示例中都缺少这部分。

标签: qt contextmenu


【解决方案1】:

另一种方法是将您的操作也添加到父小部件(或主窗口小部件)。正如this reply 中提到的,将相同的操作添加到多个小部件很好,这是应该使用 QActions 的方式。

从 QTextBrowser 派生的自定义 HtmlBrowser 类的示例:

Ctrl+U 快捷键适用于此代码:

HtmlBrowser::HtmlBrowser(QWidget * parent) : QTextBrowser(parent)
{
    viewSourceAct = new QAction(tr("View/hide HTML so&urce"), this);
    viewSourceAct->setShortcut(tr("Ctrl+U"));
    viewSourceAct->setCheckable(true);
    parent->addAction(viewSourceAct);
    connect(viewSourceAct, &QAction::triggered, this, &HtmlBrowser::viewSourceToggle);
}

并且 Ctrl+U 快捷键不适用于此代码(与上面相同,但没有parent->AddAction(...)):

HtmlBrowser::HtmlBrowser(QWidget * parent) : QTextBrowser(parent)
{
    viewSourceAct = new QAction(tr("View/hide HTML so&urce"), this);
    viewSourceAct->setShortcut(tr("Ctrl+U"));
    viewSourceAct->setCheckable(true);
    connect(viewSourceAct, &QAction::triggered, this, &HtmlBrowser::viewSourceToggle);
}

奇怪的是,在这种情况下,父级是另一个小部件(选项卡小部件),而不是 MainWindow。尽管如此,添加parent->addAction() 还是有帮助的。而且,与您的 suggested answer 不同,即使将操作连接到简单的方法,它也可以工作,没有插槽。在 Qt 5.15.0 中为我工作。不过,不太清楚它为什么会起作用。也许,添加操作的小部件必须是永久的,快捷方式才能工作?看起来像 Qt 中的一个错误。

【讨论】:

    【解决方案2】:

    感谢 Scheff 的提示,我得到了它的工作。如果这真的是正确的方法,我现在不知道,但这对我有用。

    动作需要在你的 GUI 类的构造函数中声明(例如 MainWindow):

    actionDel = new QAction(tr("delete"), this);
    actionDel->setShortcut(QKeySequence(Qt::Key_Delete));
    connect(actionDel, SIGNAL(triggered()), this, SLOT(actionDel_triggered()));
    

    触发信号需要连接到插槽。提示:如果你创建槽不要使用on_ACTIONNAME_triggered,这会干扰设计器并导致连接错误。

    接下来将操作添加到自定义菜单

    fileContextMenu = new QMenu(this);
    fileContextMenu->addAction(actionDel);
    

    到小部件

    ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(ui->treeView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showDirContextMenu(QPoint)));
    ui->treeView->addAction(actionDel);
    

    全部在你的 GUI 类的构造函数中。

    要显示上下文菜单,请在上述连接中使用的插槽中使用以下代码:

    QModelIndex index=ui->treeView->indexAt(pos);
    
    // Here you can modify the menu e.g. disabling certain actions
    
    QAction* selectedItem = fileContextMenu->exec(ui->treeView->viewport()->mapToGlobal(pos));
    

    如果您没有操作槽,也可以在上下文菜单槽中处理该操作,但这不适用于快捷方式!

    if(selectedItem == actionOpen){
        on_treeView_doubleClicked(index);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多