我有一些附加到主菜单栏的全局菜单操作(下例中的“缩放”)。此外,我还附加了某些小部件的操作(下例中的“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)
有没有办法让集中的小部件窃取和使用快捷方式,无论是否存在另一个带有上下文的快捷方式WindowShortcut或ApplicationShortcut?
当然,可以在 中编写所有内容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)
希望这很清楚并对您有所帮助。亲切的问候!
| 归档时间: |
|
| 查看次数: |
2765 次 |
| 最近记录: |