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); //显示文字变化时发射 包含前后缀变化

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ui->spinPrice->setDecimals(2);  //显示2位小数
ui->spinTotal->setDecimals(2); //显示2位小数
ui->spinDec->setStepType(QAbstractSpinBox::AdaptiveDecimalStepType); //自适应步长
ui->spinBin->setRange(0, 65535); //设置范围
ui->spinBin->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); //水平扩展
ui->spinBin->setRange(0, 65535); //设置范围
ui->spinBin->setDisplayIntegerBase(2); //二进制
ui->spinHex->setRange(0, 65535);
ui->spinHex->setDisplayIntegerBase(16); //十六进制
int num = ui->spinNum->value(); //读取数量,直接是整数
float price = ui->spinPrice->value(); //读取单价,直接是浮点数
float total = num * price;
ui->spinTotal->setValue(total); //直接显示浮点数
qDebug(ui->spinDec->cleanText().toLocal8Bit().data());

按钮类

普通按钮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信号作用相同

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ui->editInput->setAlignment(Qt::AlignLeft);
ui->editInput->setAlignment(Qt::AlignCenter);
ui->editInput->setAlignment(Qt::AlignRight);
QFont font = ui->editInput->font();
font.setBold(checked);
ui->editInput->setFont(font);
QFont font = ui->editInput->font();
font.setItalic(checked);
ui->editInput->setFont(font);
QFont font = ui->editInput->font();
font.setUnderline(checked);
ui->editInput->setFont(font);
ui->editInput->setReadOnly(checked);
ui->editInput->setEnabled(checked);
ui->editInput->setClearButtonEnabled(checked);
QPalette plet = ui->editInput->palette();
plet.setColor(QPalette::Text, Qt::black);
ui->editInput->setPalette(plet);

滑动输入类

滑动条QSlider类、卷滚条QScrollBar类、表盘QDial类,都有共同的父类QAbstractSlider。进度条QProgressBar的父类为QWidget。常用属性有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int minimum/maximum 数据范围最小/大值 默认0~99
int singleStep 变化最小数值 默认1
int pageStep PgUp或PgDn是变化数值 默认10
int value 组件当前值
int sliderPosition 滑块位置 tracking为true时等于value
bool tracking 为true则sliderPosition随value改变
Qt::Orientation orientation 水平/垂直方向
bool invertedAppearance 反向
bool invertedControls 反向按键

QSlider特有:
QSlider::TickPosition tickPosition 标尺刻度显示位置
tickInterval 标尺刻度间隔值 设0在singleStep和pageStep之间自动选择

QDial特有:
notchesVisible 外围小刻度线是否可见
notchTarget 表盘刻度间隔像素值
wrapping 表盘首尾可读是否连贯 默认false首尾不相连

QPrograssBar相关:
textDirection 文字方向 仅垂直进度条时使用 从上往下或从下往上
format 文字格式 默认%p%百分比 %v当前值 %m总步数

常用信号有:

1
2
3
4
5
6
void actionTriggered(int action); //触发一些动作 action用QAbstractSlider::SliderAction枚举值表示 如SliderToMinimum表示滑动到最小值
void rangeChanged(int min,int max); //minimum或maximum属性值发生变化
void sliderMoved(int value); //鼠标拖动滑块 value当前值 tracking为false则释放鼠标时才发射
void sliderPressed(); //滑块上按下鼠标
void sliderReleased(); //滑块上释放鼠标
void valueChanged(int value); //value值变化

常用方法:

1
2
3
4
5
6
7
8
9
10
void setRange(int min,int max); //设置minimum/maximum值
setvalue(); //改变值

//QProgressBar相关
void setRange(int minimum,int maximum);
void reset(void); //进度值设为0
setValue(); //设value
setTextVisible();
setInvertedAppearance();
setFormat(); //显示格式 如"%p%"

示例:

1
2
3
4
5
ui->progressBar->setValue(value);
ui->progressBar->setTextVisible(checked);
ui->progressBar->setInvertedAppearance(checked);
ui->progressBar->setFormat("%p%");
ui->progressBar->setFormat("%v");

日期时间类

有时间数据QTime类、日期数据QDate类、日期时间数据QDateTime类用于维护日期时间数据,他们没有父类,仅用于存储数据。日期时间控件类有时间组件QTimeEdit类、日期组件QDateEdit类、日期时间组件QDateTimeEdit类、日历组件QCalendarWidget类。

