一、QString 字符串类(掌握)
QString是Qt中的字符串类,QString使用Unicode编码。C和C++使用的ASCII编码中,一个字符是8位的char,但是在Qt中因为使用的时候QString,因此字符串中的每个字符是一个16位的QChar,完美支持中文。
QString可以通过下面的函数完成与数字之间的转换。
- QString QString::number(int n, int base = 10) [static]
数字 → 字符串
参数1:要转换的数字
参数2:进制,默认为10进制
返回值:一个新生成的字符串对象
- QString & setNum(int n, int base = 10)
数字 → 字符串
参数1:要转换的数字
参数2:进制,默认为10进制
返回值:当前类的对象,支持链式调用
- int toInt(bool * ok = 0, int base = 10) const
字符串 → 数字
参数1:转换是否成功 bool类型的指针
参数2:进制,默认为10进制
返回值:转换后的结果,转换失败返回0
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
// Unicode编码
QString text = "すふせそシ";
qDebug() << text;
text = "āáǎà";
qDebug() << text;
// int → QString
int i = 16;
text = QString::number(i,16);
qDebug() << text; // "10"
QString str;
str.setNum(255,16).append("A");
qDebug() << str; // "ffA"
str = "GAA";
// QString → int
bool result;
//result的结果表示是否转换成功 i是转换的结果
i = str.toInt(&result,16);
qDebug() << "转换是否成功:" << result;
qDebug() << "转换结果:" << i;
}
Dialog::~Dialog()
{
delete ui;
}
QString相关的字符串处理函数基本兼容std::string的API,在此基础上,增加了符合Qt设计规范的相关API,建议记忆相关核心词汇后,使用时查阅文档。
二、创建定义C++类(掌握)
在C++的课程中,所有创建的类都在一个cpp文件中,Qt中每个类通常都是单独的文件,且声明与定义分离。
下面是一个创建自定义C++类的步骤:
选中项目名称,鼠标右键,点击“添加新文件”
在弹出的窗口中,安装下图所示进行操作。
- 在弹出的窗口中,输入类名后,点击“下一步”。
- 在项目管理界面,直接点击“完成”。可以在项目中看到对应的文件。
- 在头文件和源文件中进行声明和定义。
示例代码下载链接:https://pan.baidu.com/s/1OurKPhQIM5a9p8UI3rWhmQ
提取码:hqyj
--来自百度网盘超级会员V6的分享
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QDebug>
// 引入文件
#include "student.h"
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H
student.h
#ifndef STUDENT_H
#define STUDENT_H
// 引入头文件
#include <QString>
class Student
{
public:
Student(QString name,int age,QString major);//构造函数目前只是个声明
QString getName() const;
void setName(const QString &value);
int getAge() const;
void setAge(int value);
QString getMajor() const;
void setMajor(const QString &value);
private:
QString name;
int age;
QString major;
};
#endif // STUDENT_H
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
// 创建一个学生对象
Student s("张三",22,"物联网");
s.setName("李四");
qDebug() << s.getName() << s.getAge() << s.getMajor();
}
Dialog::~Dialog()
{
delete ui;
}
student.cpp
#include "student.h"
//构造函数 和初始化列表进行的成员赋值
Student::Student(QString name,int age,QString major)
:name(name),age(age)
{
this->major = major;
}
QString Student::getName() const
{
return name;
}
void Student::setName(const QString &value)
{
name = value;
}
int Student::getAge() const
{
return age;
}
void Student::setAge(int value)
{
age = value;
}
QString Student::getMajor() const
{
return major;
}
void Student::setMajor(const QString &value)
{
major = value;
}
Tips:
- 编程字体选择
编程字体都是等宽的,可以使用下面的网站进行选择
Coding Font by Typogram – Find Your True Love of Coding Fonts
也可以使用微软内置的Consolas字体
三、容器(掌握)
Qt的容器类相比STL的容器类更轻巧、安全和易于使用,本次顺序容器使用QList进行讲解,关联容器使用QMap进行讲解。
3.1 QList
QList几乎支持所有C++中顺序容器的操作方式,除此之外还增加了很多Qt中新的操作方式,例如迭代器增加了Java风格。
C++ STL
Java
等效
QList<T>::const_iterator
QListIterator<T>
等效
QList<T>::iterator
QMutableListIterator<T>
在C++中取出单元素,推荐使用at函数代替[],原因at函数更安全;Qt中仍然推荐使用at函数,因为at函数的性能更强。
可以把****QStringList等效为QList<String>
示例代码下载链接:百度网盘 请输入提取码
提取码:hqyj
--来自百度网盘超级会员V6的分享
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
Student s1("张三",22,"物联网");
Student s2("李四",23,"电子信息工程");
Student s3("王五",24,"自动化");
Student s4("赵六",25,"计算机");
// 创建QList对象
QList<Student> class22092;
// 增加元素
class22092.push_back(s1); // 向后追加
class22092.push_front(s2); // 向前追加
class22092.append(s3); // 向后追加
// 链式连续追加
class22092 << s4 << s4 << s4;
// 插入元素
// 参数1:插入的位置
// 参数2:插入的元素
class22092.insert(1,s4);
// 删除元素(倒数第二个) //因为他这个指针是指向最后一个元素的后面
class22092.removeAt(class22092.size()-2);
// 修改元素(把第一个元素更改为赵六)
// 参数1:替换元素的位置
// 参数2:替换的新元素
class22092.replace(0,s4);
// 取出元素(第二个)
qDebug() << class22092[1].getName();
qDebug() << class22092.at(1).getName();
// C++ STL迭代器
for(QList<Student>::const_iterator iter = class22092.begin();
iter != class22092.end(); iter++)
{
Student s = *iter;
qDebug() << s.getName() << s.getAge() << s.getMajor();
}
qDebug() << "------------------------";
// 清空元素
class22092.clear();
// 判断是否为空
qDebug() << class22092.empty();
qDebug() << class22092.isEmpty();
// 创建一个Java风格的迭代器对象
QListIterator<Student> iter(class22092);
// 遍历
while(iter.hasNext()) // 判断当前迭代器指针的位置后面有无元素
{
// 向后移动迭代器指针并取出元素
Student s = iter.next();
qDebug() << s.getName() << s.getAge() << s.getMajor();
}
}
Dialog::~Dialog()
{
delete ui;
}
3.2 QMap
与std:map功能类似。
QMap的遍历也同时支持C++ STL风格和Java风格。
C++ STL
Java
等效
QMap<T>::const_iterator
QMapIterator<T>
等效
QMap<T>::iterator
QMapListIterator<T>
示例代码下载链接:百度网盘 请输入提取码
提取码:hqyj
--来自百度网盘超级会员V6的分享
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
// 头文件
#include <QMap>
#include <QDebug>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
// 创建一个QMap对象
QMap<QString,QString> map;
// 添加数据
// 键 值
map["姓名"] = "杨过";
map.insert("年龄","22岁"); // 参数1:键;参数2:值
// 先判断数据在不在,如果在再修改
if(map.contains("姓名"))
// 修改
map["姓名"] = "杨康";
// 支持直接输出,前提键值对的类型也支持直接输出(QList也支持)
qDebug() << map;//QMap(("姓名", "杨康")("年龄", "22岁"))
// 取出值之前先判断键值对在不在
if(map.contains("姓名"))
{
// 取出数值
QString text = map["姓名"];
qDebug() << text;//"杨康" 是直接取得第二个参数就是值
}
// 删除键值对
if(map.remove("年龄") != 0)
{
qDebug() << "删除年龄键值对成功!";
}
qDeubug() << map;//QMap(("姓名", "杨康"))
// 不需要先判断键值对在不在,因为如果不在,返回值设定的默认值
QString text = map.value("年龄","N/A");
qDebug() << text;//"N/A" 结果为什么是"N/A" 因为我们上面把年龄给删除了
// 再加点
map["武功"] = "黯然销魂掌";
map["伴侣"] = "姑姑";
map["扮演者"] = "黄晓明";
// STL风格迭代器遍历
for(QMap<QString,QString>::const_iterator iter = map.begin();
iter!=map.end();iter++)
{
qDebug() << iter.key() << iter.value();
}
qDebug() << "-----------------------";
// Java风格迭代器 容器对象
QMapIterator<QString,QString> iter(map);
while(iter.hasNext())
{
iter.next(); // 向后移动
// 取出移动后指向的键值对数据
qDebug() << iter.key() << iter.value();
}
}
Dialog::~Dialog()
{
delete ui;
}
四、跨平台数据类型
C++本身不具备跨平台特性,因为C++在不同的平台下运行可能会出现数据类型长度不一致等问题,Qt为了改善上述特性,设计了一些跨平台的数据类型,如果代码有跨平台需求,需要使用这些支持跨平台的数据类型。
Qt的数据类型与传统数据类型使用方式一致,并且可以相互转换。
另外,为了API的统一,Qt还增加QVariant的数据类型。这个类型扮演者一个通用联合的类型绝大多数常规的qt类型 qt中常见的数据类型都可以转换成该类型 属于一个中间的活跃状态
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
int i = 23456;
// Qt跨平台64位整型
qint64 num = i;
qDebug() << ++num; // 23457
// 创建一个QVariant对象
QVariant value(num);//构造函数
// 转换为QString toString()这个函数就是获取内容数据
QString text = value.toString();
qDebug() << text; // "23457"
}
Dialog::~Dialog()
{
delete ui;
}
五、QDateTime 日期时间类
QDateTime类是Qt中处理日期和时间的类,QDateTime可以分成两个类(不是继承):QDate类和QTime类,QDate类只能处理日期,QTime类只能处理时间,用法与QDateTime类似,本次只讲解QDateTime类。
常用函数如下:
qint64 QDateTime::currentMSecsSinceEpoch() [static]
返回1970年1月1日到现在的毫秒数 主要用来打时间戳 返回当前事件函数
qint64 QDateTime::currentMSecsSinceEpoch() [static]
返回一个包含当前时区的日期和时间数据的QDateTime对象,数据的来源是操作系统。
注意:如果一个类你要拿他的对象不用new 那么只有一种办法 就是通过静态成员函数的返回值来获得
只要有了这个QDateTime对象就可以做获取任意的时间和数据 这个函数是一个成员函数,因为获得了对象后就可以调用成员函数了
QString QDateTime::(const QString & format) const
返回指定格式的日期和时间数据,参数为格式:
时间和日期相关的组件有
示例代码下载链接:https://pan.baidu.com/s/1_9MQrpNeWJnI8xBsD8ixCg
提取码:hqyj
--来自百度网盘超级会员V6的分享
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
// 头文件
#include <QDateTime>
#include <QDebug>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
private:
Ui::Dialog *ui;
private slots:
//时间改变发信号
// 与void dateTimeChanged(const QDateTime & datetime)连接
void dateTimeChangedSlot(QDateTime);
};
#endif // DIALOG_H
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
// 时间戳 想看看初始化下面那一句话多久
qint64 start = QDateTime::currentMSecsSinceEpoch();
ui->setupUi(this); // 初始化Designer中子组件对象
qDebug() << QDateTime::currentMSecsSinceEpoch()-start;//45 子组件初始话完成用来45毫秒
qDebug() << start; //打印这个初始化的时间就用上一句代码功能
// 生成“随机数”
// 设置随机数种子
qsrand(start);
// 生成一个1-10的随机数
int rand = qrand()%10+1;
qDebug() << rand;
// 打印当前时间和日期
//QDateTime::currentDateTime()就是获得的QDateTime对象 最后返回一个字符串类型
QString dt = QDateTime::currentDateTime().toString();
qDebug() << dt;//"周二 1月 3 09:47:52 2023" 当前日期与事件
// 连接信号槽
connect(ui->dateTimeEdit,SIGNAL(dateTimeChanged(QDateTime)),
this,SLOT(dateTimeChangedSlot(QDateTime)));
//该对话框里面的事件发生改变就是发射信号 窗口接受该信号并触发相应的槽函数
}
void Dialog::dateTimeChangedSlot(QDateTime dt)
{
// dt.toString是基于发射过来的时间和日期转换出来的格式
//QDateTime::currentDateTime().是当前的时间和日期
//获取到你编辑的事件并以改格式打印出来
QString text = dt.toString("yyyy-MM-dd hh:mm:ss");
qDebug() << text;
}
Dialog::~Dialog()
{
delete ui;
}
六、QTimer 定时器类(肉眼不可见)
和Qputtongroup很像
定时器有两种功能:
- 一次性定时器:延迟固定时间执行特定代码
- 周期性定时器:每隔一段时间执行特定代码
常用属性如下:
因为不是组件图像界面不可见只能看函数手册
- active : const bool
定时器的运行状态,使用bool isActive() const函数获取当前状态。
- interval : int
如果是一次性定时器,此属性表示延迟执行的时间;如果是周期性定时器,此属性表示间隔时间。时间单位是毫秒,需要设置正数。
- singleShot : bool
表示是否是一次性
常用函数如下:
void QTimer::start() [slot]//槽函数
启动定时器,如果调用时定时器正在运行,则会停止当前运行,重新开始运行。
void QTimer::stop() [slot]
停止正在运行的定时器。
void QTimer::timeout() [signal]
时间到了发射的信号。
一次性定时器示例代码下载链接:百度网盘 请输入提取码
提取码:hqyj
--来自百度网盘超级会员V6的分享
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
// 头文件
#include <QTimer>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
private:
Ui::Dialog *ui;
QTimer *timer;//创建事件的推内存对象 因为就算一次性的定时也不能让他丢 周期性更不能
private slots:
// 点击按钮的槽函数
void buttonClickedSlot();
};
#endif // DIALOG_H
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
// 创建了一个定时器对象
timer = new QTimer(this);
// 连接信号槽
connect(ui->pushButton,SIGNAL(clicked()),
this,SLOT(buttonClickedSlot()));
//点击按钮触发槽函数 并获取要延迟的事件为几秒
connect(timer,SIGNAL(timeout()),
this,SLOT(close())); // 定时器到点
//然后定时器发射延时信号 当到了延时的事件就关闭窗口
}
Dialog::~Dialog()
{
delete timer;//手动管理释放
delete ui;
}
void Dialog::buttonClickedSlot()
{
// 屏蔽按钮 避免重新记时
ui->pushButton->setEnabled(false);
// 获取输入的时间 因为是毫秒级的变成秒级
int time = ui->spinBox->value()*1000;
// 给定时器设定时间
timer->setInterval(time);
// 设置为一次性
timer->setSingleShot(true);
// 启动定时器
timer->start();
}
周期性定时器示例代码下载链接:百度网盘 请输入提取码
提取码:hqyj
--来自百度网盘超级会员V6的分享
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
// 头文件
#include <QTimer>
#include <QDateTime>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
private:
Ui::Dialog *ui;
QTimer* timer;
private slots:
// 到点了通知的槽函数void QTimer::timeout()
void timeoutSlot();
};
#endif // DIALOG_H
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
timeoutSlot(); // 手动刷新时间显示 小bug为什么一开始是零,零食第八行开始显示的,第一次触发了信号槽零才不显示,什么时候触发了信号槽是调用了start了之后再过一秒钟,所以从零开始到第一次显示间隔了不止一秒钟
解决方案加个时间刷新再该行
timer = new QTimer(this);
// 连接信号槽
//发射者是定时器 到时间给我发信号 你设置的延迟是1秒道到一秒就发射信号,接收者是窗口,
然后执行槽函数
connect(timer,SIGNAL(timeout()),this,SLOT(timeoutSlot()));
timer->setSingleShot(false); // 周期性
timer->setInterval(1000); // 间隔时间1s
timer->start(); // 启动
// 设置组件的数字长度为8
ui->lcdNumber->setDigitCount(8);
}
void Dialog::timeoutSlot()
{
// 获取当前时间
QString time = QDateTime::currentDateTime().toString("hh:mm:ss");
// 更新组件显示时间
ui->lcdNumber->display(time);
}
Dialog::~Dialog()
{
// 如果正在运行
if(timer->isActive())
// 停止运行
timer->stop();
delete timer;
delete ui;
}
版权归原作者 落下的小木头 所有, 如有侵权,请联系我们删除。