自定义上下文菜单的 Qt 快捷方式

Qt shortcut for custom context menu

我已经阅读了几个示例和 post,但我就是不知道如何向我的自定义上下文菜单添加快捷方式。我的 GUI 有几个元素。其中之一是 treeView。对于我的 treeView 中的元素,我想要一个自定义上下文菜单。

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

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

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

感谢任何提示。

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

需要在 GUI 的构造函数中声明操作 class(例如 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 的构造函数中 class。

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

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

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

自定义 HtmlBrowser class 派生自 QTextBrowser 的示例:

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

奇怪的是,本例中的 parent 是另一个小部件(选项卡小部件),而不是 MainWindow。尽管如此,添加 parent->addAction() 还是有帮助的。而且,与您的 不同,它甚至在将操作连接到简单方法时也能正常工作,没有插槽。在 Qt 5.15.0 中为我工作。不过,不太确定为什么会起作用。也许,添加操作的小部件必须是永久性的才能使快捷方式起作用?看起来像是 Qt 中的错误。