Qt4 inputpanel 升级改造

本文介绍如何将Qt4的inputpanel例程从数字键盘改造为支持英文字符输入的键盘,并改进了特殊按键处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 背景

    Qt4源码中提供了一个inputpanel例程,包含了一个数字虚拟键盘,如下图所示。本文的目的在于将其改造成支持英文字符输入的键盘。


                        图1 inputpanel效果图

2 添加按键

    由图1可见,inputpannel只有数字键,因为我们需要添加英文字母按键。通过查看属性发现,图1中的数字键都是使用QPushButton来创建,因此我们也使用它来实现英文字符键。这里以a键为例进行说明。a键的QPushButton对象名设置为panelButton_a

    需要注意的是,panelButton_afocusPolicy属性默认为StrongFocus,这里要将其改为NoFocus,否则键盘不能正常弹出。


                   图2.1 QPushButton focusPolicy设置

2.1 信号设置

[cpp]  view plain copy
  1. signalMapper.setMapping(form.panelButton_a, form.panelButton_a);  
  2. connect(form.panelButton_a, SIGNAL(clicked()),  
  3.             &signalMapper, SLOT(map()));  

3 键字值读取方式

3.1 inputpanel默认方式——动态属性

    inputpanel默认获取按键对应字符的方式是获取按键的动态属性buttonValue。这个属性默认并不存在,需要程序员手动添加。选中QPushButton,然后在属性编辑栏点击“+”键创建动态属性,属性类型选择“其它”(如图3.1)然后在弹出来的图3.2中详细设置。

                            

                                                     图3.1 添加动态属性

                    

                                             图3.2 动态属性设置

    接下来就是设置具体的属性值。对按键a,应该将其值设置为a,如下图:

                  

                                           图3.3 动态属性值

    获取按键buttonValue属性代码如下所示:

[cpp]  view plain copy
  1. void MyInputPanel::buttonClicked(QWidget *w)  
  2. {  
  3.     QChar chr = qvariant_cast<QChar>(w->property("buttonValue"));  
  4.     emit characterGenerated(chr);  
  5. }  

3.2 我修改的方式——QPushButton::text()

    上述方式只适用于可打印字符,然而在键盘中还有其它控制字符是不可打印的。同时,在大小写之间进行切换时需要同时修改buttonValue值,非常不方便。这里,我将其改为直接读取QPushButton的text值。代码如下所示:

[cpp]  view plain copy
  1. QString str = ((QPushButton*)w)->text();  
  2. QChar chr = str.at[0];  

4 特殊按键处理

    这里以Backspace键为例进行说明。

    要删除前一个字符《Qt Virtual Keyboard》2.3小节介绍的widgetKeyboard中使用的方法是先将QLineEdit中的内容读到一个临时的QString变量中,然后删除这个临时变量的最后一个字符,最后将这个处理过的变量setText到QLineEdit上。这种方法的效率是很低的。

    这里,将采用一种新的方法:触发一个Backspace按键事件即可!为了达到这个目的,需要对inputpanel的下面函数进行修改:

[cpp]  view plain copy
  1. void MyInputPanelContext::sendCharacter(QChar character);  
  2. void MyInputPanel::characterGenerated(QChar character);  

    主要就是将上述函数的参数类型都改为int,如下所示:

[cpp]  view plain copy
  1. void MyInputPanel::characterGenerated(int key); // key接受参数为字符的unicode码  
[cpp]  view plain copy
  1. void MyInputPanelContext::sendCharacter(int key)  
  2. {  
  3.     QPointer<QWidget> w = focusWidget();  
  4.   
  5.   
  6.     if (!w)  
  7.         return;  
  8.   
  9.     QKeyEvent keyPress(QEvent::KeyPress, key, Qt::NoModifier, QString(key));  
  10.     QApplication::sendEvent(w, &keyPress);  
  11. }  

    修改了上述信号和槽,同时也需要修改连接方式:

[cpp]  view plain copy
  1. connect(inputPanel, SIGNAL(characterGenerated(int)), SLOT(sendCharacter(int)));  

   为了对Backspace键进行特殊处理,修改buttonClicked()函数如下:

[cpp]  view plain copy
  1. void MyInputPanel::buttonClicked(QWidget *w)  
  2. {  
  3.     int key;  
  4.     QString str = ((QPushButton*)w)->text();  
  5.     if (str == "Backspace") {  
  6.         key = Qt::Key_Backspace;  
  7.   
  8.     }  
  9.     else {  
  10.         QChar chr = ((QPushButton*)w)->text().at(0);  
  11.         key = chr.unicode();  
  12.     }  
  13.   
  14.     emit characterGenerated(key);  
  15. }  

5 效果及源码

    最后效果如下图:


    源码:点击这里下载。

参考资料

[1]QT 软键盘

[2]Catching bacspace press event on QT




FROM: http://blog.youkuaiyun.com/q1302182594/article/details/48847311

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值