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

Tim*_*ann 5 qt shortcut

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

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

  • 如果textEdit2是焦点,它的动作应该消耗快捷方式(即zoom2()应该被触发)。
  • 否则,菜单快捷方式应该被激活,触发zoomGlobal()

下面的当前示例尚未运行:如果textEdit2获得焦点,Qt 会发出通知QAction::eventFilter: Ambiguous shortcut overload: 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);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法让集中的小部件窃取和使用快捷方式,无论是否存在另一个带有上下文的快捷方式WindowShortcutApplicationShortcut

当然,可以在 中编写所有内容zoomGlobal(),检查哪个小部件处于活动状态并委托其操作。但是,如果您有很多操作和小部件,那就相当麻烦了。我希望能够添加/删除/更改小部件,textEdit2而不需要调整zoomGlobal().

小智 2

我和你有同样的问题。为了解决这个问题,您可以在 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
Run Code Online (Sandbox Code Playgroud)

希望这很清楚并对您有所帮助。亲切的问候!