我有一些全局菜单操作附加到主菜单栏("缩放"在下面的示例中)。此外,我还对某些小部件附加了操作(" 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);
}
对于焦点窗口小部件是否有办法窃取和使用快捷方式,无论是否有其他带有上下文WindowShortcut
或ApplicationShortcut
的短片?
当然,可以对zoomGlobal()
中的所有内容进行编码,检查哪个小部件处于活动状态并委托其操作。但是,如果您有许多操作和小部件,那将非常麻烦。我希望能够添加/删除/更改textEdit2
等小部件,而无需调整zoomGlobal()
中的代码。
答案 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
希望这一点很明确,对您有所帮助。亲切的问候!