之前做好的功能,按下键盘上对应的按键就能触发绑定按钮的点击事件。但是在优化按钮样式的时候,不在UI界面中采用拖拽的方式,而是选择用代码创建按钮,但是创建好,并且设置好样式之后,快捷键也失效了,怎么点击都不再触发,找了几个小时,终于找到问题;
快捷键设置方式:
首先先来盘一下快捷键的设置方式;
第一种方法:
对于直接在UI界面中创建的按钮,在右下侧的属性栏可以直接设置快捷键,shortcut点击一下再设置相应的按钮即可,另外autoRepeat也是一个常用的属性,它的作用是按键按下会连续的发送点击信号,autoReapeatDelay和autoRepeatInterval分别设置发送延迟和发送间隔;
第二种方法:
对于使用纯代码创建的按钮,可以用setShortcut这个函数直接绑定相应的按键,同样它也有对应的接口setShortcutAutoReapeat可以设置autoReapeat这个属性,简单示例如下:
btn_front->setShortcut(QKeySequence(Qt::Key_W));//绑定热键
btn_back->setShortcut(QKeySequence(Qt::Key_S));
btn_left->setShortcut(QKeySequence(Qt::Key_A));
btn_right->setShortcut(QKeySequence(Qt::Key_D));
btn_stop->setShortcut(Qt::Key_Q);
btn_stop->setShortcutAutoRepeat(true);//设置autoReapeat属性
btn_front->setShortcutAutoRepeat(true);
btn_back->setShortcutAutoRepeat(true);
btn_left->setShortcutAutoRepeat(true);
btn_right->setShortcutAutoRepeat(true);
创建方式如上;
问题解决办法:
经过几个小时的刨根问底,我代码中快捷键失效的原因在于,过早地设置了快捷键,可能在潜意识中把它当成了一个属性,在设置大小,位置的时候一并设置了快捷键,所以导致快捷键失效;
最后的解决办法是将这几行代码放在按钮设置的最后,亲测有效,最后贴上代码:
void MainWindow::initBtn()
{
btn_stop = new QPushButton(this);
btn_front = new QPushButton(this);
btn_back = new QPushButton(this);
btn_left = new QPushButton(this);
btn_right = new QPushButton(this);
btn_front->setFixedSize(120,30);
btn_back->setFixedSize(120,30);
btn_left->setFixedSize(30,60);
btn_right->setFixedSize(30,60);
btn_stop->setFixedSize(50,50);
btn_front->setText("︿");
btn_back->setText("﹀");
btn_left->setText("〈");
btn_right->setText("〉");
btn_stop->setText("停止");
btn_front->move(550,48);
btn_back->move(550,148);
btn_left->move(550,83);
btn_right->move(640,83);
btn_stop->move(585,88);
btn_front->setStyleSheet("QPushButton{background-color: rgb(225, 225, 225);border:2px groove gray;border-radius:10px;padding:2px 4px;border-style: outset;}"
"QPushButton:hover{background-color:rgb(229, 241, 251); color: black;}"
"QPushButton:pressed{background-color:rgb(204, 228, 247);border-style: inset;}");
btn_back->setStyleSheet("QPushButton{background-color: rgb(225, 225, 225);border:2px groove gray;border-radius:10px;padding:2px 4px;border-style: outset;}"
"QPushButton:hover{background-color:rgb(229, 241, 251); color: black;}"
"QPushButton:pressed{background-color:rgb(204, 228, 247);border-style: inset;}");
btn_left->setStyleSheet("QPushButton{background-color: rgb(225, 225, 225);border:2px groove gray;border-radius:10px;padding:2px 4px;border-style: outset;}"
"QPushButton:hover{background-color:rgb(229, 241, 251); color: black;}"
"QPushButton:pressed{background-color:rgb(204, 228, 247);border-style: inset;}");
btn_right->setStyleSheet("QPushButton{background-color: rgb(225, 225, 225);border:2px groove gray;border-radius:10px;padding:2px 4px;border-style: outset;}"
"QPushButton:hover{background-color:rgb(229, 241, 251); color: black;}"
"QPushButton:pressed{background-color:rgb(204, 228, 247);border-style: inset;}");
btn_stop->setStyleSheet("QPushButton{background-color: rgb(225, 225, 225);border:2px groove gray;border-radius:10px;padding:2px 4px;border-style: outset;}"
"QPushButton:hover{background-color:rgb(229, 241, 251); color: black;}"
"QPushButton:pressed{background-color:rgb(204, 228, 247);border-style: inset;}");
ui->btn_ok->setStyleSheet("QPushButton{background-color: rgb(225, 225, 225);border:2px groove gray;border-radius:10px;padding:1px 2px;border-style: outset;}"
"QPushButton:hover{background-color:rgb(229, 241, 251); color: black;}"
"QPushButton:pressed{background-color:rgb(204, 228, 247);border-style: inset;}");
ui->btn_ok_2->setStyleSheet("QPushButton{background-color: rgb(225, 225, 225);border:2px groove gray;border-radius:10px;padding:1px 2px;border-style: outset;}"
"QPushButton:hover{background-color:rgb(229, 241, 251); color: black;}"
"QPushButton:pressed{background-color:rgb(204, 228, 247);border-style: inset;}");
btn_front->setShortcut(QKeySequence(Qt::Key_W));
btn_back->setShortcut(QKeySequence(Qt::Key_S));
btn_left->setShortcut(QKeySequence(Qt::Key_A));
btn_right->setShortcut(QKeySequence(Qt::Key_D));
btn_stop->setShortcut(Qt::Key_Q);
btn_stop->setShortcutAutoRepeat(true);
btn_front->setShortcutAutoRepeat(true);
btn_back->setShortcutAutoRepeat(true);
btn_left->setShortcutAutoRepeat(true);
btn_right->setShortcutAutoRepeat(true);
}