Qt入门学习之常用界面设计组件(一)

Qt类库为应用程序设计提供了大量的类,该部分主要介绍设计GUI应用程序常用的各种界面组件。该部分中的本节内容主要介绍用于字符串的输入输出及数据类型转换等知识。

1.字符串的与数值间的转换

在使用Qt进行GUI见面设计常用到的组件Qlabel和QLineEdit。QLabel用于显示字符串,QLineEdit用于显示和输入字符串。这两个组件都有如下两个函数用于读取和设置显示的文字。
QString text()const;
void setText(const QString &);
这两个组件的函数都涉及到QString类。QString类是Qt中用于字符串处理的。

I.以下面的实验作为载体学习普通数字与字符串之间的转换以及进制间的转换。
基于QWidget创建可视化窗体。界面设计使用了布局管理,窗体组件布局是:上方的几个组件是一个GridLayout,下方的9个组件也是一个GridLayout,两个GridLayout和中间一个VerticalSpacer又组成了一个VerticalLayout。
在这里插入图片描述
在布局设计时,运用VerticalSpacer和HorizontalSpacer,还会去设置组件的MaxnumSize和MininumSzie属性,以取得期望的布局效果。如:上图所示两个GridLayout之间放了一个垂直方向的分隔,两个Gridlayout的高度都会发生变化,Gridlayout内部组件的垂直距离就会发生变化。

II.普通数值与字符串之间的转换
在“计算”按钮的槽函数中实现普通数值和字符串之间的相互转换:

void Widget::on_pBtn1_clicked()
{
    QString  str=ui->numEdit->text();//读取数值
    int num=str.toInt(); //字符串转换成普通数值
    str=ui->unitPriceEdit->text();//读取数值
    float price=str.toFloat();//转换为浮点数
    float total=num*price;//总价=数量*单价
    str=str.sprintf("%.2f",total);//数值转换成字符串
    ui->totalPriceEdit->setText(str);//设置LineEdit组件显示内容
}

在这里插入图片描述
运行结果如上如,点击计算按钮。从界面上分别读取数量和单价,相乘计算得到结果,并将结果显示到文本框里。
QString 类从字符串换转为证书的函数有:

int toInt(bool *ok=Q_NULLPTR,int base=10)		const
long toLong(bool *ok=Q_NULLPTR,int base=10)	const
short toShort(bool *ok=Q_NULLPTR,int base=10)	const
uint toUInt(bool *ok=Q_NULLPTR,int base=10)	const
ulong toULong(bool *ok=Q_NULLPTR,int base=10)const

这些函数如果不设置参数,缺省表示以十进制表示的字符串转换为整数;若指定整数基参数,还可以直接将二进制、十六进制字符串转换为整数。
QString 将字符串转换为浮点数的函数有:

double toDouble(bool *ok = Q_NULLPTR) const
float toFloat (bool * ok = Q_NULLPTR) const

