Qt 向 QMainWindow 添加非菜单栏键盘快捷键

Posted

技术标签:

【中文标题】Qt 向 QMainWindow 添加非菜单栏键盘快捷键【英文标题】:Qt adding non-menubar keyboard shortcut to QMainWindow 【发布时间】:2014-11-22 06:26:56 【问题描述】:

我有一个扩展 QMainWindow 的自定义小部件。我在菜单栏中添加了一些QActions,以及每个的键盘快捷键,它们工作正常。现在我想从菜单栏中删除其中一些操作,但我想保持启用快捷方式(用户可以从 帮助 对话框了解快捷方式的可用性)。所以首先我决定让这些动作不可见。

那没有用,所以我猜如果快捷方式必须工作,该操作就不会是不可见的。所以我将它添加到主窗口,但它们仍然无法正常工作。任何想法,我该如何让它工作?这是我的代码。方法someMethod 中有任何需要发生的事情。

class MyWidget: public QMainWindow 
    public:
        MyWidget();

;

MyWidget::MyWidget() 
    QAction *myAct = new QAction(tr("&Some Text"), this);
    fNextmyActPageAct->setShortcut(QKeySequence(Qt::Key_Right));
    myAct->setVisible(false); //adding this does not work
    connect(myAct, SIGNAL(triggered()), this, SLOT(someMethod()));

    ...

    QMenu *someMenu = menuBar()->addMenu(tr("&Some Menu"));
    someMenu->addAction(myAct); //this works, the option shows up in the menu 'Some Menu' and the shortcut works
    this->addAction(myAct); //does not work


【问题讨论】:

【参考方案1】:

我测试了这段代码,它工作正常:

QAction* myAct = new QAction(this);
myAct->setShortcut(Qt::Key_Right);
connect(myAct, SIGNAL(triggered()), this, SLOT(someMethod()));
this->addAction(myAct);

不要将QAction 添加到您的菜单栏。

【讨论】:

嗯,不,它不起作用。而且我没想到,你做的和我没什么不同。 我测试了这段代码,我确信这样可以正常工作。仅在新项目中使用这 4 行进行测试。 我用过这个。你和我的代码唯一的区别是你没有在初始化时添加文本,而是直接使用了快捷方式而不是用QkeySequence包裹它。两者都不应该有任何区别。我还是试过了,还是不行。 没有代码没有明确地将焦点设置在小部件上,我在单击小部件后尝试使用快捷方式。所以点击应该自然地将焦点转移到小部件上,仍然不起作用。 @Cupidvogel 对不起,但我不得不问:您是否将 someMethod() 定义为公共 SLOT?【参考方案2】:

您可以使用QShortcut 并将密钥、目标小部件和相关插槽作为参数传递给它的构造函数。把这个放在MyWidget的构造函数中:

QShortcut * shortcut = new QShortcut(QKeySequence(Qt::Key_Right),this,SLOT(someMethod()));
shortcut->setAutoRepeat(false);

【讨论】:

这对我有用。可能是因为您也使用相同的键进行操作。尝试更改键以查看是否有效或删除该操作的快捷键。 不,完全注释掉了动作部分,仍然无法正常工作。我被诅咒了.. :( 您的小部件应该集中在快捷方式上以执行操作。按键时你的小部件有焦点吗? 我还没有编写任何代码来在显式单击时将焦点设置在小部件上。我需要这样做吗?我认为单击小部件会自动将焦点设置在小部件上。那我该怎么做呢? 如果你点击小部件,它就会获得焦点。

以上是关于Qt 向 QMainWindow 添加非菜单栏键盘快捷键的主要内容,如果未能解决你的问题,请参考以下文章

Qt中的主窗口之菜单栏

QT_4-QMainWindow

Qt - 从 QMainWindow 向 GLWidget 发送按键事件

Qt学习三 - 菜单栏工具栏状态栏

qt状态栏label固定

Qt:为啥在 QMainWindow 中添加状态栏会影响大小调整?