Qt学习笔记—Qt开发体系基础


前言`

本篇文章介绍Qt开发体系基础,包括Qt环境的安装、Qt Creator工具的介绍和使用、Qt信号与槽机制以及 Qt常见的数据类型


一、Qt环境安装(Windows)

Qt下载地址:官方版本
下载完之后如图:
我这里以5.12.8版本为例
双击打开

在这里插入图片描述
点击Next,输入自己的账号,没有的话在Sign-up栏创建一个
在这里插入图片描述
登录完成后点击Next,然后一直下一步到这个界面,选择安装目录(建议D盘,因为Qt比较大 10g以上)

在这里插入图片描述
如图按照我的勾选这些,

在这里插入图片描述

然后一直下一步安装就行,安装完成后会打开Qt Creator界面,说明安装成功啦
说明一下,安装完成之后一般桌面上是没有Qt Creator的快捷方式的,在开始菜单栏里可以找到,或者找到安装路径,自己创建一个快捷方式
例:D:\Qt5.12.8\Tools\QtCreator\bin\qtcreator.exe 这是我的路径,可以参考,一般都一样
在这里插入图片描述
然后右键,选择创建快捷方式

在这里插入图片描述

再将创建的快捷方式拖到桌面上来就行了,到此Qt的安装步骤就完成啦

二、Qt Creator工具的介绍和使用

1.创建项目

点击文件,选着新建文件或项目

在这里插入图片描述
打开后有多个选项,如下:
在这里插入图片描述
选择第一个会有GUI界面,在开发中,我们一般选择第一个;第二个是控制台程序,好吧,直说就相当于 Microsoft Visual Studio,只不过多一些库。
这里我以创建GUI界面为例。
设置路径和名称我就不写了,相信都懂,下一步选择qmake:
在这里插入图片描述
然后一直下一步,到这里:
在这里插入图片描述
选着MinGW 32位或者64位,具体看你自己电脑系统,然后点击下一步,再点击完成,到这里就创建成功了。

2.第一个Qt程序

创建完成后,在左下角会出现几个按钮:
在这里插入图片描述
点击运行按钮,就弹出了一个GUI界面,完成!
在这里插入图片描述


三、Qt信号与槽机制原理(Signal & Slot)

1、信号(signal):所谓信号(观察者模式), 信号本质是事件。信号展现方式就是函数。当某一个事件发生后,则发出一个信号(signal)。

2、槽(Slot):就是对信号响应的函数,槽就是一个函数。槽与普通函数的区别:槽函数可以与一个信号想关联,当信号被发射时,关联的槽函数被自动执行处理。信号与槽关联是使用QObject::connect()函数实现。

信号函数只需要声明(不需要实现),而槽函数需要实现。信号和槽机制底层是通过函数之间就行相互调用实现的。每个信号都可以用函数来表示,称为信号函数;没个槽也可以用函数表示,称为槽函数。

实例:connect(object1, SIGNAL(signal), object2, SLOT(slot))

四、 Qt常见的数据类型

1、字符串类型(QString)

每个方法上面都有注释,方便观看,可以试运行一下,更容易理解,学过python的话,其实就跟python的字符串类型差不多。

#include <QCoreApplication>
#include <iostream>
#include <QDebug>
#include <QVariant>
using namespace std;
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // QString 提供“+”操作符, (类似python)
    QString str = "hello";
    str = str + "world";
    qDebug() << str;  // 输出
    qDebug() << qPrintable(str); // 输出去掉引号
    cout << endl;

    // QString::append() 函数
    QString str1 = "hello";
    QString str2 = "world";
    str1.append(str2);
    qDebug() << qPrintable(str1);
    cout << endl;

    // Qstring::sprintf()函数 (类似c++ sprintf)
    QString strtemp;
    strtemp.sprintf("%s", "hello");
    qDebug() << qPrintable(strtemp);
    cout << endl;

    // QString::arg()函数
    QString str3;
    str3 = QString("%1 was born in %2.").arg("sunny").arg(2000);
    qDebug() << qPrintable(str3);
    cout << endl;

    // QString::startsWith()函数: 判断一个字符串是否以某个字符串开头
    // QString::endsWith()函数:判断一个字符串是否以某个字符串结尾
    QString str4 = "hello world";
    qDebug() << str4.startsWith("Hello", Qt::CaseSensitive); // CaseSensitive:大小写敏感
    qDebug() << str4.startsWith("Hello", Qt::CaseInsensitive); // CaseSensitive:大小写不敏感
    qDebug() << str4.endsWith("World", Qt::CaseSensitive); // CaseSensitive:大小写敏感
    qDebug() << str4.endsWith("World", Qt::CaseInsensitive); // CaseSensitive:大小写不敏感
    cout << endl;

    // QString::contains():判断一个制动字符串是否出现过
    QString str5 = "How are you";
    qDebug() << str5.contains("How", Qt::CaseSensitive);
    cout << endl;

    // QString::toInt()函数:将字符串转换为整形
    QString str6 = "123";
    qDebug() << str6.toInt();
    cout << endl;

    // QString::compare()函数:
    int b1 = QString::compare("abcd", "ABCD", Qt::CaseInsensitive);
    cout << "b1=" << b1 << endl;

    // Qt将Q他String转换成ASCII码;
    QString str7 = "abc ABC";
    QByteArray bytes = str7.toUtf8();
    for (int i = 0; i < str7.size(); i++)
        cout << int(bytes.at(i)) << " ";



    return a.exec();
}

2、列表类型(QList && QLinkedList)

其实也和python里面的列表差不多,以下代码,可以试运行一下,很容易理解。

#include <QCoreApplication>
#include <QDebug>
#include <QLinkedList>
#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QList<int> qlist; // 初始化一个空的QList<int>列表
    for (int i = 0; i < 10; i++)
        qlist.insert(i, i + 10);
    qDebug() << qlist;

    // 遍历1
    for (int i = 0; i < 10; i++)
        cout << qlist[i] << " ";
    cout << endl;

    // 遍历2 通过QList<int>::iterator读写迭代器 (可修改qlist中的元素)
    QList<int>::iterator x;
    for (x = qlist.begin(); x != qlist.end(); x++)
        cout << *x << " ";

    cout << endl;

    // 遍历3 通过QList<int>const_iterator读写迭代器 (不可修改qlist中的元素)
    QList<int>::const_iterator qciter;
    for (qciter = qlist.constBegin(); qciter != qlist.constEnd(); qciter++)
        cout << *qciter << " ";

    /*说明
     * iterator是一个可读可写的迭代器类型,可以通过它来读写容器中的元素;
     * 而const_iterator是一个只读的迭代器类型,只能用来读取容器中的元素,
     * 不能修改容器中的元素。
    */


    // 添加元素
    qlist.append(666);
    qDebug() << endl << qlist;


    // 查找qlist中的元素
    cout << qlist.at(3); // 查找索引为3的元素
    qDebug() << qlist.contains(19);

    // 修改
    qlist[0] = 100;
    qlist.replace(0, 200); // 将第0个元素修改为200
    qDebug() << qlist;

    // 删除
    qlist.removeAt(0); // 删除第0个元素
    qlist.removeFirst(); // 删除第一个元素
    qDebug() << qlist;





    // QLinkedList
    QLinkedList<QString> qAllMonth;
    for (int i = 1; i <= 12; i++)
        qAllMonth << QString("%1%2").arg("Month:").arg(i);
    // 读写迭代器
    QLinkedList<QString>::iterator itr;
    for (itr = qAllMonth.begin(); itr != qAllMonth.end(); itr++)
        qDebug() << *itr;
    return a.exec();
}

3、QMap && QHash类型

其实也就是python的字典类型,不过还是有不同的,比如查找,具体看以下代码:

#include <QCoreApplication>
#include <iostream>
using namespace std;

#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // QMap类(类似python字典类型,健:值)
    // 创建QMap实例,第一个参数为SQtring类型的键,第二个参数为int类型的值
    QMap<QString, int> qmap;

    // 插入数据信息,两种方式
    qmap["Chinese"] = 100;
    qmap["Math"] = 150;

    qmap.insert("English", 120);
    qmap.insert("Age", 20);
    qDebug() << qmap <<endl;

    // 删除数据信息key健
    qmap.remove("Age");
    qmap.remove("English");
    qDebug() << qmap << endl;

    // 遍历QMap类的实例:数据信息
    QMapIterator<QString, int> itr(qmap);
    while(itr.hasNext())
    {
        itr.next();
        qDebug() << itr.key() << ":" << itr.value();
    }
    // 1:迭代器;2:STL类型迭代

    // 查找:(有点离谱,和python查找相反,但又不完全相反)
    qDebug() << "key->value:" << qmap.value("Math"); // 通过key查找value
    qDebug() << "value->key:" << qmap.key(150); // 通过value查找key

    // 修改键值,重新定义就行
    qmap.insert("Math", 100);
    qDebug() << qmap["Math"];

    // 查找是否包含某个键
    qDebug() << "res =" << qmap.contains("Math");

    // 输出所以QMap实例化:key健和value值
    qDebug() << endl;
    QList<QString> aKeys = qmap.keys();
    qDebug() << aKeys;
    QList<int> aValues = qmap.values();
    qDebug() << aValues;


    // 一个健对应多个值
    // 直接使用QMultiMap类来实例化一个QMap对象
    QMultiMap<QString, QString> mulmap;
    mulmap.insert("studets", "no");
    mulmap.insert("studets", "name");
    mulmap.insert("studets", "sex");
    mulmap.insert("studets", "age");
    mulmap.insert("studets", "high");
    mulmap.insert("studets", "weight");
    qDebug() << mulmap << endl;





    // QHash类
    QHash<QString, int> qhash;
    qhash["key_1"] = 1;
    qhash["key_1"] = 20;
    qhash["key_4"] = 4;
    qhash["key_2"] = 5;
    qhash.insert("key 3", 30);

    // 先将qhash里面所有的key取出来,组成QList类型(类似python列表),再遍历里面的key来查找对应的value
    QList<QString> list = qhash.keys();
    for (int i = 0; i < list.size(); i++)
        qDebug() << list[i] << ":" <<qhash.value(list[i]);
    qDebug() << endl;
 
    // QVector类
    // QVector<T>是Qt的一个容器类
    QVector<int> qvr;
    qvr << 10 << 20 << 30 << 40;  // 第一种方式赋值
    // 第二种赋值方式
    qvr.append(50);
    qvr.append(60);
    qvr.append(70);
    qvr.append(80);

    qDebug() << qvr << endl;
    qDebug() << qvr.count() << endl;

    // 遍历 size()/count()/length()在我看来三者应该没有区别吧
    for (int i = 0; i < qvr.size(); i++)
        // 这里讲一下 执行效率、速度 printf > std::cout > qDebug
        cout << qvr[i] << " ";
    cout << endl;

    // 删除  qvr.remove(a, b) :从第a个元素开始,删除b个元素;也可以只填写一个数(index)
    qvr.remove(0);
    for (int i = 0; i < qvr.length(); i++)
        cout << qvr[i] << " ";

    return a.exec();
}

这里我要讲一下QMap和QHash的不同:

  1. QHash与QMap功能差不多,但QHash查找速度更快;
  2. QMap是按照健的顺序存储数据,而QHsh是任意顺序存储的;
  3. QMap的健必须提供"<“运算符, 而QHash的健必须提供”=="运算符和一个名为qHash()的全局散列函数。

4、QVariant类型

这个类型比较特殊,他的本质是C++联合数据类型,它可以保存很多Qt类型的值,包括QBrush、QColor、QString等等。也可以存放Qt的容器类型的值。具体看一下代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QVariant>
#include<QDebug>
#include <QColor>
#include <iostream>
using namespace std;

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QVariant qv1(298);
    qDebug() << "qv1:" << qv1.toInt();
    QVariant qv2("hello world");
    qDebug() << "qv2:" << qv2.toString();

    QMap<QString, QVariant> qmap;
    qmap["int"] = 100;
    qmap["float"] = 88.88;
    qmap["string"] = "hello";
    qmap["color"] = QColor(255, 255, 0); // QColor型

    // 输出:需要转换类型
    qDebug() << qmap["int"].toInt();
    qDebug() << qmap["float"].toFloat();
    qDebug() << qmap["string"].toString();
    qDebug() << qmap["color"].value<QColor>();

}

MainWindow::~MainWindow()
{
}


需要注意的是,QVariant类型输出是需要转换成相应的数据类型。

总结

以上就是Qt开发体系基础内容,后续还会有博客,在我的Qt学习笔记专栏中,会不断更新内容。实话实说,我也是在边学边写,博客内容和我的学习进度是一样的,希望有大佬能看到我的博客,并对我的学习提出建议,感谢!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值