【发布时间】:2018-08-13 20:47:58
【问题描述】:
我有一个带有相关菜单的工具按钮。
m_mainMenuButton = new ToolButton("menu.png", tr("Open menu"));
m_mainMenuButton->setMenu(m_mainMenu);
m_mainMenuButton->setPopupMode(QToolButton::InstantPopup);
我希望在用户按下并释放 Alt 时显示此菜单。这样,普通的QMenuBar 就会在 Windows 上被激活(我想要这个工具按钮而不是 QMenuBar)。我试过这个:
m_mainMenuButton->setShortcut(QKeySequence(Qt::Key_Alt));
但是当按下并释放 Alt 时它不显示菜单。或者这样:
auto shortcut = new QShortcut(QKeySequence(Qt::Key_Alt), this);
connect(shortcut, &QShortcut::activated, m_mainMenuButton, &QToolButton::showMenu);
它也没有做任何事情。我试图覆盖按键和释放事件,但后来我发现它会干扰其他使用 Alt 键作为修饰符的快捷键,例如“Alt+Left”。
任何想法如何做到这一点?
更新一个最小的例子,它表明 Alt 不能用作快捷方式。
#include <QAction>
#include <QApplication>
#include <QLabel>
#include <QMainWindow>
#include <QMenu>
#include <QShortcut>
#include <QToolButton>
#include <QVBoxLayout>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMainWindow w;
auto label = new QLabel();
auto menu = new QMenu(&w);
// intentionally added a shortcut which contains Alt as modifier to test it does not interfere with the menu
menu->addAction("Action", [label]{ label->setText("Trigered!"); }, QKeySequence("Alt+Left"));
auto btn = new QToolButton();
btn->setMenu(menu);
btn->setPopupMode(QToolButton::InstantPopup);
// the following lines do not have any effect, the menu is not shown when Alt is pressed and released
auto shortcut = new QShortcut(QKeySequence(Qt::Key_Alt), &w);
QObject::connect(shortcut, &QShortcut::activated, btn, &QToolButton::showMenu);
auto container = new QWidget();
auto layout = new QVBoxLayout(container);
layout->addWidget(btn);
layout->addWidget(label);
w.setCentralWidget(container);
w.show();
return a.exec();
}
【问题讨论】:
-
什么是
this? -
this在我的例子中是主窗口,它被设置为快捷方式的父窗口。没关系,也可以是按钮。 -
@eyllanesc 我更新了问题并添加了一个示例。
-
我怀疑 ALT 作为修饰符不是有效的快捷方式,因为到目前为止我已经尝试过有效的快捷方式是 MODIFIER + KEY 或只是 KEY。