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

时间:2017-09-10 10:07:48

标签: 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);
}

对于焦点窗口小部件是否有办法窃取和使用快捷方式,无论是否有其他带有上下文WindowShortcutApplicationShortcut 的短片?

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

1 个答案:

答案 0 :(得分:1)

我和你有同样的问题。要解决它,你可以在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

希望这一点很明确,对您有所帮助。亲切的问候!