QT5


一.下載安裝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文件

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM