文章是在帮助女朋友完成毕业设计的时候写的一个解释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
全部评论
(2) 回帖