QTime类用于存储和操作时间数据,使用24小时制,常用方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <QTime>
QTime::QTime(int h,int m,int s=0,int ms=0); //初始化方法 小时 分钟 秒 毫秒
static QTime QTime::currentTime(); //创建对象并初始化为系统当前时间
int hour(); //获取小时
int minute(); //获取分钟
int second(); //获取秒
int msec(); //获取毫秒
bool setHMS(int h,int m,int s,int ms=0); //设置时间
int msecsSinceStartOfDay(); //返回从00:00:00开始毫秒数
QTime addSecs(int s); //延后s秒 可正可负
int secsTo(QTime t); //与t相差秒数
QString toString(const QString &format); //转为字符串

//例如
QTime TM1(13,24,5);
QString str=TM1.toString("HH:mm:ss");
QTime TM2=TM1.addSecs(150);
TM2=QTime::currentTime();
printf("%d %d %d %d",TM2.hour(),TM2.minute(),TM2.second(),TM2.msec());

QDate类用于存储和操作日期数据,常用方法有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
QDate::QDate(int year,int month,int day); //初始化方法 年月日
static QDate QDate::currentDate();
int year(); //获取年
int month(); //获取月
int day(); //获取日
int dayOfWeek(); //获取星期几 1是星期一 7是星期天
int dayOfYear(); //日期是一年中第一天 1是第一天
bool setDate(int year,int month,int day); //设置年月日
void getDate(int* year,int* month,int* day); //返回当前年月日
QDate addYears(int nyears); //加nyears年
QDate addMonths(int nmonths); //加nmonths月
QDate addDays(qint64 ndays); //加ndays天
qint64 daysTo(QDate d); //返回相差天数 返回值可负
QString toString(const QString &format); //转为字符串 如yyyy-MM-dd
static bool QDate::isLeapYear(int year); //是否为闰年

//例如
QDate DT(2021,8,29);
QString str=DT.toString("yyyy年MM月dd日");

QDateTime类包含日期时间数据,很多函数同QDate和QTime,其他常用函数如下,每个函数原型有很多重载,这里不列出参数。

1
2
3
4
5
6
7
8
9
10
11
QDate date(); //返回日期
QTime time(); //返回时间
qint64 toMSecsSinceEpoch(); //返回与UTC时间相差毫秒数
void setMSecsSinceEpoch(qint64 msecs); //设置与UTC时间相差毫秒数作为日期时间数据
qint64 toSecsSinceEpoch(); //返回与UTC时间相差秒数
void setSecsSinceEpoch(qint64 secs); //设置与UTC时间相差秒数作为日期时间数据
QString toString(const QString &format,QCalendar cal=QCalendar()); //转为字符串
QDateTime fromString(const QString &string,const QString &format,QCalendar cal=QCalendar()); //字符串转为时间日期类
QDateTime toUTC(); //转为UTC时间
static QDateTime QDateTime::currentDateTime(); //返回系统当前日期时间 本地时间
static QDateTime QDateTime::currentDateTimeUtc(); //返回系统当前日期时间 UTC时间

常用格式字符串有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
d 天 1~31
dd 天 01~31
M 月 1~12
MM 月 01~12
yy 年 00~99
yyyy 年 2016
h 小时 0~23或1~12
hh 小时 00~23或01~12
H 小时 0~23
HH 小时 00~23
m 分钟 0~59
mm 分钟 00~59
s 秒 0~59
ss 秒 00~59
z 毫秒 0~999
zzz 毫秒 000~999
AP或A AM/PM
ap或a am/pm

QDateTimeEdit是QTimeEdit和QDateEdit的父类,而QDateTimeEdit的父类是QAbstractSpinBox。例如QDateTimeEdit分为小时、分钟、秒3个输入段,常见属性有:

1
2
3
4
QDateTimeEdit::Section currentSection //光标所在输入段
currentSectionIndex //同上 序号
bool calendarPopup //是否允许弹出日历选择框
displayFormat //日期时间数据显示格式

常见方法有:

1
2
3
4
5
6
QDateTime dateTime(); //返回编辑框日期时间数据
void setDateTime(const QDateTime &dateTime); //设置日期时间数据
QDate date(); //返回编辑框日期数据
void setDate(QDate date); //设置日期数据
QTime time(); //返回编辑框时间数据
void setTime(QTime time); //设置时间数据

常见信号有:

