Qt5.9開發指南筆記


Qt類庫概述

概述

qt本身並不是一種編程語言,它實質上是一個跨平台的C++開發類庫,是用標准C艹+編寫的類庫,它為開發GUI應用程序和非GUI應用程序提供了各種類。
qt對標准C艹+進行了擴展,引入了一些新的概念和功能,例如信號與槽、對象屬性等。Qt的元對象編譯器(Meta- Object Compiler,MoC)是一個預處理器,在源程序被編譯前先將這些
qt特性的程序轉換為標准C++兼容的形式,然后再由標准C艹+編譯器進行編譯。這就是為什么在使用信號與槽機制的類里,必須添加一個 Q_OBJECT宏的原因,只有添加了這個宏,moc才能對類里的信號與槽的代碼進行預處理。
Qt Core模塊是qt類庫的核心,所有其他模塊都依賴於此模塊,如果使用 qmake來構建項目, Qt Core模塊則是被自動加入的Qt為C+語言增加的特性就是在 Qt Core模塊里實現的,這些擴展特性由Qt的元對象系統實現,包括信號與槽機制、屬性系統、動態類型轉換等。

Ui-源碼混合編程

在ui上布局完成后,需要構建工程才能索引出部件!

元對象系統

元對象系統由以下三個基礎組成。
QObject類是所有使用元對象系統的類的基類在一個類的 private部分聲明 Q OBJECT宏,使得類可以使用元對象的特性,如動態屬性信號與槽。
MOC(元對象編譯器)為每個 QObject的子類提供必要的代碼來實現元對象系統的特性

信號與槽

qt使用信號與槽的機制實現對象間通信,它隱藏了復雜的底層實現,完成信號與槽的關聯后,發射信號時並不需要知道Qt是如何找到槽函數的。Qt的信號與槽機制與 Delphi和C++ Builder的“事件—響應”比較類似,但是更加靈活。

某些開發架構使用回調函數( callback)實現對象間通信。與回調函數相比,信號與槽的執行速度稍微慢一點,因為需要査找連接的對象和槽函數,但是這種差別在應用程序運行時是感覺不到的,而其提供的靈活性卻比回調函數強很多。

信號-槽的第一種寫法

這是舊版寫法。

connect(m_pBtn,SIGNAL(sigClicked()),this,SLOT(onClicked()));

信號-槽的第二種寫法

connect(m_pBtn,&MyButton::sigClicked,this,&Widget::onClicked);

但是此方法只適用於信號名是唯一的時候,如果有重載編譯會報錯。

信號-槽的第三種寫法

connect(m_pBtn, QOverload<bool>::of(&MyButton::sigClicked),this,&Widget::onClicked);

很顯然這種寫法相對於第二種會比較簡單些,但依然不能連接到重載的槽函數,如果連接重載槽函數,還是會報之前的錯誤。

信號-槽的第三種寫法

Lambda 函數寫法

connect(m_pBtn, QOverload<bool>::of(&MyButton::sigClicked),

               [=](bool check){
                /* do something.. */
                
                });

connect(m_pBtn, static_cast<void (MyButton::*)(bool)>(&MyButton::sigClicked), this, [=](bool check){

                 //do something

                 });

自定義信號

在自己設計的類里也可以自定義信號,信號就是在類定義里聲明的一個函數,但是這個函數無需實現,只需發射(emit)。
例如,在下面的自定義類 PErson的 signals部分定義一個信號 age Changed(int)

class PErson: public Qobject
{
Q OBJECT 

private:
 int m age=l0;
public:
 void incAge();
sgna⊥s:
 void ageChanged(int value);
}

信號函數必須是無返回值的函數,但是可以有輸入參數。信號函數無需實現,只需在某些條件下發射信號。例如,在 encAgeD函數中發射信號,其代碼如下。

void Qperson::incAge()
{
  m_age++;
  emit ageChanged(m_age);
}

在 incAge函數里,當私有變量mage變化后,發射信號ageChanged(int),表示年齡發生了變化。至於是否有與此信號相關聯的槽函數,信號發射者並不管。如果在使用 QPerson類對象的程序中為此信號關聯了槽函數,在 encAged函數里發射此信號時,就會執行相關聯的槽函數。至於是否立即執行槽函數,發射信號的線程是否等待槽函數執行完之后再執行后面的代碼,與connecto函數設置信號與槽關聯時設置的連接類型以及信號與槽是否在同一個線程有關。

自定義槽函數

private slots:
  void on_ageChanged(int value);
``

