本篇文章介绍Qt开发体系基础,包括Qt环境的安装、Qt Creator工具的介绍和使用、Qt信号与槽机制以及 Qt常见的数据类型
点击Next,输入自己的账号,没有的话在Sign-up栏创建一个
登录完成后点击Next,然后一直下一步到这个界面,选择安装目录(建议D盘,因为Qt比较大 10g以上)
然后一直下一步安装就行,安装完成后会打开Qt Creator界面,说明安装成功啦
说明一下,安装完成之后一般桌面上是没有Qt Creator的快捷方式的,在开始菜单栏里可以找到,或者找到安装路径,自己创建一个快捷方式
例:D:\Qt5.12.8\Tools\QtCreator\bin\qtcreator.exe 这是我的路径,可以参考,一般都一样
然后右键,选择创建快捷方式
再将创建的快捷方式拖到桌面上来就行了,到此Qt的安装步骤就完成啦
点击文件,选着新建文件或项目
打开后有多个选项,如下:
选择第一个会有GUI界面,在开发中,我们一般选择第一个;第二个是控制台程序,好吧,直说就相当于 Microsoft Visual Studio,只不过多一些库。
这里我以创建GUI界面为例。
设置路径和名称我就不写了,相信都懂,下一步选择qmake:
然后一直下一步,到这里:
选着MinGW 32位或者64位,具体看你自己电脑系统,然后点击下一步,再点击完成,到这里就创建成功了。
创建完成后,在左下角会出现几个按钮:
点击运行按钮,就弹出了一个GUI界面,完成!
1、信号(signal):所谓信号(观察者模式), 信号本质是事件。信号展现方式就是函数。当某一个事件发生后,则发出一个信号(signal)。
2、槽(Slot):就是对信号响应的函数,槽就是一个函数。槽与普通函数的区别:槽函数可以与一个信号想关联,当信号被发射时,关联的槽函数被自动执行处理。信号与槽关联是使用QObject::connect()函数实现。
信号函数只需要声明(不需要实现),而槽函数需要实现。信号和槽机制底层是通过函数之间就行相互调用实现的。每个信号都可以用函数来表示,称为信号函数;没个槽也可以用函数表示,称为槽函数。
实例:connect(object1, SIGNAL(signal), object2, SLOT(slot))
每个方法上面都有注释,方便观看,可以试运行一下,更容易理解,学过python的话,其实就跟python的字符串类型差不多。
#include
#include
#include
#include
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();
}
其实也和python里面的列表差不多,以下代码,可以试运行一下,很容易理解。
#include
#include
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QList<int> qlist; // 初始化一个空的QList列表
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::iterator读写迭代器 (可修改qlist中的元素)
QList<int>::iterator x;
for (x = qlist.begin(); x != qlist.end(); x++)
cout << *x << " ";
cout << endl;
// 遍历3 通过QListconst_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();
}
其实也就是python的字典类型,不过还是有不同的,比如查找,具体看以下代码:
#include
#include
using namespace std;
#include
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是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的不同:
这个类型比较特殊,他的本质是C++联合数据类型,它可以保存很多Qt类型的值,包括QBrush、QColor、QString等等。也可以存放Qt的容器类型的值。具体看一下代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
#include
#include
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学习笔记专栏中,会不断更新内容。实话实说,我也是在边学边写,博客内容和我的学习进度是一样的,希望有大佬能看到我的博客,并对我的学习提出建议,感谢!