1
2
3
void dateChanged(QDate date); //日期变化时
void timeChanged(QTime time); //时间变化时
void dateTimeChanged(const QDateTime &datetime); //日期或时间变化时

QCalendarWidget类用于选择日期,常用属性略,常用接口如下:

1
2
3
4
void showToday(); //显示系统当前日期的日历
void showSelectedDate(); //显示所选日期的月历
QDate selectedDate(); //返回选择的日历
void setSelectedDate(QDate date); //设置选择的日期

常用信号有:

1
2
3
4
void activated(QDate date); //日历组件上按Enter键或双击一个日期
void clicked(QDate date); //点击一个有效日期
void currentPageChanged(int year,int month); //当前显示的月历变化时
void selectedChanged(); //当前选择的日期变化时

示例:

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
QDateTime curDateTime = QDateTime::currentDateTime(); //读取当前日期时间
ui->timeEdit->setTime(curDateTime.time()); //设置时间
ui->editTime->setText(curDateTime.toString("hh:mm:ss"));//转换为字符串显示
ui->dateEdit->setDate(curDateTime.date());//设置日期
ui->editDate->setText(curDateTime.toString("yyyy-MM-dd"));//转换为字符串显示
ui->dateTimeEdit->setDateTime(curDateTime);//设置日期时间
ui->editDateTime->setText(curDateTime.toString("yyyy-MM-dd hh:mm:ss"));//转换为字符串显示
QString str = ui->editTime->text();
QTime tm = QTime::fromString(str, "hh:mm:ss"); //从字符串转换为QTime
ui->timeEdit->setTime(tm); //设置时间
QString str = ui->editDate->text(); //读取字符串表示的日期
QDate dt = QDate::fromString(str, "yyyy-MM-dd");//从字符串转换为 QDate
ui->dateEdit->setDate(dt);//设置日期
QDateTime datetime = QDateTime::fromString(str, "yyyy-MM-dd hh:mm:ss"); //从字符串转换为 QDateTime
ui->dateTimeEdit->setDateTime(datetime);//设置日期时间
QDate dt = ui->calendarWidget->selectedDate(); //读取选择的日期时间
QString str = dt.toString("yyyy年M月d日");
ui->editCalendar->setText(str);
QTime TM1(13, 24, 5); //定义变量,初始化设置时间
QString str = TM1.toString("HH:mm:ss");
qDebug("Original time= %s", str.toLocal8Bit().data());
QTime TM2 = TM1.addSecs(150); //延后150秒
str = TM2.toString("HH:mm:ss");
qDebug("150s later, time= %s", str.toLocal8Bit().data());
TM2 = QTime::currentTime(); //获取当前时间
str = TM2.toString("HH:mm:ss zzz");
qDebug("Current time= %s", str.toLocal8Bit().data());
qDebug("Hour= %d", TM2.hour());
qDebug("Minute= %d", TM2.minute());
qDebug("Second= %d", TM2.second());
qDebug("MSecond= %d", TM2.msec());
QDate DT1(2021, 7, 6); //初始化日期
QString str = DT1.toString("yyyy-MM-dd");
qDebug("DT1= %s", str.toLocal8Bit().data());
QDate DT2;
DT2.setDate(2021, 8, 25); //设置日期
str = DT2.toString("yyyy-MM-dd");
qDebug("DT2= %s", str.toLocal8Bit().data());
qDebug("Days between DT2 and DT1= %d", DT2.daysTo(DT1)); //DT2与DT1之间相差的天数
DT2 = QDate::currentDate(); //获取当前日期
str = DT2.toString("yyyy-MM-dd");
qDebug("Current date= %s", str.toLocal8Bit().data());
qDebug("Year= %d", DT2.year());
qDebug("Month= %d", DT2.month());
qDebug("Day= %d", DT2.day());
qDebug("Day of week= %d", DT2.dayOfWeek()); //1表示星期一,7表示星期天
QDateTime DT1 = QDateTime::currentDateTime(); //系统当前日期时间
QString str = DT1.toString("yyyy-MM-dd hh:mm:ss");
qDebug("DT1= %s", str.toLocal8Bit().data());
QDate dt = DT1.date(); //日期部分
str = dt.toString("yyyy-MM-dd");
qDebug("DT1.date()= %s", str.toLocal8Bit().data());
QTime tm = DT1.time(); //时间部分
str = tm.toString("hh:mm:ss zzz");
qDebug("DT1.time()= %s", str.toLocal8Bit().data());
qint64 MS = DT1.toSecsSinceEpoch(); //转换为秒数
qDebug("DT1.toSecsSinceEpoch()= %lld", MS);
MS += 120;
DT1.setSecsSinceEpoch(MS); //加120秒以后
str = DT1.toString("yyyy-MM-dd hh:mm:ss");
qDebug("DT1+120s= %s", str.toLocal8Bit().data());

