Qt6开发入门-常用控件简介

QString字符串

QString存储一串字符,每个字符是一个QChar类型的数据。QChar使用UTF-16编码,一个字符包含2字节数据。对于超过65535的Unicode编码,QString使用两个连续的QChar字符表示。QString字符串中一个汉字是一个字符。例如:

1
2
3
QString str="dimple,酒窝";
QChar ch0=str[0]; //d
QChar ch7=str.at(7); //酒

QChar类常用接口函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bool isDigit();
bool isLetter();
bool isLetterOrNumber();
bool isLower();
bool isUpper();
bool isMark();
bool isNonCharacter();
bool isNull();
bool isNumber();
bool isPrint();
bool isPunct();
bool isSpace();
bool isSymbol();
bool isEmpty();
char toLatin1();
QChar toLower();
QChar toUpper();
char16_t unicode();
int size();

例如将Latin1转QChar字符:

1
2
3
4
QString str="Dimple";
QChar chP=QChar::fromLatin1('P');
//或QChar cP=QChar('P');
str[0]=chP;

例如用Unicode编码构造QChar字符:

1
2
3
QString str="Hello,北京";
str[6]=QChar(0x9752); //青
str[7]=QChar::fromUcs2(0x5C9B); //岛

QChar的逻辑运算符是对UTF-16编码的大小比较。

其他字符串常用操作有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
QString str1="XXX",str2="XXX";
QString str3=str1+str2; //拼接
str1.append(str2); //后面添加
str3.prepend(str2); //前面添加
QChar ch1=str1.front(),ch2=str1.back(); //第一个字符 最后一个字符
QString str1=ui->lineEdit->text(); //从名为lineEdit的QLineEdit获取字符串
QString str2=str1.first(2); //左边2个字符
str2=str1.last(3); //右边3个字符
int N=str1.lastIndexOf("\\"); //最后一个“\”出现的未知
QString str2=str1.mid(N+1,2); //从N+1开始的2个字符
str2=str1.sliced(N+1); //从N+1开始到末尾
QString str2,str1="学生姓名,男,XXXX";
str2=str1.section(",",0,1); //以“,”为分隔符 返回第0到1段的内容
QString str1,str2=""; //QString被赋值则在末尾自动加上“\0”
bool N=str1.isNull(); //true 未赋值
N=str2.isNull(); //false 已赋值为“\0”
N=str1.isEmpty();N=str2.isEmpty(); //true
str2.clear(); //清空字符串内容
N=str2.isNull(); //true 已被清空
N=str1.count();N=str1.size();N=str1.length(); //获取字符个数
str2.resize(5,'0'); //改变字符串长度 这里用‘0’预分配5长度
str1.fill('X'); //长度不变 所有字符变为‘X’
str1.fill('A',2); //“AA”
str1.fill(QChar(0x54C8),3); //“哈哈哈”
N=str1.indexOf("Qt"); //第一次出现的位置
N=str1.indexOf("Qt",2); //从位置2开始查找 第一次出现的位置
N=str1.lastIndexOf("\\"); //最后出现的位置
N=str1.indexOf("Qt",2,Qt::CaseInsensitive); //同上 不区分大小写 默认区分Qt::CaseSensitive
bool N2=str1.contains(".cpp"); //是否包含某字符串
N2=str1.contains(".cpp",Qt::CaseInsensitive); //同上 不区分大小写 默认区分
N2=str1.endsWith(".cpp",Qt::CaseInsensitive); //以某字符串结束
N2=str1.startsWith(".cpp",Qt::CaseInsensitive); //以某字符串开始
N=str1.count("Qt",Qt::CaseInsensitive); //统计字符串出现次数
str2=str1.toUpper();str2=str1.toLower(); //转为大/小写
str2=str1.trimmed(); //去掉字符串首尾空格
str2=str1.simplified(); //去掉首尾空格 并将中间连续的空格用单个空格替换
str2=str1.chop(4); //删除最后4个字符
str2=str1.insert(N,"nt"); //位置N处插入字符串 若N大于字符串长度则自动补空格
str2=str1.replace(pos,n,"ok"); //将pos处的n个字符替换为某字符串
str2=str1.replace('o','e'); //所有o替换为e 可设置大小写不敏感
str2=str1.remove(N,20); //移除N处20个字符 若大于字符串长度则N后全移除
QString DeStr="的";
QChar DeChar=QChar(DeChar[0].unicode());
str2=str1.remove(DeChar); //删除所有“的”

