Qt有提供自带的tool,叫inputpanel,我最近一个项目中把它修改成了可以英文+数字输入的。字符都可以,但是退格键怎么也弄不成功。
代码是这样的:
先设置property:
key_backspace->setProperty("buttonValue", QVariant(QChar(Qt::key_BackSpace)));
再设置mapper:
signalMapper.setMapping(key_backspace, key_backspace);
connect(key_backspace, SIGNAL(clicked()), &signalMapper, SLOT(map()));
再连接信号与槽
connect(inputPanel, SIGNAL(characterGenerated(QChar)), SLOT(sendCharacter(QChar)));
然后是槽函数,这个就是Qt 的inputpanel源码,路径在example/qt4.7/tools/inputpanel
void MyInputPanelContext::sendCharacter(QChar character)
{
QPointer<QWidget> w = focusWidget();
if (!w)
return;
QKeyEvent keyPress(QEvent::KeyPress, character.unicode(), Qt::NoModifier, QString(character));
PRINT2("keypress = %d\n", keyPress.key());
QApplication::sendEvent(w, &keyPress);
if (!w)
return;
QKeyEvent keyRelease(QEvent::KeyPress, character.unicode(), Qt::NoModifier, QString());
PRINT2("keyrelease = %d\n", keyRelease.key());
QApplication::sendEvent(w, &keyRelease);
}
退格键的键码是0x01000003,用QChar来传输好像有点问题,但是不这样,还有其他方法吗?
后来我找到一种比较笨的方法,可以解决这个问题,就是在上面的这个函数中再添加对退格键的特殊处理
if(character.toAscii() == 3) // backspace
{
QWSServer::sendKeyEvent(0x01000003,Qt::Key_Backspace,Qt::NoModifier,true,false);
}
这样也解决了,但是这个方法不好,请教高手门,还有没有更好的方法来解决这个问题。
------解决方案--------------------
Key_Backspace 是 0x01000003,需要32bit才能存储,用unsigned int就可以