Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt-如何为菜单和小部件中的操作设置快捷上下文_Qt_Shortcut - Fatal编程技术网

Qt-如何为菜单和小部件中的操作设置快捷上下文

Qt-如何为菜单和小部件中的操作设置快捷上下文,qt,shortcut,Qt,Shortcut,我有一些全局菜单操作附在主菜单栏上(以下示例中的“缩放”)。此外,我还将动作附加到某些小部件上(以下示例中的“Zoom2”) 我想对这两个操作使用相同的快捷方式。它应该是这样工作的: 如果聚焦了textEdit2,则其操作应使用快捷方式(即应触发zoom2()) 否则,菜单快捷方式应处于活动状态,触发zoomGlobal() 下面的当前示例还不起作用:如果聚焦了textEdit2,Qt通知QAction::eventFilter:不明确的快捷方式重载:Ctrl++,但不执行任何操作 Main

我有一些全局菜单操作附在主菜单栏上(以下示例中的“缩放”)。此外,我还将动作附加到某些小部件上(以下示例中的“Zoom2”)

我想对这两个操作使用相同的快捷方式。它应该是这样工作的:

  • 如果聚焦了
    textEdit2
    ,则其操作应使用快捷方式(即应触发
    zoom2()
  • 否则,菜单快捷方式应处于活动状态,触发
    zoomGlobal()
下面的当前示例还不起作用:如果聚焦了
textEdit2
,Qt通知
QAction::eventFilter:不明确的快捷方式重载:Ctrl++
,但不执行任何操作

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QAction *act = menuBar()->addAction("Zoom");
    act->setShortcut(QKeySequence("Ctrl++"));
    connect(act, SIGNAL(triggered(bool)), this, SLOT(zoomGlobal()));

    setCentralWidget(new QWidget());
    QVBoxLayout *layout = new QVBoxLayout();
    centralWidget()->setLayout(layout);
    QTextEdit *textEdit1 = new QTextEdit();
    layout->addWidget(textEdit1);

    QTextEdit *textEdit2 = new QTextEdit();
    layout->addWidget(textEdit2);
    act = new QAction("Zoom2");
    act->setShortcut(QKeySequence("Ctrl++"));
    act->setShortcutContext(Qt::WidgetShortcut);
    connect(act, SIGNAL(triggered(bool)), this, SLOT(zoom2()));
    textEdit2->addAction(act);
}
无论是否有另一个shorcut与context
WindowShortcut
ApplicationShortcut
,聚焦小部件都有办法窃取并使用快捷方式吗


当然,可以在
zoomGlobal()
中对所有内容进行编码,检查哪个小部件处于活动状态,并委托给它执行操作。但是,如果您有许多操作和小部件,那么这将非常麻烦。我希望能够添加/删除/更改诸如
textededit2
之类的小部件,而无需在
zoomGlobal()

中调整代码。我遇到了与您相同的问题。为了解决这个问题,您在QShortcut类中使用了一个技巧

在示例代码中,您希望“textEdit2”在具有焦点时窃取全局快捷方式。这段代码应该可以做到这一点,它适合我:

QTextEdit* textEdit2 = new QTextEdit();
layout->addWidget(textEdit2);
QShortcut* shortcutStealer = new QShortcut(
    QKeySequence("Ctrl++"),  //the key sequence to steal
    textEdit2,               //the shortcut's parent
    SLOT(zoom2()),           //triggered when shortcut activated
    SLOT(zoom2()),           //triggered when shortcut ambiguously activated! 
    Qt::WidgetShortcut);     //context of shortcut

希望这是明确的,并帮助你。亲切的问候

经过两个多小时的搜索和尝试,我完全不知道如何在没有全局检查的情况下完成。在全局快捷方式事件期间,必须检查
textededit2
是否处于活动状态。这还不错,因为你的程序当然不会有很多这样的对,而且检查很简单)@VladimirBershov:谢谢你的工作。其实,以上只是一个很小的例子。实际的程序有几个小部件,如
textededit2
,每个小部件都有多个(和不同的)快捷方式。我不能认真介绍全局检查。如果有什么不同的话,我们必须围绕这一点编写一个框架。所有小部件和操作都必须在那里注册,并且框架必须委托。但我希望有另一种方法。请注意,这是一个奇怪的例子。我对你的主要项目一无所知,但这种代码的平静看起来很糟糕——没有信息的变量名,它们只在数字上有所不同,在代码中创建UI元素,奇怪的一行
setCentralWidget(newQWidget())。全局检查不是问题,它可以像其他任何东西一样封装在一个类中。这实际上只是一个测试的最小示例(您可以创建一个项目并粘贴上面的代码作为工作示例)。您可以将其视为代码编辑器
textEdit1
和其他相关小部件
textEdit2
。“在代码中创建UI元素”:我觉得这没什么错。“奇怪的行setCentralWidget(新的QWidget());”:这只是一个可以设置布局的容器。“全局[…]可以封装在一个类中”:这就是我所说的框架。我感觉到了你们的痛苦,我也有这个问题。当然,必须执行全局ckecks是可能的,但是在您的情况下,在一个具有大量小部件/快捷方式的实际应用程序中,需要一个相当大的框架。真不明白,关于这件事的报道太少了!