Qt 向 QMainWindow 添加非菜单栏键盘快捷键
Posted
技术标签:
【中文标题】Qt 向 QMainWindow 添加非菜单栏键盘快捷键【英文标题】:Qt adding non-menubar keyboard shortcut to QMainWindow 【发布时间】:2014-11-22 06:26:56 【问题描述】:我有一个扩展 QMainWindow
的自定义小部件。我在菜单栏中添加了一些QAction
s,以及每个的键盘快捷键,它们工作正常。现在我想从菜单栏中删除其中一些操作,但我想保持启用快捷方式(用户可以从 帮助 对话框了解快捷方式的可用性)。所以首先我决定让这些动作不可见。
那没有用,所以我猜如果快捷方式必须工作,该操作就不会是不可见的。所以我将它添加到主窗口,但它们仍然无法正常工作。任何想法,我该如何让它工作?这是我的代码。方法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 添加非菜单栏键盘快捷键的主要内容,如果未能解决你的问题,请参考以下文章