QTimer/QElapsedTimer

QTimer类是软件定时器,父类是QObject,功能是设置以毫秒为单位的定时周期,进行连续定时或单次定时。定时溢出时发射timeout信号。QTimer常用属性有:

1
2
3
4
5
6
7
8
9
10
11
12
int interval; //定时周期 单位毫秒
bool singleShot; //true单次定时
Qt::TimerType timerType; //定时器精度类型
bool active; //只读 true表示定时器正在运行
int remainingTime; //只读 到发生定时溢出的剩余时间 单位毫秒 未启动-1 已发生定时溢出为0

/*
Qt::TimerType成员有:
Qt::PreciseTimer 毫秒级精度
Qt::CoarseTimer 定时误差在定时周期值5%以内
Qt::VeryCoarseTimer 秒级精度
*/

常用槽函数:

1
2
3
void QTimer::start(); //启动定时器
void QTimer::start(int msec); //启动定时器 定时周期msec毫秒
void QTimer::stop(); //停止计时器

常用信号:

1
void QTimer::timeout(); //定时溢出时发射

常用静态函数:

1
2
3
4
5
6
7
8
void QTimer::singleShot( //创建和启动单次定时器
int msec, //定时周期 单位毫秒
Qt::TimerType timerType, //精度类型
const QObject* receiver, //接受timeout信号的对象
const char* member //timeout关联的槽函数
);
//例如:
QTimer::singleShot(1000,Qt::PreciseTimer,this,&Widget::do_timer_shot);

QElapsedTimer类是软件计时器,没有父类,用于计算两个事件的间隔时间,精度纳秒。常用接口函数有:

1
2
3
4
5
#include <QElapsedTimer>
void start(); //复位并启动计时器
qint64 elapsed(); //返回流逝的时间 单位毫秒
qint64 nsecsElapsed(); //同上 单位纳秒
qint64 restart(); //重启计时器

QLCDNumber是模仿LCD数值显示的组件,可显示整数或浮点数,常用属性有:

1
2
digitCount 数字位数
smallDecimalPoint 是否显示小数点 bool

示例:

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
class Widget : public QWidget{
Q_OBJECT
private:
QTimer* m_timer; //定时器
QElapsedTimer m_counter; //计时器
public:
//...
private slots:
void do_timer_timeout(); //自定义槽函数,与定时器的timeout()信号关联
void do_timer_shot(); //与单次定时器关联的槽函数
//...
};
m_timer = new QTimer(this); //创建定时器
m_timer->stop(); //先停止定时器
m_timer->setTimerType(Qt::CoarseTimer); //定时器精度等级
QApplication::beep(); //使系统的蜂鸣器发声
QTime curTime = QTime::currentTime(); //获取当前时间
ui->LCDHour->display(curTime.hour()); //LCD显示 小时
ui->LCDMin->display(curTime.minute()); //LCD显示 分钟
ui->LCDSec->display(curTime.second()); //LCD显示 秒
if (m_timer->isSingleShot()) { //如果是单次定时,显示流逝的时间
int tmMsec = m_counter.elapsed(); //毫秒数
QString str = QString("流逝的时间:%1毫秒").arg(tmMsec);
ui->labElapsedTime->setText(str); //显示流逝的时间
ui->btnStart->setEnabled(true);
ui->btnOneShot->setEnabled(true);
ui->btnStop->setEnabled(false);
};
int tmMsec = m_counter.elapsed(); //流逝的时间:毫秒
QString str = QString("流逝的时间:%1毫秒").arg(tmMsec);
m_timer->setInterval(ui->spinBoxIntv->value()); //设置定时器的周期
m_timer->setSingleShot(true);
m_timer->setTimerType(Qt::PreciseTimer);
m_timer->start(); //启动定时器
m_counter.start(); //启动计时器
m_timer->stop(); //定时器停止
int tmMsec = m_counter.elapsed(); //流逝的时间:毫秒
int ms = tmMsec % 1000; //余数毫秒
int sec = tmMsec / 1000; //整秒
QTimer::singleShot(intv, Qt::PreciseTimer, this, &Widget::do_timer_shot);
m_counter.start(); //启动计时器

