开发的思路

  • 布局键盘界面
  • 每一个button对应一个槽函数
  • 把输入的字符返回到点击处的文本编辑框

    开发过程

  • 首先定义功能button,在头文件中定义

    QString getText();QPushButton *num6Button;QPushButton *backspaceButton;QPushButton *num4Button;QPushButton *okButton;QPushButton *leftButton;QPushButton *num1Button;QPushButton *cancelButton;QPushButton *rightButton;QPushButton *num9Button;QPushButton *num8Button;QPushButton *num2Button;QPushButton *num7Button;QPushButton *dotButton;QPushButton *num3Button;QPushButton *num0Button;QPushButton *num5Button;QPushButton *signButton;QLineEdit *lineEdit;

接着定义相关联的槽函数

    void on_num1Button_clicked();void on_num2Button_clicked();void on_num3Button_clicked();void on_num4Button_clicked();void on_num5Button_clicked();void on_num6Button_clicked();void on_num7Button_clicked();void on_num8Button_clicked();void on_num9Button_clicked();void on_dotButton_clicked();void on_num0Button_clicked();void on_signButton_clicked();void on_leftButton_clicked();void on_rightButton_clicked();void on_backspaceButton_clicked();void on_cancelButton_clicked();void on_okButton_clicked();

下面定义界面布局显示的功能模块

        okButton = new QPushButton(this);okButton->setText(" OK");okButton->setGeometry(QRect(190, 250, 110, 50));QFont font1;font1.setPointSize(14);okButton->setFont(font1);backspaceButton = new QPushButton(this);backspaceButton->setText(" backspace");backspaceButton->setGeometry(QRect(190, 130, 110, 50));backspaceButton->setFont(font1);num6Button = new QPushButton(this);num6Button->setText("6");num6Button->setGeometry(QRect(130, 130, 50, 50));QFont font;font.setPointSize(22);num6Button->setFont(font);num4Button = new QPushButton(this);num4Button->setText(" 4");num4Button->setGeometry(QRect(10, 130, 50, 50));num4Button->setFont(font);leftButton = new QPushButton(this);leftButton->setText("<-");leftButton->setGeometry(QRect(190, 190, 50, 50));leftButton->setFont(font);num1Button = new QPushButton(this);num1Button->setText("1");num1Button->setGeometry(QRect(10, 70, 50, 50));num1Button->setFont(font);cancelButton = new QPushButton(this);cancelButton->setText("Esc");cancelButton->setGeometry(QRect(190, 70, 110, 50));cancelButton->setFont(font1);rightButton = new QPushButton(this);rightButton->setText("->");rightButton->setGeometry(QRect(250, 190, 50, 50));rightButton->setFont(font);num9Button = new QPushButton(this);num9Button->setText("9");num9Button->setGeometry(QRect(130, 190, 50, 50));num9Button->setFont(font);num8Button = new QPushButton(this);num8Button->setText("8");num8Button->setGeometry(QRect(70, 190, 50, 50));num8Button->setFont(font);num2Button = new QPushButton(this);num2Button->setText("2");num2Button->setGeometry(QRect(70, 70, 50, 50));num2Button->setFont(font);num7Button = new QPushButton(this);num7Button->setText("7");num7Button->setGeometry(QRect(10, 190, 50, 50));num7Button->setFont(font);dotButton = new QPushButton(this);dotButton->setText(".");dotButton->setGeometry(QRect(130, 250, 50, 50));dotButton->setFont(font);num3Button = new QPushButton(this);num3Button->setText("3");num3Button->setGeometry(QRect(130, 70, 50, 50));num3Button->setFont(font);num0Button = new QPushButton(this);num0Button->setText("0");num0Button->setGeometry(QRect(10, 250, 50, 50));num0Button->setFont(font);num5Button = new QPushButton(this);num5Button->setText("5");num5Button->setGeometry(QRect(70, 130, 50, 50));num5Button->setFont(font);signButton = new QPushButton(this);signButton->setText("+/-");signButton->setGeometry(QRect(70, 250, 50, 50));QFont font2;font2.setPointSize(20);signButton->setFont(font2);lineEdit = new QLineEdit(this);lineEdit->setGeometry(QRect(10, 10, 290, 50));QFont font3;font3.setPointSize(24);font3.setWeight(50);lineEdit->setFont(font3);lineEdit->setText(QString());

相应的槽函数功能

void NumKeyboard::changeEvent(QEvent *e)
{QDialog::changeEvent(e);switch (e->type()) {case QEvent::LanguageChange:break;default:break;}
}bool NumKeyboard::eventFilter(QObject *obj, QEvent *event)
{if (event->type() == QEvent::KeyPress){QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);if (obj == lineEdit){if(keyEvent->key() >= 0x20 && keyEvent->key()<= 0x0ff)  return true;elsereturn false;}else{return false;}}else{// standard event processingreturn QObject::eventFilter(obj, event);}
}//***********************按键*****************************//
void NumKeyboard::on_num1Button_clicked()       //1
{int idx = lineEdit->cursorPosition();  if(strContent.left(idx) == "0")       {lineEdit->setCursorPosition(idx);lineEdit->setFocus();return;}strContent.insert(idx, '1'); lineEdit->setText(strContent); lineEdit->setCursorPosition(idx+1);lineEdit->setFocus(); qDebug()<<"strContent"<<strContent;qDebug()<<"idx"<<idx;
}void NumKeyboard::on_num2Button_clicked()       //2
{int idx = lineEdit->cursorPosition();if(strContent.left(idx) == "0"){lineEdit->setCursorPosition(idx);lineEdit->setFocus();return;}strContent.insert(idx, '2');lineEdit->setText(strContent);lineEdit->setCursorPosition(idx+1);lineEdit->setFocus();
}void NumKeyboard::on_num3Button_clicked()       //3
{int idx = lineEdit->cursorPosition();if(strContent.left(idx) == "0"){lineEdit->setCursorPosition(idx);lineEdit->setFocus();return;}strContent.insert(idx, '3');lineEdit->setText(strContent);lineEdit->setCursorPosition(idx+1);lineEdit->setFocus();
}void NumKeyboard::on_num4Button_clicked()       //4
{int idx = lineEdit->cursorPosition();if(strContent.left(idx) == "0"){lineEdit->setCursorPosition(idx);lineEdit->setFocus();return;}strContent.insert(idx, '4');lineEdit->setText(strContent);lineEdit->setCursorPosition(idx+1);lineEdit->setFocus();
}void NumKeyboard::on_num5Button_clicked()       //5
{int idx = lineEdit->cursorPosition();if(strContent.left(idx) == "0"){lineEdit->setCursorPosition(idx);lineEdit->setFocus();return;}strContent.insert(idx, '5');lineEdit->setText(strContent);lineEdit->setCursorPosition(idx+1);lineEdit->setFocus();
}void NumKeyboard::on_num6Button_clicked()       //6
{int idx = lineEdit->cursorPosition();if(strContent.left(idx) == "0"){lineEdit->setCursorPosition(idx);lineEdit->setFocus();return;}strContent.insert(idx, '6');lineEdit->setText(strContent);lineEdit->setCursorPosition(idx+1);lineEdit->setFocus();
}void NumKeyboard::on_num7Button_clicked()       //7
{int idx = lineEdit->cursorPosition();if(strContent.left(idx) == "0"){lineEdit->setCursorPosition(idx);lineEdit->setFocus();return;}strContent.insert(idx, '7');lineEdit->setText(strContent);lineEdit->setCursorPosition(idx+1);lineEdit->setFocus();
}void NumKeyboard::on_num8Button_clicked()       //8
{int idx = lineEdit->cursorPosition();if(strContent.left(idx) == "0"){lineEdit->setCursorPosition(idx);lineEdit->setFocus();return;}strContent.insert(idx, '8');lineEdit->setText(strContent);lineEdit->setCursorPosition(idx+1);lineEdit->setFocus();
}void NumKeyboard::on_num9Button_clicked()       //9
{int idx = lineEdit->cursorPosition();if(strContent.left(idx) == "0"){lineEdit->setCursorPosition(idx);lineEdit->setFocus();return;}strContent.insert(idx, '9');lineEdit->setText(strContent);lineEdit->setCursorPosition(idx+1);lineEdit->setFocus();
}void NumKeyboard::on_dotButton_clicked()        //.
{int idx = lineEdit->cursorPosition();if(idx==0 || strContent.contains('.')){lineEdit->setCursorPosition(idx);lineEdit->setFocus();return;}strContent.insert(idx, '.');lineEdit->setText(strContent);lineEdit->setCursorPosition(idx+1);lineEdit->setFocus();
}void NumKeyboard::on_num0Button_clicked()       //0
{int idx = lineEdit->cursorPosition();if(strContent.left(idx) == "0" || (idx==0 &&strContent!="")){lineEdit->setCursorPosition(idx);qDebug()<<"idx"<<idx;lineEdit->setFocus();return;}strContent.insert(idx, '0');lineEdit->setText(strContent);lineEdit->setCursorPosition(idx+1);lineEdit->setFocus();
}void NumKeyboard::on_signButton_clicked()       //+/-
{int idx = lineEdit->cursorPosition();if(strContent.left(1) == "-"){strContent.remove(0, 1);lineEdit->setText(strContent);lineEdit->setCursorPosition(idx-1);lineEdit->setFocus();}else{if(strContent=="0" || strContent==""){lineEdit->setCursorPosition(idx);lineEdit->setFocus();}else{strContent.insert(0, '-');lineEdit->setText(strContent);lineEdit->setCursorPosition(idx+1);lineEdit->setFocus();}}
}void NumKeyboard::on_leftButton_clicked()       //left
{int idx = lineEdit->cursorPosition();if(idx == 0){lineEdit->setCursorPosition(idx);lineEdit->setFocus();return;}lineEdit->setCursorPosition(idx-1);lineEdit->setFocus();
}void NumKeyboard::on_rightButton_clicked()      //right
{int idx = lineEdit->cursorPosition();if(idx == strContent.length()) //返回此字符串的字符数{lineEdit->setCursorPosition(idx);lineEdit->setFocus();return;}lineEdit->setCursorPosition(idx+1);lineEdit->setFocus();
}void NumKeyboard::on_backspaceButton_clicked()      //backspace
{int idx = lineEdit->cursorPosition();if(idx == 0){lineEdit->setCursorPosition(idx);lineEdit->setFocus();return;}strContent.remove(idx-1,1);lineEdit->setText(strContent);lineEdit->setCursorPosition(idx-1);lineEdit->setFocus();
}void NumKeyboard::on_cancelButton_clicked()     //cancel
{this->close();valid = false;
}void NumKeyboard::on_okButton_clicked()         //ok
{this->close();valid = true;
}void NumKeyboard::setText(QString str)      //设置文本内容
{strContent = str;lineEdit->setText(strContent);lineEdit->setFocus();
}QString NumKeyboard::getText()              //获取内容
{return strContent;
}

上面的槽函数中只对大体的相似,只对不同处做出讲解
以点击“1”为例:
获取在软键盘中的文本框中光标的位置,赋值给idx,索引用

int idx = lineEdit->cursorPosition();  

官方的解释如下
QString x = “Pineapple”;
QString y = x.left(4); // y == “Pine”
同理下面的代码含义是:把当前光标位置左侧所有的数,存放在strContent中,
if判断的作用是,当数值开头是0,便不能够输入。一个简单的检查的功能,例如无法输入”01“

insert的官方解释
QString str = “Meal”;
str.insert(1, QString(“ontr”));
// str == “Montreal”
下面语句的作用是在当前的坐标处出插入1;把新的字符串返回给strContent
(初始时idx=0,光标位置是0)
strContent.insert(idx, ‘1’);
随后设置当前的光标的位置+1,
lineEdit->setCursorPosition(idx+1);
显示光标
lineEdit->setFocus();

void NumKeyboard::on_num1Button_clicked()       //1
{int idx = lineEdit->cursorPosition();  if(strContent.left(idx) == "0")       {lineEdit->setCursorPosition(idx);lineEdit->setFocus();return;}strContent.insert(idx, '1');  lineEdit->setText(strContent); lineEdit->setCursorPosition(idx+1);lineEdit->setFocus();  }

