Qt的inputpanel的退格键问题

Xiamenguoke 2012-10-17 10:28:50
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);
}
这样也解决了,但是这个方法不好,请教高手门,还有没有更好的方法来解决这个问题。
...全文
732 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
勤为本 2014-11-03
  • 打赏
  • 举报
回复
上一贴本来是想把”第二个QKeyEvent的第一个参数改为QEvent::KeyRelease“这几个字标红加粗,结果整成这样。真实原文如下 把void MyInputPanelContext::sendCharacter(quint32 character)中第二个QKeyEvent的第一个参数改为QEvent::KeyRelease。 QT官方的例子是模拟了两个QEvent::KeyPress,注意区别。
勤为本 2014-11-03
  • 打赏
  • 举报
回复
我找到解决9楼问题(按一次Backspace退格键删除两个字符)的办法了。 解决办法是 把void MyInputPanelContext::sendCharacter(quint32 character)中[color=#FF0000]第二个QKeyEvent的第一个参数改为QEvent::KeyRelease[/color]。 我想大家已经看出问题的原因了,就是程序中模拟了两次按键被按下的操作,所以会删除两个字符,为什么按其它普通的字符按键不会输入两个相同的字符呢?我想是qt自身过滤了。
sddzycnqjn 2013-09-15
  • 打赏
  • 举报
回复
http://stackoverflow.com/questions/17621741/implementing-backspace-and-enter-keys-on-a-qt-virtual-keyboard
jim166783 2013-02-10
  • 打赏
  • 举报
回复
Key_Backspace 是 0x01000003,需要32bit才能存储,用unsigned int就可以
jim166783 2013-02-10
  • 打赏
  • 举报
回复
The QChar class provides a 16-bit Unicode character. 把inputpannel里面的characterGenerated(QChar),改为characterGenerated(unsigned int),一路都要改掉 现在试了Key_Backspace可以发出来,但是会发2次,正在解决
Xiamenguoke 2013-01-10
  • 打赏
  • 举报
回复
试的结果怎么样?
king_of_folk 2013-01-03
  • 打赏
  • 举报
回复
那意思是使用arm编译链工具可以吗?我来试试
Xiamenguoke 2013-01-03
  • 打赏
  • 举报
回复
我的另外一个同事也遇到了这个问题,我和他探讨了很久,把自己的工程文件和头文件都给他了都未能解决。 后来我想到了,我用的是嵌入式embeded qt。QWS server是为嵌入式QT专门写的类,在非嵌入式平台可能不能使用。
pengyingfan 2012-12-31
  • 打赏
  • 举报
回复
我也遇到了楼上这种情况,不知道是什么原因呢?
king_of_folk 2012-12-28
  • 打赏
  • 举报
回复
请问,为什么我按照你的方法会出现 undefined reference to `_imp___ZN9QWSServer12sendKeyEventEii6QFlagsIN2Qt16KeyboardModifierEEbb' 这样的错误呢? 希望可以得到你的回复!
Xiamenguoke 2012-12-17
  • 打赏
  • 举报
回复
目前还没找到好的办法
Xiamenguoke 2012-12-17
  • 打赏
  • 举报
回复
#include <QWSServer>
neu_zjujunge 2012-11-22
  • 打赏
  • 举报
回复
请问你用的QWSServer这个函数在哪个头文件里,你有没有找到别的好方法啊

16,203

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