如果需要自定义函数,可全部定义到MainWindow类中,并将声明添加到private部分。

QString中有些接口函数用于将字符串转为整数,定义如下:

1
2
3
int toInt(bool *ok=nullptr,int base=10);
//还有toUInt、toLong、toULong、toShort、toUShort、toLongLong、toULongLong
float toFloat(bool *ok=nullptr); //还有toDouble

其中参数ok不为NULL时,返回转换是否成功,成功为true,失败为false并函数返回0。参数base表示使用的进制,可以是2~36。base为0时用C语言表示法,如“0x”开头是16进制,否则十进制。例如:

1
2
3
4
5
6
7
8
9
QString str="153";
int N=str.toInt(); //153
bool ok=false;
stsr="FF";
N=str.toInt(&ok,16); //255
str="10110111";
N=str.toInt(&ok,2); //183
str="0x5F";
N=str.toInt(&ok,0); //95

将整数或浮点数转为字符串:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
QString &setNum(int n,int base=10); //定义
int N=243;
QString str;
str.setNum(N); //"243"
str.setNum(N,16); //"f3"
str.setNum(N,2); //"11110011"

QString &setNum(float n,char format='g',int precision=6); //定义 还有double的重载
//format为格式字符 precision为精度位数
QString str;
double num=1245.2783;
str.setNum(num,'f',5); //小数点后5位 "1245.27830"
str.setNum(num,'E',5); //基数的小数点后5位 "1.24528E+03"
str.setNum(num,'g',5); //整数和小数点共5位 "1245.3"
str.setNum(num,'g',3); //"1.25e+03"

//此外还有静态函数QString::number 用法与setNum相同
QString str=QString::number(245); //"245"

静态函数QString::asprintf用于构造格式化输出各种数据的字符串,用法类似printf

1
2
3
QString UPC="UPC"; //不能汉字
QString str2=QString::asprintf("xxx %s",UPC.toLocal8Bit().data());
//%s只能是char*型字符串 所以将QString的UTF-16编码的字符串转为本地8位编码的QByteArray型数据 在得到QByteArray数据的char型指针

QString.arg函数功能类似QString::asprintf函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//多种重载
QString arg(int a,int fieldWidth=0,int base=10,QChar fillChar=QLatin1Char(' '));
QString arg(const QString &a,int fieldWidth=0,QChar fillChar=QLatin1Char(' '));
QString arg(double a,int fieldWidth=0,char format='g',int precision=-1,QChar fillChar=QLatin1Char(' '));
//fieldWidth是转成字符串占用的最少字符数 fillChar是大于数位宽度使用的填充字符

int year=2021,month=8,day=3,base=10;
QChar ch('0');
QString str1=QString("%1年%2月%3日").arg(year).arg(month,2,base,ch).arg(day,2,base,ch);

QString name="张三"; //可以汉字
int age=25;
QString str2=QString("xxx %1 xxx %2").arg(name).arg(age);

#include <QtMath>
double pi=M_PI;
int precision=8;
QString str3=QString("pi=%1").arg(pi,0,'f',precision); //pi=3.14159265

QLineEdit

两种操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
QString QLineEdit::text(); //定义 获取编辑框中字符串
int num=ui->editNum->text().toInt();
void QLine::setText(const QString &); //定义 设置编辑框中字符串
ui->editTotal->setText(str);
ui->editInput->setAlignment(Qt::AlignLeft); //文字左对齐
ui->editInput->setAlignment(Qt::AlignCenter); //文字居中
ui->editInput->setAlignment(Qt::AlignRight); //文字右对齐
QFont font=ui->editInput->font();
font.setBold(true); //设置粗体
font.setItalic(true); //设置斜体
font.setUnderline(true); //设置下划线
ui->editInput->setFont(font);
ui->editInput->setReadOnly(true);
ui->editInput->setEnabled(true);
ui->editInput->setClearButtonEnabled(true);
QPalette plet=ui->editInput->palette();
plet.setColor(QPalette:Text,Qt::black); //设置颜色 还有Qt::red、Qt::blue等
ui->editInput->setPalette(plet);