计算结果是浮点数,希望显示两位小数,下面 4 行语句都可以实现这个功能(即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(),也可以使用其公共函数 setNum() 和 sprintf()。 QString 的 sprintf() 函数与 C 语言里的 sprintf() 函数的格式是一样的,而 setNum() 和 number() 函数使用另外一种格式定义,而且 setNum 和 number 有多个重载函数定义,可以处理各种类型的整数和浮点数,在处理整数时还可以指定进制,例如将一个整数直接转换为十六进制或二进制字符串。
III.进制转换
以读取十进制数转换为二进制和十六进制字符串的按钮的槽为例函数代码:

void Widget::on_btnDec_clicked()
{   //读取十进制数,转换为其他进制
    QString str=ui->editDec->text();
    int val=str.toInt;//缺省为十进制
    str=str.setNum (val, 16); //十六进制
    str=str.toUpper();//设置为大写
    ui->editHex->setText(str);//设置文本框显示内容
    str=str.setNum (val, 2) ; //二进制
    ui->editBin->setText(str);//设置文本框显示内容
}

单击数制转换按钮,运行结果如下:
在这里插入图片描述

2.QString类及其Qt编程中常用功能

I.append() 和 prepend()
append() 在字符串的后面添加字符串,prepend() 在字符串的前面添加字符串,如:

QString str1="买",str2="防";
QString str3=str1;
str1.append (str2) ; //str1="买防"
str3.prepend (str2) ; //str3="防买"

II.toUpper() 和 toLower()
toUpper() 将字符串内的字母全部转换为大写形式,toLower() 将字母全部转换为小写形式,如:

QString str1="Hello, World", str2;
str2=str1.toUpper(); //str1="HELLO,WORLD"
str2=str1.toLower(); //str1="hello, world"

III .count()、size() 和 length()
count()、size() 和 length() 都返回字符串的字符个数,这 3 个函数是相同的,但是要注意,字符串中如果有汉字,一个汉字算一个字符。

QString str1="NI 好"
N=str1.count()  //N=3
N=str1.size() //N=3
N=str1.length() //N=3

IV.trimmed() 和 simplified()
trimmed() 去掉字符串首尾的空格,simplified() 不仅去掉首尾的空格,中间连续的空格也用一个空格替换。

QString str1=" Are you OK? ", str2;
str2=str1.trimmed () ; //str1="Are you OK? "
str2=str1.simplified(); //str1="Are you OK?"

V.indexOf () 和 lastIndexOf ()
indexOf() 函数的原型为:

int indexOf (const QString &str, int from = 0 , Qt::CaseSensi
tivity cs = Qt::CaseSensitive) const

其功能是在自身字符串内查找参数字符串 str 出现的位置,参数 from 是幵始查找的位置,Qt::CaseSensitivity cs 参数指定是否区分大小写。
lastIndexOf() 函数则是查找某个字符串最后出现的位置。

QString str1="G:\Qt5Book\QT5.9Study\qw.cpp";
N=str1.indexOf("5.9");  // N=13
N=str1.lastIndexOf("\\"); //N=21

提示,"" 是转义字符,如果要查找 “”,需要输入 “\”。
VI.isNull() 和 isEmpty()
两个函数都判读字符串是否为空,但是稍有差别。如果一个空字符串,只有“\0”,isNull() 返回 false,而 isEmpty() 返回 true;只有未赋值的字符串,isNull() 才返回 true。

QString str1, str2="";
N=str1.isNull () ; // N=true 未赋值字符串变量
N=str2.isNull () ; // N=false 只有"\0"的字符串,也不是 Null
N=str1.isEmpty(); // N=true
N=str2.isEmpty(); // N=true

QString 只要赋值,就在字符串的末尾自动加上 “\0”,所以,如果只是要判断字符串内容是否为空,常用 isEmpty()。
VII.contains()
判断字符串内是否包含某个字符串,可指定是否区分大小写。

QString str1="G:\Qt5Book\QT5.9Study\qw.cpp";
N=str1.contains (".cpp", Qt::CaseInsensitive) ; // N=true,不区分大小写
N=str1.contains (".CPP", Qt::CaseSensitive) ;  // N=false,区分大小写

VIII.endsWith() 和 startsWith()
startsWith() 判断是否以某个字符串幵头,endsWith() 判断是否以某个字符串结束。

QString str1=MG:\Qt5Book\QT5.9Study\qw.cpp";
N=str1.endsWith (".cpp", Qt::CaseInsensitive) ; // N=true,不区分大小写
N=str1.endsWith (".CPP", Qt::CaseSensitive) ; // N=false,区分大小写
N=str1.startsWith ("g: ") ; // N=true,缺省为不区分大小写

VIIII.left() 和 right()
left 表示从字符串中取左边多少个字符,right 表示从字符串中取右边多少个字符。注意,一个汉字被当作一个字符。

QString str2, str1="学生姓名,男,1984-3-4,汉族,山东";
N=str1.indexOf (",") ; // N=4,第一个","出现的位置
str2=str1.left (N) ; //str2="学生姓名"
N=str1.lastIndexOf (",") ; // N=18,最后一个逗号的位置
str2=str1.right (str1.size()-N-1); //str2=”山东",提取最后一个逗号之后的字符串

X.section()
section() 函数的原型为:
QString section (const QString &sep, int start, int end = -1, SectionFlags flags = SectionDefault) const
其功能是从字符串中提取以 sep 作为分隔符,从 start 端到 end 端的字符串。

QString str2, str1="学生姓名,男,1984-3-4,汉族,山东";
str2=str1.section (",",0,0); // str2="学生姓名", 第 1 段的编号为 0
str2=str1.section (",",1,1}; // str2="男"
str2=str1.section (",",0,1}; // str2="学生姓名,男"
str2=str1.section (",",4,4); // str2="山东"

猜你喜欢

转载自blog.csdn.net/cainiaoxiakexing/article/details/88788330