自定义上下文菜单的 Qt 快捷方式
Qt shortcut for custom context menu
我已经阅读了几个示例和 post,但我就是不知道如何向我的自定义上下文菜单添加快捷方式。我的 GUI 有几个元素。其中之一是 treeView。对于我的 treeView 中的元素,我想要一个自定义上下文菜单。
我的第一个方法是根据本教程 here。上下文菜单本身可以工作,但如果您在 show 函数中创建肌动蛋白,则快捷方式将无法工作。
所以我的第二种方法是根据 this 教程。但是我的快捷方式仍然不起作用,如果我使用上下文菜单,所有操作都会被调用两次...
由于我没有找到与我的情况相符的教程或代码示例,我希望这里有人可以向我解释这在理论上是如何正确完成的。为自定义上下文菜单添加操作快捷方式。
- 我必须在哪里声明我的行为?
- 什么需要成为动作的父级?
- 我需要在哪个小部件上调用 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 中的错误。
我已经阅读了几个示例和 post,但我就是不知道如何向我的自定义上下文菜单添加快捷方式。我的 GUI 有几个元素。其中之一是 treeView。对于我的 treeView 中的元素,我想要一个自定义上下文菜单。
我的第一个方法是根据本教程 here。上下文菜单本身可以工作,但如果您在 show 函数中创建肌动蛋白,则快捷方式将无法工作。 所以我的第二种方法是根据 this 教程。但是我的快捷方式仍然不起作用,如果我使用上下文菜单,所有操作都会被调用两次...
由于我没有找到与我的情况相符的教程或代码示例,我希望这里有人可以向我解释这在理论上是如何正确完成的。为自定义上下文菜单添加操作快捷方式。
- 我必须在哪里声明我的行为?
- 什么需要成为动作的父级?
- 我需要在哪个小部件上调用 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()
还是有帮助的。而且,与您的