我正在使用C ++ / Qt 5.5,在我的软件中,我希望Qt :: Key_Space触发菜单的打开,并使用相同的按钮触发相同菜单的关闭。问题是,如果我实现它:
this->button = new QPushButton();
this->button->setShortcut( QKeySequence( Qt::Key_Space ) );
connect(this->button, &QPushButton::clicked, this, &MenuClass::startMenuButtonClicked);
...
this->in_menu_button = new QPushButton();
this->in_menu_button->setShortcut( QKeySequence( Qt::Key_Space ) );
connect(this->in_menu_button, &QPushButton::clicked, this, &InTheMenuClass::startMenuButtonClicked);
如果我这样做,只有一种方式可以使用菜单。您对如何解决这个问题有任何想法吗?
答案 0 :(得分:1)
您只需创建一个按钮并为其指定快捷方式。然后根据菜单的状态(打开/关闭)在按钮的处理程序中执行相反的操作。
答案 1 :(得分:0)
我用状态机解决了它。我用2个状态创建了一个enumaration并创建了一个静态实例。
public:
enum STATE {MAIN_WINDOW, MENU};
static STATE state;
然后,我默认初始化它以具有MAIN_WINDOW状态。
MyClass::STATE MyClass::state = STATE::MAIN_WINDOW;
然后,我连接两个按钮的快捷方式的两个插槽,以调用相同的插槽,检查并设置当前状态。
QShortcut * shortcut = new QShortcut( QKeySequence( Qt::Key_Space ), back_to_main );
connect( shortcut, &QShortcut::activated, this, &MyClass::checkState);
QShortcut * shortcut = new QShortcut( QKeySequence( Qt::Key_Space ), go_to_menu );
connect( shortcut, &QShortcut::activated, this, &MyClass::checkState);
void MyClass::checkState()
{
if (MyClass::state == MyClass::MAIN_WINDOW )
{
MyClass::goToMenu();
MyClass::state = MyClass::STATE::MENU;
}
else if ( MyClass::state == MyClass::MENU )
{
MyClass::goBackToMain();
MyClass::state = MyClass::STATE::MAIN_APP;
}
}
* MyClass可以是任何类。