当前位置: 代码迷 >> QT开发 >> Qt的inputpanel的退格键有关问题
  详细解决方案

Qt的inputpanel的退格键有关问题

热度:87   发布时间:2016-04-25 03:39:58.0
Qt的inputpanel的退格键问题
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就可以
  相关解决方案