当clearButtonEnabled属性为true则编辑框右端出现圆形按钮,点击后可清除编辑框内容。

QSpinBox和QDoubleSpinBox

QSpinBox用于输入输出整数,一般显示十进制数,也可按其他进制显示。QDoubleSpinBox用于输入输出浮点数。两者通用属性有:

1
2
3
4
5
6
7
8
9
10
11
prefix/suffix 数字前/后缀
buttonSymbols 编辑框右侧调节按钮符号 可设置不显示调节按钮
text 只读 SpinBox显示的全部文字 包括前后缀
cleanText 只读 同上 不带前后缀和前后空格
minimum/maximum 数值范围最大/小值
singleStep 单击调节按钮的单步改变值
stepType 步长类型
value 当前显示值

displayIntegerBase QSpinBox特有 显示整数使用的进制
decimals QDoubleSpinBox特有 显示数值小数位数

QSpinBox对value属性读取和设置函数定义如下,QDoubleSpinBox同理,其他属性设置方法详情Qt帮助文档,如https://doc.qt.io/qt-6/zh/qspinbox.html 等。

1
2
3
int QSpinBox::value(void); //读取数值
void QSpinBox::setValue(int val); //设置数值
void QSpinBox::setRange(int minimum,int maximum); //设置最小/大值

对于stepType属性,有以下两个枚举常量:

1
2
QAbstractSpinBox::DefaultStep 默认步长 用singleStep设置固定步长
QAbstractSpinBox::AdaptiveDecimalStepType 自适应十进制步长 自动连续调整步长值为10^n 如value为0~10时singleStep为1 value为100~999时singleStep为10

QSpinBox有俩信号,QDoubleSpinBox同理:

1
2
void QSpinBox::valueChanged(int i); //value变化时发射 i为变化后的值
void QSpinBox::textChanged(const QString &text); //显示文字变化时发射 包含前后缀变化

按钮类

普通按钮QPushButton类、工具按钮QToolButton类、单选按钮QRadioButton类、复选框QCheckBox类,都有共同的父类QAbstractButton。QAbstractButton常用属性如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
QString text 显示文字
QIcon icon 图标
QKeySequence shortcut 快捷键
bool checkable 是否可复选 QPushButton默认false QRadioButton和QCheckBox默认true
bool checked 是否复选的状态
bool autoExclusive 一个布局或容器内同类按钮是否互斥 QCheckBox默认false QRadioButton默认true
bool autoRepeat 是否自动重复 为true则处于按下状态时重复发射clicked/pressed/released 初次重复延迟时间为autoRepeatDelay 重复周期为autoRepeatInterval 单位毫秒

QPushButton特有:
bool autoDefault 是否为自动默认按钮 即获得焦点时变成默认按钮 窗口基类必须为QDialog
bool default 是否为默认按钮 窗口基类必须为QDialog
bool flat 为true时无边框 点击或复选时才显示边框

QCheckBox特有:
tristate 是否允许3种复选状态 即Checked、Unchecked和PartiallyChecked

按钮可用isCheckedsetChecked函数读取和设置复选状态,QCheckBox还可用checkStatesetCheckState函数读取和设置复选状态。

按钮的常用信号如下:

1
2
3
4
5
6
7
8
void clicked(void); //点击按钮
void clicked(bool checked=false); //同上 checked为点击按钮后checked属性值
void pressed(void); //按下Space键或鼠标左键
void released(void); //释放Space键或鼠标左键
void toggled(bool checked); //按钮checked属性值变化

//QCheckBox特有:
void QCheckBox::stateChanged(int state); //复选框的复选状态变化 即当tristate属性为false时域toggled信号作用相同

滑动输入类

滑动条QSlider类、卷滚条QScrollBar类、表盘QDial类,都有共同的父类QAbstractSlider。