一、字符串与数值之间的转换
界面设计最常用到的组件就是QLabel和QLineEdit;
QLabel用于显示字符串,QLineEdit用于输入和显示字符串
两个函数都涉及到QString类。QString类是Qt程序中经常使用的类,用于处理字符串,可以实现字符串与数值之间的转换
接下来在Qt中设计一个工程,完成字符串与数值间的转换
界面效果如下:
其中,上方的几个组件构成了一个GridLayout,下面的几个组件也是一个GridLayout,两个GridLayout又和它们之间的VerticalSpacer构成了一个VerticalLayout
1.普通数值与字符串之间的转换
选中上方的计算按钮,在右键快捷键里单击"Go to slot…",并在弹出的界面中选择clicked()信号创建槽函数,之后在自动生成的函数体中编写如下的代码,以实现相应功能
void Widget::on_btn_cal_clicked()
{
QString str = ui->editNum->text(); //读取"数量"
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);
}
//editNum、editTotal、editPrice分别为相应的组件名
2.进制转换
选中十进制后的转换按钮,同上面的构建信号与槽的方式相似,创建数字进制转换的槽函数,内容如下:
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);
}
//editBin、editDec、editHex分别为二进制、十进制、十六进制的组件名
3.创建二进制和十六进制的数值转化槽函数
转换进制的槽函数内容如下
void Widget::on_btnBin_clicked()
{
QString str = ui->editBin->text(); //获取二进制数值
bool ok;
int val = str.toInt(&ok,2); //以二进制读入
str=QString::number(val,10); //转化为十进制数字
ui->editDec->setText(str);
str=str.setNum(val,16); //转化十六进制数字
str=str.toUpper();
ui->editHex->setText(str);
}
void Widget::on_btnHex_clicked()
{
QString str = ui->editHex->text(); //获取十六进制数值
bool ok;
int val = str.toInt(&ok,16); //以十六进制读入
str=QString::number(val,10);
ui->editDec->setText(str);
str=str.setNum(val,2); //转化为二进制数字
ui->editBin->setText(str);
}
二、QString的常用功能
QString是Qt编程常用的类,除了用作数字量的输入输出,QString还有很多的其它功能
QString储存字符串采用的是Unicode码,每一个字符是一个16位的QChar,而不是8位的char,因此QString能够处理中文字段,而且一个汉字算是一个字符
对QString常用函数的测试用例如下图所示
具体实现过程如下,每个函数的功能都在各自槽函数有注释
详细代码如下
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_btn_app_clicked();
void on_btn_pre_clicked();
void on_btn_toup_clicked();
void on_btn_tolow_clicked();
void on_btn_left_clicked();
void on_btn_right_clicked();
void on_btn_tri_clicked();
void on_btn_sim_clicked();
void on_btn_count_clicked();
void on_btn_size_clicked();
void on_btn_index_clicked();
void on_btn_lastindex_clicked();
void on_btn_ends_clicked();
void on_btn_starts_clicked();
void on_btn_contains_clicked();
void on_btn_isnull_clicked();
void on_btn_isempty_clicked();
void on_btn_section_clicked();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_btn_app_clicked()
{
//在字符串后添加字符串
QString str1 = ui->editStr1->text(); //获取str1
QString str2 = ui->editStr2->text(); //获取str2
str1 = str1.append(str2);
ui->editresult->setText(str1);
}
void Widget::on_btn_pre_clicked()
{
//在字符串前面添加字符串
QString str1 = ui->editStr1->text(); //获取str1
QString str2 = ui->editStr2->text(); //获取str2
str1 = str1.prepend(str2);
ui->editresult->setText(str1);
}
void Widget::on_btn_toup_clicked()
{
//将字符串中的小写字母转为大写字母,大写字母不变
QString str1 = ui->editStr1->text(); //获取str1
QString str2 = ui->editStr2->text(); //获取str2
str1 = str1.toUpper();
str2 = str2.toUpper();
if(!str1.isEmpty())
ui->editresult->setText(str1);
else if (!str2.isEmpty()) {
ui->editresult->setText(str2);
}
}
void Widget::on_btn_tolow_clicked()
{
//将字符串中的大写字母转为小写字母,小写字母不变
QString str1 = ui->editStr1->text(); //获取str1
QString str2 = ui->editStr2->text(); //获取str2
str1 = str1.toLower();
str2 = str2.toLower();
if(!str1.isEmpty())
ui->editresult->setText(str1);
else if (!str2.isEmpty()) {
ui->editresult->setText(str2);
}
}
void Widget::on_btn_left_clicked()
{
//left函数表示从字符串左边取指定长度,中文被看作一个字符
QString str1 = ui->editStr1->text(); //获取str1
QString str2 = ui->editStr2->text(); //获取str2
str1 = str1.left(5); //默认取5个字符
str2 = str2.left(5);
if(!str1.isEmpty())
ui->editresult->setText(str1);
else if (!str2.isEmpty()) {
ui->editresult->setText(str2);
}
}
void Widget::on_btn_right_clicked()
{
//right函数表示从字符串右边取指定长度,中文被看作一个字符
QString str1 = ui->editStr1->text(); //获取str1
QString str2 = ui->editStr2->text(); //获取str2
str1 = str1.right(5); //默认取5个字符
str2 = str2.right(5);
if(!str1.isEmpty())
ui->editresult->setText(str1);
else if (!str2.isEmpty()) {
ui->editresult->setText(str2);
}
}
void Widget::on_btn_tri_clicked()
{
//trimmed函数功能是去掉字符串首尾空格
QString str1 = ui->editStr1->text(); //获取str1
QString str2 = ui->editStr2->text(); //获取str2
str1 = str1.trimmed();
str2 = str2.trimmed();
if(!str1.isEmpty())
ui->editresult->setText(str1);
else if (!str2.isEmpty()) {
ui->editresult->setText(str2);
}
}
void Widget::on_btn_sim_clicked()
{
//simplified不仅去掉字符串首尾空格,中间的连续空格也被单个空格替代
QString str1 = ui->editStr1->text(); //获取str1
QString str2 = ui->editStr2->text(); //获取str2
str1 = str1.simplified();
str2 = str2.simplified();
if(!str1.isEmpty())
ui->editresult->setText(str1);
else if (!str2.isEmpty()) {
ui->editresult->setText(str2);
}
}
void Widget::on_btn_count_clicked()
{
//count函数返回字符串的字符个数,中文字符被当作一个字符
QString str1 = ui->editStr1->text(); //获取str1
QString str2 = ui->editStr2->text(); //获取str2
int num;
if(!str1.isEmpty()){
num = str1.count();
ui->editresult->setText(QString::number(num));
}
else if (!str2.isEmpty()) {
num = str2.count();
ui->editresult->setText(QString::number(num));
}
}
void Widget::on_btn_size_clicked()
{
//size函数返回字符串的字符个数,中文字符被当作一个字符
//length函数和size、count函数一样,都能返回字符串的长度
QString str1 = ui->editStr1->text(); //获取str1
QString str2 = ui->editStr2->text(); //获取str2
int num;
if(!str1.isEmpty()){
num = str1.size();
ui->editresult->setText(QString::number(num));
}
else if (!str2.isEmpty()) {
num = str2.size();
ui->editresult->setText(QString::number(num));
}
}
void Widget::on_btn_index_clicked()
{
//indexOf的作用是查找某个字符串最早出现的位置
QString str1 = ui->editStr1->text(); //获取str1
QString str2 = ui->editStr2->text(); //获取str2
int local;
local = str1.indexOf(str2);
ui->editresult->setText(QString::number(local));
}
void Widget::on_btn_lastindex_clicked()
{
//lastIndexOf的作用是查找某个字符串最后出现的位置
QString str1 = ui->editStr1->text(); //获取str1
QString str2 = ui->editStr2->text(); //获取str2
int local;
local = str1.lastIndexOf(str2);
ui->editresult->setText(QString::number(local));
}
void Widget::on_btn_ends_clicked()
{
//endsWith判断字符串是否以某个字符结束
QString str1 = ui->editStr1->text(); //获取str1
QString str2 = ui->editStr2->text(); //获取str2
int res;
res = str1.endsWith(str2);
ui->editresult->setText(QString::number(res));
}
void Widget::on_btn_starts_clicked()
{
//startsWith判断字符串是否以某个字符开始
QString str1 = ui->editStr1->text(); //获取str1
QString str2 = ui->editStr2->text(); //获取str2
int res;
res = str1.startsWith(str2);
ui->editresult->setText(QString::number(res));
}
void Widget::on_btn_contains_clicked()
{
//contains函数判断字符串中是否包含某个字符串
QString str1 = ui->editStr1->text(); //获取str1
QString str2 = ui->editStr2->text(); //获取str2
int res;
res = str1.contains(str2);
ui->editresult->setText(QString::number(res));
}
void Widget::on_btn_isnull_clicked()
{
//isNull和isEmpty都判断字符串是否为空,但是稍有差别
//加入一个字符串之有'\0',isNull返回false,isEmpty返回true
//只有未赋值的字符串,isNull才返回true
//只实现str1
QString str1 = ui->editStr1->text(); //获取str1
if(!str1.isNull())
ui->editresult->setText("flase");
else {
ui->editresult->setText("true");
}
}
void Widget::on_btn_isempty_clicked()
{
//只实现str1
QString str1 = ui->editStr1->text(); //获取str1
if(!str1.isEmpty())
ui->editresult->setText("flase");
else {
ui->editresult->setText("true");
}
}
void Widget::on_btn_section_clicked()
{
//section能从字符串中提取sep作为分隔符,从start端到end端
QString str1 = ui->editStr1->text(); //获取str1
QString str2 = ui->editStr2->text(); //获取str2
str1 = str1.section(str2,0,1); //假如一个字符串用","分为若干段,则这些段的编号为0,1,2...,则该槽函数取前两段字符串
ui->editresult->setText(str1);
}