触摸屏需要一个软键盘以输入,利用QT可以很快的编写这个软键盘。
目的:编写一个能够输入小数、负数等软键盘。在主窗口上有一个界面,界面上有一个按钮和显示模块,当按下按钮时,软键盘打开,此时软件盘必须置顶,且点击面板其他部分无效,待输入完毕,按确认退出,并在主窗口上显示刚刚接收到的数。
分析:关键点。1、两个UI之间如何传数。2、软键盘应运行在何种状态能达到上述效果。3、软键盘按键的槽如何写最简便的取数。
解决:1、两个UI传数可以用函数返回值的方式,这个可以参看我的另一篇博文。具体的是在软键盘的程序中写一个returnvalue();返回输入完毕后输入的数,在主窗口函数中调用该函数,得到返回值。
public:
QString returnValue();//keyboard.h声明
QString KeyBoard::returnValue()
{
exec();
return inputBuf;
}//keyboard.cpp返回输入值
KeyBoard v_keyB(this);
QString ret = v_keyB.returnValue();//mainwindow.cpp调用该函数,取得返回值
2、exec();消息循环调用,它是软键盘成为模态对话框,模态对话框(Modal Dialogue Box,又叫做模式对话框),是指在用户想要对对话框以外的应用程序进行操作时,必须首先对该对话框进行响应。如单击【确定】或【取消】按钮等将该对话框关闭。
exec()程序进入消息循环,等待可能输入进行响应。这里main()把控制权转交给Qt,Qt完成事件处理工作,当应用程序退出的时候exec()的值就会返回。在exec()中,Qt接受并处理用户和系统的事件并且把它们传递给适当的窗口部件。done/reject/accept可以结束它。
QString KeyBoard::returnValue()
{
exec();//消息循环
return inputBuf;
}//keyboard.cpp
void KeyBoard::on_pushButton_yes_clicked()
{
KeyBoard v_keyB(this);
inputBuf = StrBuf;
if(inputBuf==""){inputBuf = "no_value";}
int length = inputBuf.size();
if(inputBuf[length-1]=='.')
{
inputBuf.remove(length-1,1);
}
done(2);
}//keyboard.cpp按确认时则结束exec()
3、利用字符串拼接方式是最简便的。
void KeyBoard::on_pushButton_1_clicked()
{
m_ui->lineEdit_keyB->setText("");//清屏
StrBuf += QString::number(1);//把字符1接到BUFFER中
if(StrBuf[0] == '0'&&zero_flag==1&&StrBuf[1] != '.')
{
StrBuf.remove(0,1);
}//判断0是否为首位,是首位且后无小数点则去掉
m_ui->lineEdit_keyB->setText(StrBuf);
}//显示
效果: