2021.6.5:QT——字符串与数字间的转换
Qt界面设计时,最常用的组件是QLabel与QLineEdit,其中QLabel用于文本显示,而QLineEdit用于文本编辑。它们都有如下两个函数用于读取和设置显示文字:
QString text() const;//Read void setText(const QString &)//Write
这两个函数都涉及到QString类。QString类是QT程序中经常使用的类,用于字符串处理。QString类可以进行String与数字之间的转换,如此,通过QLineEdit就可以实现数字的输入与输出。
下图是我们设计的窗体,是基于QWidget创建的可视化窗体。界面设计使用了布局管理,窗体上组件的布局是:上方几个组件是一个GridLayout,下方的9个组件也是一个GridLayout,两个GridLayout和中间一个Vertical Spacer又组成一个VerticalLayout。
在布局设计时,要巧妙运用Vertical Spacer与Horizontal Spacer,还要会设置组件的MaximumSize和MinimumSize属性,以取得期望的布局效果。例如上图中,两个GridLayout间放了一个垂直间隔(Vertical Spacer),当窗体变大时,两个GridLayout的高度并不会发生变化;而如果不放这个垂直间隔,两个GridLayout的高度都会发生变化,GridLayout内部组件的垂直距离会发生变化。
在UI设计器里,选中图1中的“计算” ,为其设置对应的槽函数(“Go to slot...”),并在出现的对话框中选择clicked()信号创建槽函数,并在自动生成的函数体中编写如下的代码,实现从界面上分别读取数量和单价,相乘计算后将结果再显示到文本框中:
void Widget::on_btnCalc_clicked() { QString str = ui->editNum->text();//读取数量n int num = str.toInt(); str = ui->editPrice->text();//读取单价 float price = str.toFloat(); float total = num*price; str = str.sprintf("%.2f",total); ui->editTotal->setText(str); }
QString类从字符串转换为整数的函数有:
int | toInt(int base = 10) |
long | toLong(int base = 10) |
short | toShort(int base = 10) |
uint | toUInt(int base = 10) |
ulong | toULong(int base = 10) |
参数是转换基数,还可以设置2、8、16表示相应的进制。
QString将字符串转换为浮点数的函数有:
double | toDouble() |
float | toFloat() |
在得到单价和数量后,做相乘计算,得到计算变量total,再将此数值显示在编辑框editTotal中。由于计算结果是浮点数,希望显示两位小数,下面4行语句都可以实现这个功能:
str = QString::number(total,'f',2); str = QString::asprintf("%.2f",total); str = str.setNum(total,'f',2); str = str.sprintf("%.2f",total);
前两个是QString的静态函数number()和asprintf(),也可以使用QString的成员函数setNum()和sprintf()。QString中的sprintf()和C中的同名函数格式相同。而setNum()和number()函数使用另一种格式定义,而且它俩有多个重载函数定义,可以处理各种类型的整数和浮点数,在处理整数时还可以指定进制,例如将一个整数直接转换成十六进制或二进制字符串。
进制转换
以下是读取十进制数据转换为二进制和十六进制QString的按钮的槽函数代码:
void Widget::on_btnConv1_clicked() { //读取十进制数,转换为其它进制 QString str = ui->editDecimal->text(); int val = str.toInt(); str = str.setNum(val,16);//十六进制 //或者str = QString::number(val,16); str = str.toUpper(); ui->editHex->setText(str); str = str.setNum(val,2);//二进制 //或者str = QString::number(val,2); ui->editBinary->setText(str); }
将一个整数转换为不同进制的字符串,可以使用QString成员函数setNum()或静态函数number(),它们的函数原型是:
QString & setNum(int n , int base = 10); QString number (int n , int base = 10);
其中n是待转换的整数,base是使用的进制。
下面是读取二进制QString,然后转换为十进制和十六进制显示的按钮的槽函数代码:
void Widget::on_btnConv2_clicked() { QString str = ui->editBinary->text(); int val = str.toInt(NULL,2); str = str.setNum(val); ui->editDecimal->setText(str); str = QString::number(val,16); str.toUpper(); ui->editHex->setText(str); }
总结
1、最常用的文本显示和编辑组件是QLabel、QLineEdit,它们都有两个函数用于读取、设置文字:
QString text();//Get Text void setText( QString );//Set Text
其中都涉及到了QString类——QT中的字符串,QString模块可以方便的进行QString与数字间的转换。
2、假设一个Line Edit控件对应的对象名为editxxx,对它可以进行的读取、转换、设置操作的语句如下:
QString str = ui->editxxx->text(); //get 控件内容 int num = str.toInt();//将之前的String转换为int类型
str = str.sprintf( "%.2f is %d", arr1 , arr2 );//格式化一个String
ui->editxxx->setText( str );//set 控件内容 为 之前格式化的String
3、格式化字符串的4种方法:
str = QString::number(total,'f',2); str = QString::asprintf("%.2f",total); str = str.setNum(total,'f',2); str = str.sprintf("%.2f",total);
4、将一个整数转换为不同进制的字符串,可以用QString成员函数setNum()或静态函数number(),它们的函数原型是:
QString & setNum(int n , int base = 10); QString number (int n , int base = 10);
使用时:
QString str = ui->editxxx->text(); int val = 10; QString str1 = str.setNum( val , 16 ); QString str2 = QString::number( val , 16 );