在设置正负的时候还会用到 strContent.remove(0, 1);
官方的解释是:
QString s = “Montreal”;
s.remove(1, 4);
// s == “Meal”
上面的含义是,在0的位置删除1个字符。就是数字前面的+、-

在设置右移的槽函数中
idx == strContent.length()) //返回此字符串的字符数

最后通过getText() 函数获取文本的内容

QString NumKeyboard::getText() //获取内容
{
return strContent;
}

void SoftKeyLineEdit::mousePressEvent(QMouseEvent *e)
{if(e->button() == Qt::LeftButton){numkeyboard->setText(this->text());  numkeyboard->exec();if(numkeyboard->valid){this->setText(numkeyboard->getText());  }}
}

我们通过鼠标点击的方式来触发软键盘
下面的函数的作用是:把当前的文本框中的内容传递给软件盘中的文本框
numkeyboard->setText(this->text());
下面的exec()与show()显示的方式有所不同。
exec():
显示一个模式对话框,并且锁住程序直到用户关闭该对话框为止。
show():
显示一个非模式对话框。控制权即刻返回给调用函数。
numkeyboard->exec();
如果点击“确认”按键后 valid返回值是true
if(numkeyboard->valid)

随后把返回得到的字符串,传递到点击处的文本框中。
this->setText(numkeyboard->getText());

如何快速一个上面的软键盘到项目中
1.包含上面的cpp和.h文件
2.通过触发的方式触发下面语句
numkeyboard->setText(this->text());
numkeyboard->exec();
if(numkeyboard->valid)
{
this->setText(numkeyboard->getText());
}
3.触发方式可以是信号(例如clicked())
另外看还可以是mousePressEvent(); 它的使用方式要重写
细节(QString 定义的strContent存储有引用计数,指向相同的存储空间,仅仅 是增加一个引用计数)

效果图

源代码下载
http://download.csdn.net/detail/osean_li/9773460

