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

凡岛公司福利 263人发布