Qt4 inputpanel 升级改造
2016-01-11 17:26
543 查看
1 背景
Qt4源码中提供了一个inputpanel例程,包含了一个数字虚拟键盘,如下图所示。本文的目的在于将其改造成支持英文字符输入的键盘。
图1 inputpanel效果图
2 添加按键
由图1可见,inputpannel只有数字键,因为我们需要添加英文字母按键。通过查看属性发现,图1中的数字键都是使用QPushButton来创建,因此我们也使用它来实现英文字符键。这里以a键为例进行说明。a键的QPushButton对象名设置为panelButton_a。
需要注意的是,panelButton_a的focusPolicy属性默认为StrongFocus,这里要将其改为NoFocus,否则键盘不能正常弹出。
图2.1 QPushButton focusPolicy设置
2.1 信号设置
[cpp] view
plaincopy
signalMapper.setMapping(form.panelButton_a, form.panelButton_a);
connect(form.panelButton_a, SIGNAL(clicked()),
&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
plaincopy
void MyInputPanel::buttonClicked(QWidget *w)
{
QChar chr = qvariant_cast<QChar>(w->property("buttonValue"));
emit characterGenerated(chr);
}
3.2 我修改的方式——QPushButton::text()
上述方式只适用于可打印字符,然而在键盘中还有其它控制字符是不可打印的。同时,在大小写之间进行切换时需要同时修改buttonValue值,非常不方便。这里,我将其改为直接读取QPushButton的text值。代码如下所示:
[cpp] view
plaincopy
QString str = ((QPushButton*)w)->text();
QChar chr = str.at[0];
4 特殊按键处理
这里以Backspace键为例进行说明。
要删除前一个字符《Qt Virtual Keyboard》2.3小节介绍的widgetKeyboard中使用的方法是先将QLineEdit中的内容读到一个临时的QString变量中,然后删除这个临时变量的最后一个字符,最后将这个处理过的变量setText到QLineEdit上。这种方法的效率是很低的。
这里,将采用一种新的方法:触发一个Backspace按键事件即可!为了达到这个目的,需要对inputpanel的下面函数进行修改:
[cpp] view
plaincopy
void MyInputPanelContext::sendCharacter(QChar character);
void MyInputPanel::characterGenerated(QChar character);
主要就是将上述函数的参数类型都改为int,如下所示:
[cpp] view
plaincopy
void MyInputPanel::characterGenerated(int key); // key接受参数为字符的unicode码
[cpp] view
plaincopy
void MyInputPanelContext::sendCharacter(int key)
{
QPointer<QWidget> w = focusWidget();
if (!w)
return;
QKeyEvent keyPress(QEvent::KeyPress, key, Qt::NoModifier, QString(key));
QApplication::sendEvent(w, &keyPress);
}
修改了上述信号和槽,同时也需要修改连接方式:
[cpp] view
plaincopy
connect(inputPanel, SIGNAL(characterGenerated(int)), SLOT(sendCharacter(int)));
为了对Backspace键进行特殊处理,修改buttonClicked()函数如下:
[cpp] view
plaincopy
void MyInputPanel::buttonClicked(QWidget *w)
{
int key;
QString str = ((QPushButton*)w)->text();
if (str == "Backspace") {
key = Qt::Key_Backspace;
}
else {
QChar chr = ((QPushButton*)w)->text().at(0);
key = chr.unicode();
}
emit characterGenerated(key);
}
5 效果及源码
最后效果如下图:
源码:点击这里下载。
参考资料
[1]QT 软键盘
[2]Catching bacspace press event on QT
FROM: http://blog.csdn.net/q1302182594/article/details/48847311
Qt4源码中提供了一个inputpanel例程,包含了一个数字虚拟键盘,如下图所示。本文的目的在于将其改造成支持英文字符输入的键盘。
图1 inputpanel效果图
2 添加按键
由图1可见,inputpannel只有数字键,因为我们需要添加英文字母按键。通过查看属性发现,图1中的数字键都是使用QPushButton来创建,因此我们也使用它来实现英文字符键。这里以a键为例进行说明。a键的QPushButton对象名设置为panelButton_a。
需要注意的是,panelButton_a的focusPolicy属性默认为StrongFocus,这里要将其改为NoFocus,否则键盘不能正常弹出。
图2.1 QPushButton focusPolicy设置
2.1 信号设置
[cpp] view
plaincopy
signalMapper.setMapping(form.panelButton_a, form.panelButton_a);
connect(form.panelButton_a, SIGNAL(clicked()),
&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
plaincopy
void MyInputPanel::buttonClicked(QWidget *w)
{
QChar chr = qvariant_cast<QChar>(w->property("buttonValue"));
emit characterGenerated(chr);
}
3.2 我修改的方式——QPushButton::text()
上述方式只适用于可打印字符,然而在键盘中还有其它控制字符是不可打印的。同时,在大小写之间进行切换时需要同时修改buttonValue值,非常不方便。这里,我将其改为直接读取QPushButton的text值。代码如下所示:
[cpp] view
plaincopy
QString str = ((QPushButton*)w)->text();
QChar chr = str.at[0];
4 特殊按键处理
这里以Backspace键为例进行说明。
要删除前一个字符《Qt Virtual Keyboard》2.3小节介绍的widgetKeyboard中使用的方法是先将QLineEdit中的内容读到一个临时的QString变量中,然后删除这个临时变量的最后一个字符,最后将这个处理过的变量setText到QLineEdit上。这种方法的效率是很低的。
这里,将采用一种新的方法:触发一个Backspace按键事件即可!为了达到这个目的,需要对inputpanel的下面函数进行修改:
[cpp] view
plaincopy
void MyInputPanelContext::sendCharacter(QChar character);
void MyInputPanel::characterGenerated(QChar character);
主要就是将上述函数的参数类型都改为int,如下所示:
[cpp] view
plaincopy
void MyInputPanel::characterGenerated(int key); // key接受参数为字符的unicode码
[cpp] view
plaincopy
void MyInputPanelContext::sendCharacter(int key)
{
QPointer<QWidget> w = focusWidget();
if (!w)
return;
QKeyEvent keyPress(QEvent::KeyPress, key, Qt::NoModifier, QString(key));
QApplication::sendEvent(w, &keyPress);
}
修改了上述信号和槽,同时也需要修改连接方式:
[cpp] view
plaincopy
connect(inputPanel, SIGNAL(characterGenerated(int)), SLOT(sendCharacter(int)));
为了对Backspace键进行特殊处理,修改buttonClicked()函数如下:
[cpp] view
plaincopy
void MyInputPanel::buttonClicked(QWidget *w)
{
int key;
QString str = ((QPushButton*)w)->text();
if (str == "Backspace") {
key = Qt::Key_Backspace;
}
else {
QChar chr = ((QPushButton*)w)->text().at(0);
key = chr.unicode();
}
emit characterGenerated(key);
}
5 效果及源码
最后效果如下图:
源码:点击这里下载。
参考资料
[1]QT 软键盘
[2]Catching bacspace press event on QT
FROM: http://blog.csdn.net/q1302182594/article/details/48847311
相关文章推荐
- 我写的一个 Qt 显示图片的控件
- Qt学习(17)
- [Qt]界面显示效果之卷轴
- 如何在QT里使用Maliit软键盘
- VS2013+QT5.5 中文乱码问题 解决方案
- QT TextEdit的一些总结
- QT 多线程事件通讯
- qt&gdal
- Qt 知识的总结
- Qt学习(16)
- Qt5.5.0 vs2013 64位编译
- 最近在 OS-10.9下配置opencv, cgal, latex, qt, pillow
- Qt父-子对象机制
- QT控件提升之QPushButton提升为QMenu
- MQTT协议及拓展
- <二> Qt更新sqlite3插件
- Qt学习之parent参数
- Qt下OpenCv中cvGetWindowHandle的使用
- QT窗体滑动(QPropertyAnimation)
- 自学QT之创建json