一.下载安装QT5
QT是一个跨平台的C++图形用户界面应用程序框架,主要用来开发图形用户界面(Graphical User Interface,GUI)
QT除了可以绘制漂亮的界面(包括控件/布局/交互),还可以多线程/访问数据库/图像处理/音视频处理/网络通信/文件操作等
Windows下的GUI解决方案:QT/MFC/WTL/DirectUI
Linux下的GUI解决方案:QT/GTK+
QTSource和QTCreator的下载地址
这里给大家推荐几个国内著名的 Qt 镜像网站,主要是各个高校的:
中国科学技术大学:http://mirrors.ustc.edu.cn/qtproject/
清华大学:https://mirrors.tuna.tsinghua.edu.cn/qt/
北京理工大学:http://mirror.bit.edu.cn/qtproject/
中国互联网络信息中心:http://mirror.bit.edu.cn/qtproject/
https://www.qt.io/offline-installers
https://download.qt.io/archive/qt/5.14/5.14.2/
使用mingw编译,自带gcc编译器合gdb调试器(新手推荐)
qt-opensource-windows-x86-mingw492-5.5.1.exe
qt-opensource-windows-x86-msvc2013-5.5.0.exe
qt-vs-addin-1.2.4-opensource.exe
QT 3D Studio是为了设计师能够更好的专注于设计3D动画软件,而QT 3D模块是为了开发者能够更好的专注于开发代码
QT 3D使用assimp库来加载3D文件格式
1.模块
(1)基础模块
Qt Core
提供核心的非GUI功能,所有模块都需要这个模块.这个模块的类包含了动画框架 定时器 各个容器类 时间日期类 事件 IO JSON 插件机制 智能指针 图形(矩形 路径等) 线程 XML等
需要添加头文件<QtCore>
Qt GUI
提供GUI程序的基本功能,包含与窗口系统的集成 事件处理 OpenGL和OpenGL es继承 2D图像 字体 拖放等.这些类一般用于Qt用户界面类使用,也可以访问底层的OpenGL es图像API.
Qt Multimedia
提供视频 音频 收音机以及摄像头等功能
需要在pro文件中添加 QT + = multimedia,需要添加头文件<QtMultimedia>
Qt Network
提供跨平台的网络功能
需要在pro文件中添加 QT + = network,需要添加头文件<QtNetwork>
Qt Qml
提供QML(脚本语言,提供js交互机制)使用的C++ API
需要在pro文件中添加 QT + = qml,需要添加头文件<QtQml>
Qt Quick
允许在程序中嵌入Qt Quick(一种基于Qt的高度动画的用户界面,适合移动平台开发)
需要在pro文件中添加 QT + = quick,需要添加头文件<QtQuick>
Qt SQL
允许使用SQL访问数据库
需要在pro文件中添加 QT + = sql,需要添加头文件<QtSql>
Qt Test
提供Qt程序的单元测试功能
需要在pro文件中添加 QT + =testlib,需要添加头文件<QtTest>
Qt Webkit
基于WebKit2的实现以及一套全新的QML API
二.QT5开发工具
1.QTCreator
2.VS
ui_mainwindow.h和moc_mainwindow.cpp
//ui_mainwindow.h
#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H
#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class Ui_MainWindow
{
pubic:
QWidget* centralwidget;
QMenuBar* menubar;
QStatusBar* statusbar;
void setupUi(QMainWindow* MainWindow)
{
if (MainWindow->objectName().isEmpty())
MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
MainWindow->resize(800, 600);
centralwidget = new QWidget(MainWindow);
centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
MainWindow->setCentralWidget(centralwidget);
menubar = new QMenuBar(MainWindow)
menubar->setObjectName(QString::fromUtf8("menubar"));
MainWindow->setMenuBar(menubar);
statusbar = new QStatusBar(MainWindow);
statusbar->setObjectName(QString::fromUtf8("statusbar"));
MainWindow->setStatusBar(statusbar);
retranslateUi(MainWindow);
QMetaObject::connectSlotsByName(MainWndow);
} // setupUi
void retranslateUi(QMainWindow* MainWindow)
{
MainWindow->setWindowTitle(QCoreApplication::translate("MainWindow", "MainWindow", nullptr));
} //retranslateUi
};
namespae Ui {
class MainWindow : public Ui_MainWindow {};
}
QT_END_NAMESPACE
#endif //UI_MAINWINDOW_H
//moc_mainwindow.cpp
#include <memory>
#include "../../test/mainwindow.h"
#include <QtCore/qbytearray.h>
#include <QtCore/qmetatype.h>
#if !defined(Q_MOC_OUTPUT_REVISION)
#error "The header file 'mainwindow.h' doesn't include <QObject>. "
#elif Q_MOC_OUTPUT_REVISION != 67
#error "This file was generated using the moc from 5.13.2. It"
#error "cannot be used with the include files from this version of Qt."
#error "(The moc has changed too mush.)"
#endif
QT_BEGIN_MOC_NAMESPACE
QT_WARNING_PUSH
QT_WARNING_DISABLE_DEPRECATED
struct qt_meta_stringdata_MainWindow_t {
QByteArrayData data[1];
char stringdata0[11];
};
#define QT_MOC_LITERAL(idx, ofs, len)
Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, qptrdiff(offsetof(qt_meta_stringdata_MainWindow_t, stringdata0) + ofs - idx * sizeof(QByteArrayData)))
static const qt_meta_stringdata_MainWindow_t qt_meta_stringdata_MainWindow = {
{
QT_MOC_LIFERAL(0, 0, 10) // "MainWindow"
},
"MainWindow"
};
#undef QT_MOC_LITERAL
static const uint qt_meta_data_MainWindow[] = {
//content:
8, //revision
0, //classname
0, 0, //classinfo
0, 0, //methods
0, 0, //properties
0, 0, //enums/sets
0, 0, //constructors
0, //flags
0, //signalCount
0 //eod
};
void MainWindow::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
{
Q_UNUSED(_o);
Q_UNUSED(_id);
Q_UNUSED(_c);
Q_UNUSED(_a);
}
QT_INIT_METAOBJECT const QMetaObject MainWindow::staticMetaObject = {
{
&QMainWindow::staticMetaObject,
qt_meta_stringdata_MainWindow.data,
qt_meta_data_MainWindow,
qt_static_metacall,
nullptr,
nullptr
}
};
const QMetaObject* MainWindow::metaObject() const
{
return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
}
void* MainWindow::qt_metacast(const char* _clname)
{
if (!_clname) return nullptr;
if (!_strcmp(_clname, qt_meta_stringdata_MainWindow.stringdata0) )
return static_cast<void*>(this);
return QMainWindow::qt_metacast(_clname);
}
int MainWindow::qt_metacall(QMetaObject::Call _c, int _id, void** _a)
{
_id = QMainWindow::qt_metacall(_c, _id, _a);
return _id;
}
QT_WARNING_POP
QT_END_MOC_NAMESPACE
3.VSCode
三.QT5数据类型
1.字符串类型(QString)
//增加字符串
(1) +
QString str1 = "Welcome";
str1 = str1 + "to you!";
QString str2 = "Hello";
str +="World";
(2) QString::append()
QString str1 = "Welcome";
QString str2 = "to";
str1.append(str2);
str1.append("you!");
(3) QString::sprintf()
String str;
str.sprintf("%s", "Welcome");
str.sprintf("%s", "to you!");
str.sprintf("%s %s", "Welcome", "to you!");
(4) QString::arg()
QString str;
str = QString("%1 was born in %2").arg("John").arg(1982);
//查询字符串
(1) QString::startsWith()
/ 判断一个字符串是否以某个字符串开头<br>QString str = "Welcome to you!"
str.startsWith("Welcome", Qt::CaseSensitive); //返回true
str.startsWith("you", Qt::CaseSensitive); //返回false
(2) QString::endsWith()
// 判断一个字符串是否以某个字符串结尾
(3) QString::contains()
// 判断一个指定的字符串是否出现过<br>QString str = "Welcome to you!";<br>str.contains("Welcome", Qt::CaseSensitive); //返回true
//字符串比较
(1) 大于小于等于
operator < (const QString&) // 比较一个字符串是否小于另一个字符串,如果是返回true
operator <= (const QString&) // 比较一个字符串是否小于等于另一个字符串,如果是返回true
operator == (const QString&) // 比较两个字符串是否相等,如果相等返回true
operator >= (const QString&) // 比较一个字符串是否大于等于另一个字符串,如果是返回true
(2) localeAwareCompare()
localeAwareCompare(const QString&, const QString&) // 比较两个字符串,如果小于返回负整数值,如果相等返回0,如果大于返回正整数值
(3) compare()
compare(const QString&, const QString&, Qt::CaseSensitivity) // 是否进行大小写比较,类似localeAeareCompare()
//字符串转换
QString::toInt()
QString::toDouble()
QString::toFloat()
QString::toLong()
QString::toLongLong()
QString::toAscii()
QString::toLatin1()
QString::toUtf8()
QString::toLocal8Bit()
bool ok;
QString valueStr = ui->lineEdit->text();
int valueInt = valueStr.toInt(&ok);
double area = valueInt * valueInt *PI;
QString tempStr;
ui->lineEdit->setText(tempStr.setNum(area));<br><br>QString str = "125";<br>bool ok;<br>int hex = str.toint(&ok, 16);<br>int dec = str.toInt(&ok, 10);
//字符串判断
QString().isNull();
QString().isEmpty()
//正则表达式
使用正则表达式可以快速完成处理字符串的一些操作,如验证 查找 替换和分割
Qt的QRegExp类是正则表达式的表示类,它基于Perl的正则表达式语言
正则表达式由表达式(expressions) 量词(quantifiers)和断言(assertions)组成
2.日期类型(QData)
3.时间类型(QTime)
4.顺序容器类型
QT的顺序容器类型有QList QLinkedList QVector QStack QQueue
//QVector<T>
QVertor<T>在相邻的内存中存储数据类型T
QVertor<T>既可以用下标访问,也可以使用迭代器访问
//QList<T>
QList<T>可以使用下标访问
QList::append()
QList::prepend()
QList::insert()
#include<QList>
int main(int argc, char* argv)
{
QList<QString> list;
{
QString str("This is a test string");
list << str;
}
}
//QLinkedList<T>
QLinkedList<T>是一个链式列表,它以非连续的内存块保存数据
QLinkedList<T>无法用下标访问,只能使用迭代器访问
5.关联容器类型
Qt的关联容器类QMap QMultiMap QHash QMultiHash QSet
//QMap
QMap<QString, QString> map;
map.insert("beijing", "111");
map.insert("shanghai", "021");
map.insert("nanjing", "025");
QMapIterator<QString, QString> i(map);
for (;i.hasNext();)
qDebug() << " " << i.key() << " " << i.next().value();
QMutableMapIterator<QString, QString> mi(map);
if (mi.findNext("111"))
mi.setValue("010");
QMapIterator<QString, QString> modi(map);<br>qDebug() << " ";
for (modi = map.constBegin(); modi != map.constEnd(); ++modi)
qDebug() << " " << modi.key() << " " <<modi.next().value();
//QVariant
QVariant类能够保存很多QT类型的值,包括QColor QBrush QFont QPen QRect QSize等
七.QT5绘制
1.2D绘制
QPainter QPaintDevice QPaintEngine三个类来绘制
Qt默认窗口左上角为坐标原点(0,0),水平向右依次增大,水平向左依次减小
垂直向下依次增大,垂直向上依次减小
QPainter执行绘图操作
QPaintDevice提供绘图设备
QPaintEngine提供接口,可以在不同的设备上绘制
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
//提供绘图类
#include <QPainter>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
protected:
void paintEvent(QPaintEvent* );
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::paintEvent(QPaintEvent* )
{
QPainter painter(this);
//直接绘制
//painter.drawLine(QPointF(0, 0), QPointF(100, 100));
//添加画笔和画刷,改变形状和颜色
QPen pen; //画笔
pen.setColor(QColor(255, 0, 0));
QBrush brush(QCOlor(0, 255, 0, 125)); //画刷
painter.setPen(pen); //添加画笔
painter.setBrush(brush); //添加画刷
painter.drawRect(50, 50, 200, 100); //绘制矩形
}
2.3D绘制
十.QT5文件
十一.QT5算法
QT的<QtAlgorithms>和<QtGlobal>模块提供了几种常用算法
qAbs(<T>);
qMax(<T>, <T>);
qRound(<T>);
qSwap(<T>, <T>);
QObject::tr(QString);
十二.QT5异常调试
1.QDebug()
//QDebug()能够将调试信息直接输出到控制台
#include <QDebug>
int main(int argc, char* argv[])
{
int x =10;
int w = 10;
// 字符串的形式输出
qDebug("%d", x);
// IO流的形式输出
qDebug() << x << w << endl;
}
十三.QT5资源配置
1.加载图片
1.右键项目->Add New->选择 Qt Resource File->输入名称,例如X
2.打开 X.qrc 资源文件,点击 添加前缀,可以修改前缀
3.点击添加文件,把图片路径放进去
4.对于 X.qrc资源文件 可以 Open in Editor,也可以 Open With 编辑器
.qrc 资源文件实际上是XML文件