我已经重载了QKeySequenceEdit类,并且重写了keyPressEvent函数进行只接收一组按键,记得默认是能接收四组。
但目前还有一个问题,我这边允许设置SHIFT、CTRL、ALT等单独的系统按键,发现默认这个控件按下SHIFT后还在等待接收,一旦结束会认为是一种取消的情况。
请问如何对这种单独的键进行设置?
当前尝试了如下接收SHIFT的情况并设置,但发现设置也是无效:
if(pEvent) {
if(pEvent->key() == 16777248) {
QKeySequence seq(QKeySequence::fromString("SHIFT"));
setKeySequence(seq);
}
}
已经解决了,还是放弃继承QKeySequenceEdit了,改用继承QLineEdit并对keyPressEvent进行修改,直接根据自己需求进行修改了。
大致修改如下,还在根据情况进行修改:
void ShortcutKeyEdit::keyPressEvent(QKeyEvent *e)
{
int uKey = e->key();
Qt::Key key = static_cast<Qt::Key>(uKey);
if (key == Qt::Key_unknown) {
return;
}
// 部分单独的系统按键直接返回
if(key == Qt::Key_CapsLock
|| key == Qt::Key_Escape) {
return ;
}
// 判断是否为单个组合键
if (key == Qt::Key_Control
|| key == Qt::Key_Shift
|| key == Qt::Key_Alt
|| key == Qt::Key_Enter
|| key == Qt::Key_Return
|| key == Qt::Key_Tab
|| key == Qt::Key_Space)
{
switch(key) {
case Qt::Key_Control:
setText("CTRL");
break;
case Qt::Key_Shift:
setText("SHIFT");
break;
case Qt::Key_Alt:
setText("ALT");
break;
case Qt::Key_Enter:
setText("ENTER");
break;
case Qt::Key_Return:
setText("RETURN");
break;
case Qt::Key_Tab:
setText("TAB");
break;
case Qt::Key_Space:
setText("SPACE");
break;
default:
break;
}
m_key = key;
return ;
}
// 确定是否为组合键
bool bModifiers = false;
Qt::KeyboardModifiers modifiers = e->modifiers();
if (modifiers & Qt::ShiftModifier) {
uKey += Qt::SHIFT;
bModifiers = true;
return;
}
else if (modifiers & Qt::ControlModifier) {
uKey += Qt::CTRL;
bModifiers = true;
}
else if (modifiers & Qt::AltModifier) {
uKey += Qt::ALT;
bModifiers = true;
}
// 处理单个数字、字母的情况
bool bNum = (e->key() >= Qt::Key_0 && e->key() <= Qt::Key_9);
bool bChar = (e->key() >= Qt::Key_A && e->key() <= Qt::Key_Z);
if ((bNum || bChar) && !bModifiers) {
QString strKey = QKeySequence(uKey).toString();
strKey = strKey.toLower();
setText(strKey);
m_key = key;
return ;
}
// 其他按键的情况
setText(QKeySequence(uKey).toString());
m_key = key;
}