赞
踩
本篇文章介绍Qt开发体系基础,包括Qt环境的安装、Qt Creator工具的介绍和使用、Qt信号与槽机制以及 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 <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(); }
其实也和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(); }
其实也就是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的不同:
这个类型比较特殊,他的本质是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学习笔记专栏中,会不断更新内容。实话实说,我也是在边学边写,博客内容和我的学习进度是一样的,希望有大佬能看到我的博客,并对我的学习提出建议,感谢!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。