0


第五章 常用类

一、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++类的步骤:

  1. 选中项目名称,鼠标右键,点击“添加新文件”

  2. 在弹出的窗口中,安装下图所示进行操作。

  1. 在弹出的窗口中,输入类名后,点击“下一步”。

  1. 在项目管理界面,直接点击“完成”。可以在项目中看到对应的文件。

  1. 在头文件和源文件中进行声明和定义。

示例代码下载链接: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:

  1. 编程字体选择

编程字体都是等宽的,可以使用下面的网站进行选择

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;
}
标签: qt ui 开发语言

本文转载自: https://blog.csdn.net/m0_69124108/article/details/128524523
版权归原作者 落下的小木头 所有, 如有侵权,请联系我们删除。

“第五章 常用类”的评论:

还没有评论