Qt实战开发-数字软键盘相关推荐

  1. Qt开发-数字软键盘

    最近项目做触屏界面,需要使用到数字软键盘. 参考了以下内容: Qt实战开发-数字软键盘:https://blog.csdn.net/Osean_li/article/details/60882890 ...

  2. EMWIN数字软键盘设计

    最近学习stm32的emwin界面,编写了一个数字软键盘的功能,其中遇到了一些问题,也学到了一些经验.我想要实现的功能是在如图所示的界面下,点击文本框弹出软键盘,能够通过软键盘输入0到9和小数点,ta ...

  3. 安卓实战:自定义软键盘 (2)

    //数字键1 //数字键2 //数字键3 //删除键 //数字键4 //数字键5 //数字键6 //确定键,设置较大 //数字键7 //数字键8 //数字键9 //清零键 //0键 //.键 然后是逻 ...

  4. Qt实现屏幕虚拟软键盘

    作者 QQ群:852283276 微信:arm80x86 微信公众号:青儿创客基地 B站:主页 https://space.bilibili.com/208826118 参考 Qt编写输入法V2018 ...

  5. android 支付数字键盘,微信小程序自定义数字键盘|仿支付宝、微信支付数字软键盘...

    (此图片来源于网络,如有侵权,请联系删除! ) 前几天有开发过一个html5仿支付宝.微信支付数字键盘,在某些特定场景下自定义数字键盘应用还是蛮广泛的,比如 小程序商城系统 需要零钱支付 ,会员卡支付 ...

  6. iOS开发之软键盘使用小技巧

    在iOS开发过程中,有时候需要弹出软键盘进行输入,有时候又需要在某些情况下隐藏软键盘,以提高用户体验.今天有几个关于软键盘的小技巧和大家分享. (1)只弹出数字键盘 有某些需求中,要求用户只能在Tex ...

  7. android开发隐藏软键盘,Android开发之完全隐藏软键盘的方法

    隐藏软键盘一直是我头痛的事情,没有找到一种真正能隐藏的方法.点击EditText的时候总是弹出软键盘.-----杯具 杯具(一): InputMethodManager im =(InputMetho ...

  8. android调用数字软键盘设置(EditText属性)

    在某些时候我们要设置EditText调用数字键盘,省去在中文键盘下去切换成数字键盘,怎么做比较合适呢? 答案很简单:EditText设置android:numeric="integer&qu ...

  9. Android开发设置软键盘收索键

    有时候为了布局美观,不会特意的去放置一个收索按钮,而是调用软件盘上的回车按钮作为收索.要实现把软键盘的回车按钮设置为收索按钮其实很简单,直接在Layout文件中,对EditText控件加上如下属性: ...

  10. 安卓如何调出软键盘_Android开发中软键盘的显示和隐藏

    本篇内容通过操作软键盘的函数着手详细分析了隐藏或者显示软键盘的实现方法,并且对其中重要的代码做了详细分析. 一.开篇 如果有需要用到输入的地方,通常会有需要自动弹出或者收起软键盘的需求.开篇明义,本文 ...

最新文章

  1. hive replace替换多个_详解Mysql数据库中replace与replace into的用法及区别
  2. 数据结构和算法-001 数组
  3. 解决Linux下动态链接库失败的问题
  4. RT73 wifi无线网卡驱动移植过程 和wpa支持
  5. SpringBoot高级-消息-JMSAMQP简介
  6. SocketServer模块,hmac模块验证client合法性
  7. 单例模式-双重检查加锁
  8. 软件工程学习进度第六周暨暑期学习进度之第六周汇总
  9. 计算机用户组权限管理,配置Windows server 用户和组权限实验详解
  10. hdoj6298:Maximum Multiple(找规律,总结)
  11. 自动发卡平台网站源码-带手机版 带多套商户模板
  12. 刘汝佳小白书-最长回文字串
  13. 推荐一个Firefox的扩展——IE Tab
  14. 戴尔linux恢复镜像,戴尔 SupportAssist OS Recovery 系统恢复教程
  15. 基于Vue的移动端图片裁剪组件 vue-clip(完美兼容ios与安卓)
  16. 大局观有多重要?如何拥有大局观?
  17. python实现推广小项目
  18. 如何正确检测文件类型?
  19. 2019-详细Android Studio开发百度地图(4)—百度地图_路线规划的实现
  20. 基于物联网技术智慧园林绿化养护管理信息平台

热门文章

  1. 工具 | Procexp工具使用及案例说明
  2. 2022年整理LeetCode最新刷题攻略分享(附中文详细题解)
  3. springboot中Word转PDF技巧
  4. 【有手就行】电脑蓝屏恶搞(附带一键复原方法)
  5. 微信小程序 java社区团购系统springboot
  6. windows下的dig 命令和nslookup的用法及详例
  7. Linux ---- 安装虚拟机
  8. 黑马程序员_Java基础(环境搭建、进制转换、运算符)
  9. Elsevier 模板 Latex参考文献按引用顺序排列
  10. Java实现中英文词典功能