QComboBox

QComboBox是下拉列表框,可选择也可输入。下拉列表的每个列表项可存储一个或多个QVariant数据。常用属性有:

1
2
3
4
5
6
7
8
9
bool editable 是否可编辑 false只能选择 true可输入
QString currentText 当前显示文字
int currentIndex 当前选中项序号 0开始 -1没项被选中
int maxVisibleItems 下拉列表显示的最大条数 默认10 超过后显示卷滚条
int maxCount 下拉列表项最大条数
QComboBox::InsertPolicy insertPolicy 用户编辑的新文字插入列表的方式 默认InsertAtBottom插入列表末尾 NoInsert不允许插入
QString placeholderText 占位文字 当currentIndex为-1时下拉列表框显示的文字 改文字不出现在下拉列表里
bool duplicatesEnabled 是否允许列表中出现重复项
int modelColumn 下拉列表中数据在数据模型中列编号 默认0

QCombox使用模型/视图结构存储和显示下拉列表数据,下拉列表数据实际存储在QStandardItemModel模型中,用QListView的子类组件显示。

常用信号如下,其中index为项序号,text为项文字:

1
2
3
4
5
6
7
void activated(int index); //选择下拉列表一个项时
void currentIndexChanged(int index); //currentIndex变化时
void currentTextChanged(const QString &text); //currentText变化时
void editTextChanged(const QString &text); //编辑框中修改文字
void highlighted(int index); //移动鼠标使某一项被高亮显示
void textActivated(const QString &text); //选择下拉列表一个项时
void textHighlighted(const QString &text); //某一项高亮显示时

常用操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void addItem(const QString &text,const QVariant &userData=QVariant()); //添加一个项 不带图标
void addItem(const QIcon &icon,const QString &text,const QVariant &userData=QVariant()); //添加一个项 带图标
void addItems(const QStringList &texts); //添加多个项
void insertItem(int index,const QString &text,const QVariant &userData=QVariant()); //插入一个项 index为插入项位置序号 大于总项数则插入末尾
void insertItem(int index,const QIcon &icon,const QString &text,const QVariant &userData=QVariant());
void insertItems(int index,const QStringList &list);
void removeItem(int index); //移除序号为index的项
void clear(void); //清除整个列表
int count(void); //返回总项数
int currentIndex(void); //返回当前项序号
QString currentText(void); //返回当前项文字
QVariant currentData(int role=Qt::UserRole); //返回当前项用户数据 role为角色 如需设置第二个用户数据时传1+Qt::UserRole
QString itemText(int index); //返回某项文字
QIcon itemIcon(int index); //返回某项图标
QVariant itemData(int index,int role=Qt::UserRole); //返回某项用户数据
void setItemText(int index,const QString &text); //设置某项用户数据
void setItemIcon(int index,const QIcon &icon); //设置某项图标
void setItemData(int index,const QVariant &value,int role=Qt::UserRole);

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
QIcon icon;
icon.addFile(":/images/icons/aim.ico"); //从资源文件中获取图标
ui->comboBox->clear(); //清除列表
for (int i = 0; i < 20; i++) {
ui->comboBox->addItem(icon, QString("Item %1").arg(i)); //带图标
ui->comboBox->addItem(QString("Item %1").arg(i)); //不带图标
};
QStringList strList;
strList<<"北京"<<"上海"<<"天津"<<"河北省"<<"山东省"<<"山西省";
ui->comboBox->addItems(strList);
ui->comboBox->setEditable(checked);
//QMap自动根据 key排序
QMap<QString, int> City_Zone;
City_Zone.insert("北京", 10);
City_Zone.insert("上海", 21);
//...
ui->comboBox2->clear();
foreach(const QString& str, City_Zone.keys())
ui->comboBox2->addItem(str, City_Zone.value(str));
Q_UNUSED(index);
QString city = ui->comboBox2->currentText(); //标题
QString zone = ui->comboBox2->currentData().toString(); //用户数据
ui->plainTextEdit->appendPlainText(city + ": 区号 = " + zone);

QMainWindow

QMainWindow是主窗口类,有菜单栏、工具栏、状态栏等界面元素。设计菜单栏、工具栏、按钮下拉菜单、组件快捷菜单时,需要QAction类。QAction对象时实现某个功能的动作,称为Action。Action编辑器中新建时有若干选项。