自定义上下文菜单

时间:2017-03-22 20:04:27

标签: qt contextmenu

我一直在阅读几个例子并发帖但我无法弄清楚如何在自定义上下文菜单中添加快捷方式。我的GUI有几个元素。其中一个是treeView。对于我的treeView中的元素,我想要一个自定义上下文菜单。

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

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

  1. 我必须在哪里宣布我的行动?
  2. 什么需要成为行动的父母?
  3. 我需要在哪个小部件上调用addAction?
  4. 感谢任何提示。

2 个答案:

答案 0 :(得分:1)

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

具有从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);
}

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

答案 1 :(得分:0)

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