QT实现数字键盘点击实时显示到聚焦的编辑控件

文章是在帮助女朋友完成毕业设计的时候写的一个解释demo给她看的
主体功能是实现数字小键盘点击数字实时显示添加到聚焦的控价line_edit上,已达到在触控屏幕上通过提供数字键盘模拟真实键盘输入的功能
事先已经搭建好了QT关于ARM的交叉编译环境,编译出来的可执行文件可以直接在ARM板上直接运行
1.建立工程,在UI designer中建两个widget,找不到widget的可以通过侧边的搜索查找,之所以要建立两个widget就是避免你的触控事件会造成聚焦失效的问题,如果分开成两个widget则不会出现这样子的情况
在这里插入图片描述
拖拽两个widget至我们需要的界面中,然后在其中添加上lineedit/pushbutton,这里就按照如图的布局拖拽编辑条和按键,对数字键盘外貌进行规划,如果想做好一点的适配效果可以添加上一些layout style
在这里插入图片描述
在这里插入图片描述
2.进行程序编写,主要是进行信号和槽函数的连接
代码主体功能是该主窗口的构造和析构函数
构造函数中主要完成UI绘制和按键槽函数的绑定内容(以前没用过这种循环绑定的方式,导致教她的时候是一个一个写槽函数的,罪过大了......)其中较为巧妙的利用了findChildren获取当前wiget中的button(这也是为什么要区分到两个不同的wiget的原因之一,方便为每个按键绑定槽函数),并存储到auto指针中,然后使用qobject_cast进行类型强制转换,先得到地址再访问对象的方式
最后通过获取按键上的字符得到Unicode码,然后把码值以key_event的形式发送到编辑框中达到模拟输入的功能(之前的写法我都是通过settext或者append的方式把文字内容写入,这种方式确实更加模拟了键盘输入且比较简洁)

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QKeyEvent>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //清空按键
    connect(ui->pushButton_11, &QPushButton::clicked, [=](){
        if(ui->widget->focusWidget()!=nullptr)
        {
            QLineEdit *lineedit =  qobject_cast<QLineEdit*>(ui->widget->focusWidget());
            //获取当前ui中widget聚焦的哪个line_edit
            if(lineedit)
                lineedit->clear();
        }
    });
    //0-9 按钮
    for(auto btn:ui->widget_2->findChildren<QPushButton*>())
    {//查找widget_2中所有按键 逐个绑定槽函数
        if(ui->pushButton_11 == btn)//跳过清除按键
            continue;
        connect(btn, &QPushButton::clicked, [=](){
            if(ui->widget->focusWidget()!=nullptr)
            {
                QLineEdit *lineedit =  qobject_cast<QLineEdit*>(ui->widget->focusWidget());
                if(lineedit)
                {//将按键上的字符模拟键盘形式发送至聚焦的line_edit
                    QString text = btn->text();
                    QChar c = text.at(0);
                    int num = c.unicode();
                    QKeyEvent evt(QEvent::KeyPress,num,Qt::KeyboardModifier::NoModifier,text);
                    qApp->sendEvent(lineedit,&evt);
                }
            }
        });
    }
}

MainWindow::~MainWindow()
{
    delete ui;
}

简要说明一下为什么要建立两个widget?
1.为了区分控件区域,使得界面更加整洁
2.因为代码中我们用到了focusWidget(),这个定位聚焦的控件的函数只能定位到当前widget中聚焦的控件,若不进行划分,则在你点击小键盘的button时聚焦就会改变
参考链接:https://blog.csdn.net/hss2799/article/details/111628159

#创作者计划3期##学习路径#
全部评论
感谢参与【创作者计划3期·技术干货场】!欢迎更多牛油来写干货,瓜分总计20000元奖励!!技术干货场活动链接:https://www.nowcoder.com/link/czz3jsgh3(参与奖马克杯将于每周五结算,敬请期待~)
点赞 回复 分享
发布于 2021-07-14 11:01
看代码,好像是把按键的unicode封装成event发送。。。不确定是不是这样的
点赞 回复 分享
发布于 2021-07-14 11:20

相关推荐

点赞 评论 收藏
分享
11-08 13:58
门头沟学院 Java
程序员小白条:竟然是蓝桥杯人才doge,还要花钱申领的offer,这么好的公司哪里去找
点赞 评论 收藏
分享
13 12 评论
分享
牛客网
牛客企业服务