一.下載安裝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
(2)擴展模塊 ...
二.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>無法用下標訪問,只能使用迭代器訪問
//QStack ...
//QQueue ...
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();
//QSet ...
//QHash ...
//QMultiHash ...
//QMultiMap ...
//QVariant QVariant類能夠保存很多QT類型的值,包括QColor QBrush QFont QPen QRect QSize等
七.QT5繪制
QT5繪制分為 2D繪制和3D繪制
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文件