## 元對象特性測試實例
```cpp
//PErson是 QObject的子類,在類定義部分使用了宏 Q OBJECT,這樣 QPerson就獲得了元對象系統支持,能使用信號與槽、屬性等功能。
class QPerson : public QObject
{
    Q_OBJECT
//PErson使用 Q CLASSINFO宏定義了3個附加信息,使用 Q PROPERTY宏定義了3個屬性,還定義了一個信號。
    Q_CLASSINFO("author","Wang")
    Q_CLASSINFO("company","UPC")
    Q_CLASSINFO("version","1.0.0")

    Q_PROPERTY(int age READ age WRITE setAge NOTIFY ageChanged)
    Q_PROPERTY(QString name MEMBER m_name)
    Q_PROPERTY(int score MEMBER m_score)
private:
    int  m_age=10;
    QString m_name;
    int     m_score=79;
public:
    explicit QPerson(QString fName, QObject *parent = nullptr);

    int     age();
    void    setAge(int value);

    void    incAge();
signals:
    void    ageChanged( int  value);

public slots:
};

Qt模塊

基本模塊

附加模塊

常用組件

標准組件


lineEdit-QString

字符串與數值轉換;進制轉換。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QString>
#include<QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_btnCal_clicked()
{
    float num=(ui->editNum->text()).toFloat();
    float single=(ui->editSingle->text()).toFloat();
    float total=num*single;
    
    if(num && single)
    {
        qDebug()<<num*single;
        
        QString str;
        str=str.sprintf("%.2f",total);
        //str=str.sprintf("%.2f",num*single);  //usage is wrong!
        ui->editTotal->setText(str);
    }
}

數值與字符串轉換

字符串轉數值

成員函數方法:

.toFloat(bool *ok=Q_NULLPTR,int base=10)

數值轉換為字符串

可以使用以下靜態函數:

str=QString::number(total,'f',2);
str=QString::asprintf("%.2f",total);

進制轉換

十進制轉換為二進制

void MainWindow::on_btnBin_clicked()
{
    QString str= ui->editBin->text();
    if(str==nullptr)
    {
        return;
    }
    int val = str.toInt();

    //str=str.setNum(val,2);
    str=QString::number(val,2);

    str=str.toUpper();//轉換為大寫

    ui->editDec->setText(str);
}

二進制轉換為十進制

void MainWindow::on_btnBin_clicked()
{
    QString str= ui->editBin->text();
    if(str==nullptr)
    {
        return;
    }

    bool ok;
    int val = str.toInt(&ok,2);//以2進制方式讀入。

    str=QString::number(val,10);
    str=str.toUpper();//轉換為大寫

    ui->editDec->setText(str);
}

QString常用功能

  • append() 在字符串后面添加字符串
  • prepend() 在字符串前面添加字符串
  • toUpper() 將字符串全部轉換為大寫
  • toLower() 將字符串全部轉換為小寫
  • count() size() length() 這三個函數相同,返回字符個數,注意一個漢字算一個字符。
  • trimmed() 去掉字符串首尾空格
  • simplified() 不僅去掉首尾空格,還將中間多個空格格式化為一個空格。
  • indexof() 返回最先出現的字符索引
  • lastIdexof() 返回最后出現的字符索引
  • isNull() isEmpty() 是否為空
  • contains() 是否包含某個字符串
  • startsWith() 判斷是否以某個字符串開頭
  • endsWith() 判斷是否以某個字符串結尾
  • left() 從字符串中左邊取多少個字符
  • right() 從字符串中左邊取多少個字符
  • section(sep,start,end) 從字符串中提取以sep為分隔符,從start到end端的字符串

SpinBox


定時器

//.h
private:
  QTimer *fTimer; //定時器
  QTime *fTimeCounter; //計時器
private slots:
  void on_timer_timeout(); //定時器溢出處理槽函數
//.cpp
fTimer=new QTimer(this);
fTimer->setInterval(1000); //定時器周期,ms
connect(fTimer,SIGNAL(timeout()),this,SLOT(on_timer_timeout));

fTimer->stop();//停止定時器

對話框

文件讀寫

Qpainter

Qpainter是一種2D非交互式矢量輸出畫圖庫。

可以直接在Qwidget中繪畫,

使用時需要復寫 paintEvent :

protected:
    void    paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;

當發生一下情況時會產生繪制事件並調用paintEvent()函數:

1.在窗口部件第一次顯示時,系統會自動產生一個繪圖事件,從而強制繪制這個窗口部件。

2.當重新調整窗口部件的大小時,系統也會產生一個繪制事件。

3.當窗口部件被其他窗口部件遮擋,然后又再次顯示出來的時候,就會對那些隱藏的區域產生一個繪制事件。

同時可以調用QWidget::update()或者QWidget::repaint()來強制產生一個繪制事件。二者的區別是:

repaint()函數會強制產生一個即時的重繪事件,而update()函數只是在Qt下一次處理事件時才調用一次繪制事件。

如果多次調用update(),Qt會把連續多次的繪制事件壓縮成一個單一的繪制事件,這樣可避免閃爍現象。

Qpainter組成

painter,畫筆。 批注:就是線屬性!
brush,筆刷。 批注:就是填充!
路徑。 批注:線要顯示的位置。

案例 畫矩形:

布局

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;

private:
    void    myDrawFilledRect();
    void    myDrawTextureRect();
    void    myDrawGradient();

    void    total();

    void    myDrawShape(); //繪制基本圖形

protected:
    void    paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

#include    <QPainter>

void Widget::myDrawFilledRect()
{//基本繪圖
    QPainter    painter(this);//創建QPainter對象
    painter.setRenderHint(QPainter::Antialiasing);//抗鋸齒
    painter.setRenderHint(QPainter::TextAntialiasing);//文本抗鋸齒

    int W=this->width(); //繪圖區寬度
    int H=this->height(); //繪圖區高度
    QRect   rect(W/4,H/4,W/2,H/2); //中間區域矩形框

//設置畫筆
    QPen    pen;
    pen.setWidth(3); //線寬
    pen.setColor(Qt::red); //划線顏色

    //Qt::NoPen,Qt::SolidLine, Qt::DashLine, Qt::DotLine,Qt::DashDotLine,Qt::DashDotDotLine,Qt::CustomDashLine
    pen.setStyle(Qt::SolidLine);//線的類型,實線、虛線等

    //Qt::FlatCap, Qt::SquareCap,Qt::RoundCap
    pen.setCapStyle(Qt::FlatCap);//線端點樣式

    //Qt::MiterJoin,Qt::BevelJoin,Qt::RoundJoin,Qt::SvgMiterJoin
    pen.setJoinStyle(Qt::BevelJoin);//線的連接點樣式
    painter.setPen(pen);

//設置畫刷
//    QPixmap texturePixmap("C:\\Users\\Administrator\\Desktop\\123.jpg");
    QBrush  brush;
    brush.setColor(Qt::yellow); //畫刷顏色
    brush.setStyle(Qt::SolidPattern); //畫刷填充樣式
//    brush.setStyle(Qt::TexturePattern); //畫刷填充樣式
//    brush.setTexture(texturePixmap); //設置材質圖片
    painter.setBrush(brush);

//Qt::NoBrush,Qt::SolidPattern,Qt::Dense1Pattern,Qt::Dense2Pattern,..,Qt::Dense7Pattern,Qt::HorPattern
// Qt::VerPattern, Qt::CrossPattern, Qt::BDiagPattern,Qt::FDiagPattern,Qt::DiagCrossPattern,
// Qt::LinearGradientPattern,Qt::ConicalGradientPattern,Qt::RadialGradientPattern
// Qt::TexturePattern


//繪圖
//    painter.drawLine(rect.left(),rect.top(),rect.right(),rect.bottom());
    painter.drawRect(rect); //只填充定義的漸變區域
//    painter.drawRect(this->rect()); //填充更大區域,會有延展效果
//    painter.fillRect(rect,Qt::red);
//    painter.drawRoundRect(rect);
//    painter.drawRoundedRect(rect,40,20);

//    painter.drawEllipse(rect);
//    painter.drawPolyline(points,9);
//    painter.drawPolygon(points,9);
//    painter.drawPoints(points,9);

//    painter.translate(100,300);
//    painter.drawPath(starPath);

//    painter.translate(200,0);
//    painter.drawPath(starPath);

//    painter.translate(200,0);
//    painter.drawPath(starPath);

//    painter.drawArc(rect,30*16,80*16);
//    painter.drawChord(rect,90*16,120*16);
//    painter.drawPie(rect,90*16,120*16);
    //    painter.drawText(rect,"Hello, QT");
}

void Widget::myDrawTextureRect()
{
   QPainter    painter(this);//創建QPainter對象
   painter.setRenderHint(QPainter::Antialiasing);//
   painter.setRenderHint(QPainter::TextAntialiasing);//

   int W=this->width(); //繪圖區寬度
   int H=this->height(); //繪圖區高度
   QRect   rect(W/4,H/4,W/2,H/2); //中間區域矩形框


//設置畫筆
   QPen    pen;
   pen.setWidth(3); //線寬
   pen.setColor(Qt::red); //划線顏色

   //Qt::NoPen,Qt::SolidLine, Qt::DashLine, Qt::DotLine,Qt::DashDotLine,Qt::DashDotDotLine,Qt::CustomDashLine
   pen.setStyle(Qt::SolidLine);//線的類型,實線、虛線等

   //Qt::FlatCap, Qt::SquareCap,Qt::RoundCap
   pen.setCapStyle(Qt::FlatCap);//線端點樣式

   //Qt::MiterJoin,Qt::BevelJoin,Qt::RoundJoin,Qt::SvgMiterJoin
   pen.setJoinStyle(Qt::BevelJoin);//線的連接點樣式
   painter.setPen(pen);

//設置畫刷
   QPixmap texturePixmap(":images/images/texture.jpg");
   QBrush  brush;
//   brush.setColor(Qt::yellow); //畫刷顏色
//   brush.setStyle(Qt::SolidPattern); //畫刷填充樣式
    brush.setStyle(Qt::TexturePattern); //畫刷填充樣式
    brush.setTexture(texturePixmap); //設置材質圖片
   painter.setBrush(brush);


//繪圖
   painter.drawRect(rect); //只填充定義的漸變區域
}

void Widget::myDrawGradient()
{
   QPainter    painter(this);//創建QPainter對象
   painter.setRenderHint(QPainter::Antialiasing);//
   painter.setRenderHint(QPainter::TextAntialiasing);//

   int W=this->width(); //繪圖區寬度
   int H=this->height(); //繪圖區高度
   QRect   rect(W/4,H/4,W/2,H/2); //中間區域矩形框


//設置畫筆
//   QPen    pen;
//   pen.setStyle(Qt::NoPen);//線的類型,實線、虛線等
//   painter.setPen(pen);


//線性漸變
//    QLinearGradient  linearGrad(rect.left(),rect.top(),rect.right(),rect.bottom()); //對角線
    QLinearGradient  linearGrad(rect.left(),rect.top(),rect.right(),rect.top());//從左到右
    linearGrad.setColorAt(0,Qt::blue);//起點顏色
    linearGrad.setColorAt(0.5,Qt::green);//起點顏色
    linearGrad.setColorAt(1,Qt::red);//終點顏色
    linearGrad.setSpread(QGradient::ReflectSpread);  //展布模式
//QGradient::PadSpread ,QGradient::RepeatSpread, QGradient::ReflectSpread
    painter.setBrush(linearGrad);

//徑向漸變
//    QRadialGradient  radialGrad(W/2,H/2,qMax(W/8,H/8),W/2,H/2);
////    radialGrad.setColorAt(0,Qt::white);
//    radialGrad.setColorAt(0,Qt::green);
//    radialGrad.setColorAt(1,Qt::blue);
//    radialGrad.setSpread(QGradient::ReflectSpread);
//    //QGradient::PadSpread ,QGradient::RepeatSpread, QGradient::ReflectSpread
//    painter.setBrush(radialGrad);


//圓錐型漸變
//    QConicalGradient  coniGrad(W/2,H/2,45);
//    coniGrad.setColorAt(0,Qt::yellow);
//    coniGrad.setColorAt(0.5,Qt::blue);
//    coniGrad.setColorAt(1,Qt::green);
////    coniGrad.setSpread(QGradient::PadSpread); //對於錐形漸變不起作用
//    painter.setBrush(coniGrad);


//繪圖
//   painter.drawRect(rect); //只填充定義的漸變區域
    painter.drawRect(this->rect()); //填充更大區域,會有延展效果
}

void Widget::total()
{
   QPainter    painter(this);//創建QPainter對象
   painter.setRenderHint(QPainter::Antialiasing);//
   painter.setRenderHint(QPainter::TextAntialiasing);//

   int W=this->width(); //繪圖區寬度
   int H=this->height(); //繪圖區高度
   QRect   rect(W/4,H/4,W/2,H/2); //中間區域矩形框

//    QPoint points[9]={
//        QPoint(5*W/12,H/4),
//        QPoint(7*W/12,H/4),
//        QPoint(3*W/4,5*H/12),
//        QPoint(3*W/4,7*H/12),
//        QPoint(7*W/12,3*H/4),
//        QPoint(5*W/12,3*H/4),
//        QPoint(W/4,7*H/12),
//        QPoint(W/4,5*H/12),
//        QPoint(5*W/12,H/4)
//    };

//    QPainterPath  path;
//    path.addRect(rect);
//    path.addEllipse(rect);
//    path.moveTo(points[0]);
//    path.lineTo(points[4]);
//    path.moveTo(points[1]);
//    path.lineTo(points[5]);
//    path.moveTo(points[2]);
//    path.lineTo(points[6]);
//    path.moveTo(points[3]);
//    path.lineTo(points[7]);

//    painter.scale(width() / 100.0, height() / 100.0);
//    painter.translate(50.0, 50.0);

//    qreal   R=100; //半徑
//    const   qreal Pi=3.14159;
//    qreal   deg=Pi*72/180;//

//    QPoint points[5]={
//        QPoint(R,0),
//        QPoint(R*std::cos(deg),-R*std::sin(deg)),
//        QPoint(R*std::cos(2*deg),-R*std::sin(2*deg)),
//        QPoint(R*std::cos(3*deg),-R*std::sin(3*deg)),
//        QPoint(R*std::cos(4*deg),-R*std::sin(4*deg)),
//    };


//    QPainterPath starPath;
//    starPath.moveTo(points[0]);
//    starPath.lineTo(points[2]);
//    starPath.lineTo(points[4]);
//    starPath.lineTo(points[1]);
//    starPath.lineTo(points[3]);
//    starPath.closeSubpath();

//繪制曲線
//    path.moveTo(points[0]);
//    path.cubicTo(points[1],points[4],points[2]);

//設置字體
//    QFont   font;
//    font.setPointSize(30);
//    font.setBold(true);
//    painter.setFont(font);

//設置畫筆
   QPen    pen;
   pen.setWidth(3); //線寬
   pen.setColor(Qt::red); //划線顏色

   //Qt::NoPen,Qt::SolidLine, Qt::DashLine, Qt::DotLine,Qt::DashDotLine,Qt::DashDotDotLine,Qt::CustomDashLine
   pen.setStyle(Qt::SolidLine);//線的類型,實線、虛線等

   //Qt::FlatCap, Qt::SquareCap,Qt::RoundCap
   pen.setCapStyle(Qt::FlatCap);//線端點樣式

   //Qt::MiterJoin,Qt::BevelJoin,Qt::RoundJoin,Qt::SvgMiterJoin
   pen.setJoinStyle(Qt::BevelJoin);//線的連接點樣式
   painter.setPen(pen);

//設置畫刷
//    QPixmap texturePixmap(":images/images/texture.jpg");
   QBrush  brush;
   brush.setColor(Qt::yellow); //畫刷顏色
   brush.setStyle(Qt::SolidPattern); //畫刷填充樣式
//    brush.setStyle(Qt::TexturePattern); //畫刷填充樣式
//    brush.setTexture(texturePixmap); //設置材質圖片
   painter.setBrush(brush);

//Qt::NoBrush,Qt::SolidPattern,Qt::Dense1Pattern,Qt::Dense2Pattern,..,Qt::Dense7Pattern,Qt::HorPattern
// Qt::VerPattern, Qt::CrossPattern, Qt::BDiagPattern,Qt::FDiagPattern,Qt::DiagCrossPattern,
// Qt::LinearGradientPattern,Qt::ConicalGradientPattern,Qt::RadialGradientPattern
// Qt::TexturePattern

//線性漸變
////    QLinearGradient  linearGrad(rect.left(),rect.top(),rect.right(),rect.bottom()); //對角線
//    QLinearGradient  linearGrad(rect.left(),rect.top(),rect.right(),rect.top());//從左到右
//    linearGrad.setColorAt(0,Qt::blue);//起點顏色
//    linearGrad.setColorAt(0.5,Qt::blue);//起點顏色
//    linearGrad.setColorAt(1,Qt::red);//終點顏色
//    linearGrad.setSpread(QGradient::ReflectSpread);  //展布模式
////QGradient::PadSpread ,QGradient::RepeatSpread, QGradient::ReflectSpread
//    painter.setBrush(linearGrad);

//徑向漸變
//    QRadialGradient  radialGrad(W/2,H/2,qMax(W/8,H/8),W/2,H/2);
////    radialGrad.setColorAt(0,Qt::white);
//    radialGrad.setColorAt(0,Qt::green);
//    radialGrad.setColorAt(1,Qt::blue);
//    radialGrad.setSpread(QGradient::ReflectSpread);
//    //QGradient::PadSpread ,QGradient::RepeatSpread, QGradient::ReflectSpread
//    painter.setBrush(radialGrad);


//圓錐型漸變
//    QConicalGradient  coniGrad(W/2,H/2,45);
//    coniGrad.setColorAt(0,Qt::yellow);
//    coniGrad.setColorAt(0.5,Qt::blue);
//    coniGrad.setColorAt(1,Qt::green);
////    coniGrad.setSpread(QGradient::PadSpread); //對於錐形漸變不起作用
//    painter.setBrush(coniGrad);


//設置復合模式
//    painter.setCompositionMode(QPainter::CompositionMode_SourceOver);//

//    painter.translate(W/4,H/4);
//    painter.rotate(30);
//    painter.scale(0.5,0.5);
//    painter.shear(0.1,0.5);

//繪圖
//    painter.drawLine(rect.left(),rect.top(),rect.right(),rect.bottom());
   painter.drawRect(rect); //只填充定義的漸變區域
//    painter.drawRect(this->rect()); //填充更大區域,會有延展效果
//    painter.fillRect(rect,Qt::red);
//    painter.drawRoundRect(rect);
//    painter.drawRoundedRect(rect,40,20);
//    painter.drawEllipse(rect);
//    painter.drawPolyline(points,9);
//    painter.drawPolygon(points,9);
//    painter.drawPoints(points,9);

//    painter.translate(100,300);
//    painter.drawPath(starPath);

//    painter.translate(200,0);
//    painter.drawPath(starPath);

//    painter.translate(200,0);
//    painter.drawPath(starPath);

//    painter.drawArc(rect,30*16,80*16);
//    painter.drawChord(rect,90*16,120*16);
//    painter.drawPie(rect,90*16,120*16);
//    painter.drawText(rect,"Hello, QT");

//    QPixmap pixmap;
//    pixmap.load(":/images/images/qt.jpg");
//    painter.drawPixmap(rect.left(),rect.top(),pixmap);

}

void Widget::myDrawShape()
{
   QPainter    painter(this);//創建QPainter對象
   painter.setRenderHint(QPainter::Antialiasing);
   painter.setRenderHint(QPainter::TextAntialiasing);

   int W=this->width(); //繪圖區寬度
   int H=this->height(); //繪圖區高度

//設置畫筆
   QPen    pen;
   pen.setWidth(3); //線寬
   pen.setColor(Qt::black); //划線顏色

   //Qt::NoPen,Qt::SolidLine, Qt::DashLine, Qt::DotLine,Qt::DashDotLine,Qt::DashDotDotLine,Qt::CustomDashLine
   pen.setStyle(Qt::SolidLine);//線的類型,實線、虛線等

   //Qt::FlatCap, Qt::SquareCap,Qt::RoundCap
   pen.setCapStyle(Qt::FlatCap);//線端點樣式

   //Qt::MiterJoin,Qt::BevelJoin,Qt::RoundJoin,Qt::SvgMiterJoin
   pen.setJoinStyle(Qt::BevelJoin);//線的連接點樣式
   painter.setPen(pen);

//1. drawArc()
//   QRect   rect(W/4,H/4,W/2,H/2);
//   int startAngle = 90 * 16; //起始90°
//   int spanAngle = 90 * 16;   //旋轉90°
//   painter.drawArc(rect, startAngle, spanAngle);

//2. drawChord()
//   QRect   rect(W/4,H/4,W/2,H/2);
//   int startAngle = 90 * 16; //起始90°
//   int spanAngle = 90 * 16;   //旋轉90°
//   painter.drawChord(rect, startAngle, spanAngle);

//3.drawConvexPolygon()
//   QPoint points[4]={
//      QPoint(5*W/12,H/4),
////      QPoint(7*W/12,H/4),
//      QPoint(3*W/4,5*H/12),
////      QPoint(3*W/4,7*H/12),
////      QPoint(7*W/12,3*H/4),
//      QPoint(5*W/12,3*H/4),
////      QPoint(W/4,7*H/12),
//      QPoint(W/4,5*H/12),
////      QPoint(5*W/12,H/4)
//   };
//   painter.drawConvexPolygon(points, 4);


//4. drawEllipse
//   QRect   rect(W/4,H/4,W/2,H/2);
//   painter.drawEllipse(rect);

//5. drawImage
//   QRect   rect(W/4,H/4,W/2,H/2);
//   QImage  image(":images/images/qt.jpg");
//   painter.drawImage(rect, image);

//6.  drawLine
//   QLine   Line(W/4,H/4,W/2,H/2);
//   painter.drawLine(Line);

//7.  drawLines
//   QRect   rect(W/4,H/4,W/2,H/2);

//   QVector<QLine> Lines;
//   Lines.append(QLine(rect.topLeft(),rect.bottomRight()));
//   Lines.append(QLine(rect.topRight(),rect.bottomLeft()));
//   Lines.append(QLine(rect.topLeft(),rect.bottomLeft()));
//   Lines.append(QLine(rect.topRight(),rect.bottomRight()));

//   painter.drawLines(Lines);

// 8.QPainterPath
//   QRect   rect(W/4,H/4,W/2,H/2);
//   QPainterPath  path;
//   path.addEllipse(rect);
//   path.addRect(rect);
//   painter.drawPath(path);

//9.drawPie
//   QRect   rect(W/4,H/4,W/2,H/2);
//   int startAngle = 40 * 16;//起始40°
//   int spanAngle = 120 * 16;//旋轉120°
//   painter.drawPie(rect, startAngle, spanAngle);

//10. drawPixmap
//   QRect   rect(W/4,H/4,W/2,H/2);
//   QPixmap   pixmap(":images/images/qt.jpg");
//   painter.drawPixmap(rect, pixmap);

//11. drawPolygon
//   QPoint points[]={
//      QPoint(5*W/12,H/4),
//      QPoint(3*W/4,5*H/12),
//      QPoint(5*W/12,3*H/4),
//      QPoint(2*W/4,5*H/12),
//   };
//   painter.drawPolygon(points, 4);

//12.drawPolyline
//   QPoint points[]={
//      QPoint(5*W/12,H/4),
//      QPoint(3*W/4,5*H/12),
//      QPoint(5*W/12,3*H/4),
//      QPoint(2*W/4,5*H/12)
//   };
//   painter.drawPolyline(points, 4);

//13.drawRect
//   QRect   rect(W/4,H/4,W/2,H/2);
//   painter.drawRect(rect);

//14.drawRect
//   QRect   rect(W/4,H/4,W/2,H/2);
//   painter.drawRoundedRect(rect,20,20);

//14.drawRect
//   QRect   rect(W/4,H/4,W/2,H/2);
//   QFont   font;
//   font.setPointSize(30);
//   font.setBold(true);
//   painter.setFont(font);
//   painter.drawText (rect,"Hello,Qt");

//.  eraseRect
//   QRect   rect(W/4,H/4,W/2,H/2);
//   painter.eraseRect(rect);

//15. fillRect
   QRect   rect(W/4,H/4,W/2,H/2);
   painter.fillRect (rect,Qt::green);

//16.   fillPath
//   QRect  rect(W/4,H/4,W/2,H/2);
//   QPainterPath  path;
//   path.addEllipse(rect);
//   path.addRect(rect);
//   painter.fillPath(path,Qt::red);

//17.drawPoint
//     painter.drawPoint(QPoint(W/2,H/2));

//18. drawPoints
//     QPoint points[]={
//        QPoint(5*W/12,H/4),
//        QPoint(3*W/4,5*H/12),
//        QPoint(2*W/4,5*H/12)
//     };
//     painter.drawPoints(points, 3);
}

void Widget::paintEvent(QPaintEvent *event)
{
// 1. 基本繪圖1,繪制一個填充矩形
   myDrawFilledRect();

// 2.   用材質圖片填充一個矩形
   //myDrawTextureRect();

//3.  漸變填充
//   myDrawGradient();

//4. 繪制基本圖形
   //myDrawShape();

//    QPainter    painter(this);//創建QPainter對象
//    painter.setRenderHint(QPainter::Antialiasing);//
//    painter.setRenderHint(QPainter::TextAntialiasing);//

//    int W=this->width(); //繪圖區寬度
//    int H=this->height(); //繪圖區高度
//    QRect   rect(W/4,H/4,W/2,H/2); //中間區域矩形框

//    QPoint points[9]={
//        QPoint(5*W/12,H/4),
//        QPoint(7*W/12,H/4),
//        QPoint(3*W/4,5*H/12),
//        QPoint(3*W/4,7*H/12),
//        QPoint(7*W/12,3*H/4),
//        QPoint(5*W/12,3*H/4),
//        QPoint(W/4,7*H/12),
//        QPoint(W/4,5*H/12),
//        QPoint(5*W/12,H/4)
//    };

//    QPainterPath  path;
//    path.addRect(rect);
//    path.addEllipse(rect);
//    path.moveTo(points[0]);
//    path.lineTo(points[4]);
//    path.moveTo(points[1]);
//    path.lineTo(points[5]);
//    path.moveTo(points[2]);
//    path.lineTo(points[6]);
//    path.moveTo(points[3]);
//    path.lineTo(points[7]);

//    painter.scale(width() / 100.0, height() / 100.0);
//    painter.translate(50.0, 50.0);

//    qreal   R=100; //半徑
//    const   qreal Pi=3.14159;
//    qreal   deg=Pi*72/180;//

//    QPoint points[5]={
//        QPoint(R,0),
//        QPoint(R*std::cos(deg),-R*std::sin(deg)),
//        QPoint(R*std::cos(2*deg),-R*std::sin(2*deg)),
//        QPoint(R*std::cos(3*deg),-R*std::sin(3*deg)),
//        QPoint(R*std::cos(4*deg),-R*std::sin(4*deg)),
//    };


//    QPainterPath starPath;
//    starPath.moveTo(points[0]);
//    starPath.lineTo(points[2]);
//    starPath.lineTo(points[4]);
//    starPath.lineTo(points[1]);
//    starPath.lineTo(points[3]);
//    starPath.closeSubpath();

//繪制曲線
//    path.moveTo(points[0]);
//    path.cubicTo(points[1],points[4],points[2]);

//設置字體
//    QFont   font;
//    font.setPointSize(30);
//    font.setBold(true);
//    painter.setFont(font);

//設置畫筆
//    QPen    pen;
//    pen.setWidth(3); //線寬
//    pen.setColor(Qt::red); //划線顏色

//    //Qt::NoPen,Qt::SolidLine, Qt::DashLine, Qt::DotLine,Qt::DashDotLine,Qt::DashDotDotLine,Qt::CustomDashLine
//    pen.setStyle(Qt::SolidLine);//線的類型,實線、虛線等

//    //Qt::FlatCap, Qt::SquareCap,Qt::RoundCap
//    pen.setCapStyle(Qt::FlatCap);//線端點樣式

//    //Qt::MiterJoin,Qt::BevelJoin,Qt::RoundJoin,Qt::SvgMiterJoin
//    pen.setJoinStyle(Qt::BevelJoin);//線的連接點樣式
//    painter.setPen(pen);

////設置畫刷
////    QPixmap texturePixmap(":images/images/texture.jpg");
//    QBrush  brush;
//    brush.setColor(Qt::yellow); //畫刷顏色
//    brush.setStyle(Qt::SolidPattern); //畫刷填充樣式
//    brush.setStyle(Qt::TexturePattern); //畫刷填充樣式
//    brush.setTexture(texturePixmap); //設置材質圖片
//    painter.setBrush(brush);

//Qt::NoBrush,Qt::SolidPattern,Qt::Dense1Pattern,Qt::Dense2Pattern,..,Qt::Dense7Pattern,Qt::HorPattern
// Qt::VerPattern, Qt::CrossPattern, Qt::BDiagPattern,Qt::FDiagPattern,Qt::DiagCrossPattern,
// Qt::LinearGradientPattern,Qt::ConicalGradientPattern,Qt::RadialGradientPattern
// Qt::TexturePattern

//線性漸變
//    QLinearGradient  linearGrad(rect.left(),rect.top(),rect.right(),rect.bottom()); //對角線
//    QLinearGradient  linearGrad(rect.left(),rect.top(),rect.right(),rect.top());//從左到右
//    linearGrad.setColorAt(0,Qt::blue);//起點顏色
//    linearGrad.setColorAt(0.5,Qt::blue);//起點顏色
//    linearGrad.setColorAt(1,Qt::red);//終點顏色
//    linearGrad.setSpread(QGradient::ReflectSpread);  //展布模式
//QGradient::PadSpread ,QGradient::RepeatSpread, QGradient::ReflectSpread
//    painter.setBrush(linearGrad);

//徑向漸變
//    QRadialGradient  radialGrad(W/2,H/2,qMax(W/8,H/8),W/2,H/2);
//    radialGrad.setColorAt(0,Qt::white);
//    radialGrad.setColorAt(0,Qt::green);
//    radialGrad.setColorAt(1,Qt::blue);
//    radialGrad.setSpread(QGradient::ReflectSpread);
//    //QGradient::PadSpread ,QGradient::RepeatSpread, QGradient::ReflectSpread
//    painter.setBrush(radialGrad);


//圓錐型漸變
//    QConicalGradient  coniGrad(W/2,H/2,45);
//    coniGrad.setColorAt(0,Qt::yellow);
//    coniGrad.setColorAt(0.5,Qt::blue);
//    coniGrad.setColorAt(1,Qt::green);
//    coniGrad.setSpread(QGradient::PadSpread); //對於錐形漸變不起作用
//    painter.setBrush(coniGrad);


//設置復合模式
//    painter.setCompositionMode(QPainter::CompositionMode_SourceOver);//

//    painter.translate(W/4,H/4);
//    painter.rotate(30);
//    painter.scale(0.5,0.5);
//    painter.shear(0.1,0.5);

//繪圖
//    painter.drawLine(rect.left(),rect.top(),rect.right(),rect.bottom());
//    painter.drawRect(rect); //只填充定義的漸變區域
//    painter.drawRect(this->rect()); //填充更大區域,會有延展效果
//    painter.fillRect(rect,Qt::red);
//    painter.drawRoundRect(rect);
//    painter.drawRoundedRect(rect,40,20);
//    painter.drawEllipse(rect);
//    painter.drawPolyline(points,9);
//    painter.drawPolygon(points,9);
//    painter.drawPoints(points,9);

//    painter.translate(100,300);
//    painter.drawPath(starPath);

//    painter.translate(200,0);
//    painter.drawPath(starPath);

//    painter.translate(200,0);
//    painter.drawPath(starPath);

//    painter.drawArc(rect,30*16,80*16);
//    painter.drawChord(rect,90*16,120*16);
//    painter.drawPie(rect,90*16,120*16);
//    painter.drawText(rect,"Hello, QT");

//    QPixmap pixmap;
//    pixmap.load(":/images/images/qt.jpg");
//    painter.drawPixmap(rect.left(),rect.top(),pixmap);
}

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
   // ui->setupUi(this);

    setPalette(QPalette(Qt::white));//設置窗口為白色背景
    setAutoFillBackground(true);
    this->resize(400,400);
}

Widget::~Widget()
{
    delete ui;
}

然后將設計師界面的widget提升為自己實現的widget,再編譯運行就可以了!

注:兩個按鈕沒啥用,就是練習布局和自定義部件用的。

Qtchart

pro文件引入chart

QT       += charts

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<QtCharts>
QT_CHARTS_USE_NAMESPACE     //使用宏定義


namespace Ui { class MainWindow; }


class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

private:
    void    createChart();//
};
#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);
     createChart();
}

MainWindow::~MainWindow()
{
    delete ui;

}

void MainWindow::createChart()
{ //創建圖表
    QChartView *chartView=new QChartView(this); //創建 ChartView

    QChart *chart = new QChart(); //創建 Chart
    chart->setTitle("簡單函數曲線");

    chartView->setChart(chart); //Chart添加到ChartView
    this->setCentralWidget(chartView);

//創建曲線序列
    QLineSeries *series0 = new QLineSeries();
    QLineSeries *series1 = new QLineSeries();
    series0->setName("Sin曲線");
    series1->setName("Cos曲線");
    chart->addSeries(series0); //序列添加到圖表
    chart->addSeries(series1);

//    QPen    pen;
//    pen.setStyle(Qt::DotLine);//Qt::SolidLine, Qt::DashLine, Qt::DotLine, Qt::DashDotLine
//    pen.setWidth(2);
//    pen.setColor(Qt::red);
//    series0->setPen(pen);

//    pen.setStyle(Qt::SolidLine);//Qt::SolidLine, Qt::DashLine, Qt::DotLine, Qt::DashDotLine
//    pen.setColor(Qt::blue);
//    series1->setPen(pen);

//序列添加數值
    qreal   t=0,y1,y2,intv=0.1;
    int cnt=100;
    for(int i=0;i<cnt;i++)
    {
        y1=qSin(t);//+qrand();
        series0->append(t,y1);

        y2=qSin(t+20);
        series1->append(t,y2);

        t+=intv;
    }


//    chart->createDefaultAxes();
//    chart->axisX()->setTitleText("time(secs)");
//    chart->axisY()->setTitleText("value");

//創建坐標軸
    QValueAxis *axisX = new QValueAxis; //X 軸
    axisX->setRange(0, 10); //設置坐標軸范圍
//    axisX->setLabelFormat("%.1f"); //標簽格式
//    axisX->setTickCount(11); //主分隔個數
//    axisX->setMinorTickCount(4);
    axisX->setTitleText("time(secs)"); //標題
//    axisX->setGridLineVisible(false);

    QValueAxis *axisY = new QValueAxis; //Y 軸
    axisY->setRange(-2, 2);
    axisY->setTitleText("value");
//    axisY->setTickCount(5);
//    axisY->setMinorTickCount(4);
//    axisY->setLabelFormat("%.2f"); //標簽格式
//    axisY->setGridLineVisible(false);

    chart->addAxis(axisX, Qt::AlignBottom);  //並且XY軸的位置是上和右
        chart->addAxis(axisY, Qt::AlignLeft);
//    chart->setAxisX(axisX, series0); //為序列設置坐標軸
//    chart->setAxisY(axisY, series0); //

   // chart->setAxisX(axisX, series1); //為序列設置坐標軸
   // chart->setAxisY(axisY, series1); //
    this->setCentralWidget(chartView);  //將圖表顯示在整個窗口
}

批注

Qt的攝像頭功能不好用,因此可以引用opencv庫,opencv庫需要使用cmake編譯完,然后參考以下鏈接引用opencv:
https://blog.csdn.net/sinat_35845281/article/details/94204074?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

除了語言之外,還有文件系統,多媒體系統,通信系統。

關於Qt組件:
分為輸入組件,輸出組件,布局組件,MVC組件等。
其中,label不僅可以顯示文字,也可以顯示圖片和視頻。

可以使用提升為把基本部件轉化為 自定義部件。

可以使用 Qt樣式表 可以自定義窗口部件樣式。

Qpainter 2D不可交互矢量圖形。

QSQL 數據庫模塊。

參考鏈接:
https://library-cdq.oss-cn-beijing.aliyuncs.com/technology/Qt5.9 c%2B%2B開發指南.pdf
https://github.com/CdqPT/Qt5.9C-DevelopmentTutorialCode/tree/master/Source


免責聲明!

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



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