日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

QT 图形绘制大全

發布時間:2023/12/18 c/c++ 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QT 图形绘制大全 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

1. 繪制圖形

  • protected:

  • void paintEvent(QPaintEvent *);

  • ?
  • void Widget::paintEvent((QPaintEvent *event)

  • {

  • QPainter painter(this); //this為繪圖設備,即表明在該部件上進行繪制

  • painter.drawLine(QPaint(0, 0), QPaint(100, 100));

  • }

  • QPainter painter(this); // 會立即開始在設備上繪制,自動調用begin()函數,然后析構函數中調用end()函數結束繪制。
    QPainter painter;// 不帶參數時,可以在后面調用QPainter::begin(QPaintDevice *device)來指定繪制設置,然后用完再調用end()函數。

    等價于

  • void Widget::paintEvent((QPaintEvent *event)

  • {

  • QPainter painter;

  • painter.begin(this);

  • painter.drawLine(QPaint(0, 0), QPaint(100, 100));

  • painter.end();

  • }

  • 2. 使用畫刷
    畫刷可以設置顏色和填充模式

  • QBrush brush(QColor(0,0,255), Qt::Dense4Pattern);

  • painter.setBrush(brush);

  • 3. 使用畫筆

  • //參數為:畫刷,線寬,畫筆風格,畫筆端點,畫筆連接風格

  • QPen pen(Qt::green, 5, Qt::DotLine, Qt::RoundCap, Qt::RoundJoin);

  • painter.setPen(pen);

  • 4. 繪制矩形

    painter.drawRect(0, 0, 100, 80); //x,y,w,h

    5. 繪制橢圓(圓)

    painter.drawEllipse(0, 0, 100, 80); //x,y,w,h

    6. 繪制圓弧

  • QRectF rect(70.0, 40.0, 80.0, 60.0); //x,y,w,h

  • int startAngle = 30 * 16; //值為,實際角度 * 16

  • int spanAngle = 120 * 16;

  • ?
  • //三個參數:rect表示弧線所在的矩形,startAngle起始角度,spanAngle跨越角度

  • painter.drawArc(rect, startAngle, spanAngle);


  • 7. 繪制扇形

  • QRectF rect_top(20.0, 20.0, 100.0, 100.0);

  • ?
  • // 扇形起始角度

  • int startAngle = 0 * 16;

  • // 扇形覆蓋范圍(120度的)

  • int spanAngle = 120 * 16;

  • painter.drawPie(rect_top, startAngle, spanAngle);

  • 8. 繪制多邊形

  • QPolygon pts;

  • pts.setPoints(3, -1,0, 1,0, 0,39); //第一個參數表示3個點,后面是三個點坐標

  • painter.drawConvexPolygon(pts);

  • 9. 繪制路徑

  • QPainterPath path;

  • path.addEllipse(-4, -4, 8, 8);//添加一個圓

  • path.addRect(-5, -5, 10, 10); //添加一個矩形

  • painter.drawPath(path);

  • 在填充路徑時要用到填充規則,這里一共有兩個填充規則
    path.setFillRule(Qt::OddEventFil);//奇偶填充規則
    如果要判斷一個點是否在圖形中,可以從該點向圖形外引一條水平線,如果該水平線與圖形的交點人個數為奇數,那么該點在在圖形中。
    只填充在圖形內的點
    path.setFillRule(Qt::WindingFill); //非零彎曲規則
    如果要判斷一個點是否在圖形中,可以從該點向圖形外引一條水平線,如果該水平線與圖形的邊線相交,這個邊線是順時針繪制的,就記為1,是逆時針繪制的就記為-1,然后將所有數值相加,結果不為0,那么該點就在圖形中。


    10. 繪制圓環
    根據以上的填充規則,可以得到繪制圓環的一個方便的方法

  • QPainterPath path;

  • path.addEllipse(0,0,100,100);

  • path.addEllipse(25,25,50,50);

  • painter.setBrush(Qt::blue);

  • path.setFillRule(Qt::OddEventFil);//使用奇偶填充,剛好可以只顯示圓環

  • painter.drawPath(path);

  • 11. 填充與擦除

  • //使用畫刷填充一個矩形區域

  • painter.fillRect(QRect(10,100,150,20), QBrush(Qt::darkYellow));

  • ?
  • //擦除一個矩形區域的內容

  • painter.eraserRect(QRect(50,0,50,120));

  • //繪制曲線************************************************************************************

  • 功能描述:用曲線來顯示數據的變化情況。橫坐標表示時間T,縱坐標Y。每隔一定時間取一個Y值確定縱坐標

    ?

    點擊(此處)折疊或打開

  • #include?"dialog.h"
  • #include?"ui_dialog.h"
  • Dialog::Dialog(QWidget?*parent)?:
  • ????QDialog(parent),
  • ????ui(new?Ui::Dialog)
  • {
  • ????ui->setupUi(this);
  • // resize(600,500); //窗口大小設置為600*500
  • ????p?=?t?=?0;
  • ????Point.setX(0);?/* 初始化起始點的縱坐標為0 */
  • ????Point.setY(0);?/* 初始化起始點的橫坐標為0 */
  • ????path?=?new?QPainterPath;
  • ????timer?=?new?QTimer(this);
  • ????connect(timer,SIGNAL(timeout()),this,SLOT(timerUpDate()));?//關聯定時器計滿信號和相應的槽函數
  • ????timer->start(500);
  • }
  • Dialog::~Dialog()
  • {
  • ????delete?ui;
  • }
  • /* 定時時間到 */
  • void?Dialog::timerUpDate()
  • {
  • ????t?+=?10;
  • ????Point.setX(t);?/* 時間加二秒 */
  • ????Point.setY(qrand()?%?100);?/* 設置縱坐標值 */
  • ????path->lineTo(Point);?/* */
  • ????if(t?>?width())?/* 當時間值 T大于窗口的寬度時需調整坐標原點 */
  • ????????p?-=?10;?/* 調整坐標原點 */
  • ????update();
  • }
  • /* 開啟繪畫曲線 也就是開啟定時器 */
  • void?Dialog::startPainting(void)
  • {
  • ????timer->start(2000);
  • }
  • /* 停止繪畫曲線 也就是停止定時器 */
  • void?Dialog::closePainting(void)
  • {
  • ????timer->stop();
  • }
  • /* 重繪事件函數 */
  • void?Dialog::paintEvent(QPaintEvent?*)
  • {
  • ????QPainter painter(this);
  • ????painter.setPen(QPen(Qt::red,?2));?//設置畫筆顏色和大小
  • ????painter.translate(p,0);?//調整坐標原點
  • ????painter.drawPath(*path);?/* 繪制路徑 */
  • }
  • QT 繪制事件 PaintEvent

    對事件的響應是通過信號與槽調用

    ???? 事件中根據事件觸發的條件發出不同的信號

    ???? 比如:鼠標事件發出clicked與dblclicked等信號

    ????

    QT中事件是怎么實現的?

    ? QT把事件自己定義成固定的virtual保護函數

    ? 這些函數自動被系統調用

    ?

    1.??????paintEvent

    案例:

    1.??????覆蓋QWidget的paintEvent

    繪制gdi(Graphics DrawInterface)

    代碼:

    main.cpp

    #include<QApplication>

    #include<QWidget>

    #include “PaintWidget.h”

    int??main(int? args , char? **argv)

    {

    ????QApplication? app(args , argv);

    ????PaintWidget w;

    ????w.resize(400,400);

    ????w.setVisible(true);

    ???? return? app.exec();

    }

    ?

    main.pro

    TEMPLATE=app

    SOURCES=main.cpp PaintWidget.cpp

    HEADERS=PaintWidget.h

    CONFIG=release qt

    QT=core gui

    TARGET=main

    ?

    ?

    PaintWidget.h

    #ifndef PAINT_WIDGET_H

    #define PAINT_WIDGET_H

    #include<QWidget>

    #include<QPaintEvent>

    class?PaintWidget:public QWidget

    {

    protected:

    ??????virtual void paintEvent( QPaintEvent * e);

    };

    #endif

    ?

    PaintWidget.cpp

    ?

    #include “PaintWidget.h”

    #include<QPainter>

    #include<QPoint>

    #include<QImage>

    #include<QPixmap>

    #include<QBitmap>

    #include<QPen>

    ?

    void?PaintWidget::paintEvent(QPaintEvent * e)

    {

    ?????QPoint p[3];

    ?????p[0].setX(10);

    ?????p[0].setY(10);

    ?????p[1].setX(300);

    ?????p[1].setY(10);

    ?????p[2].setX(145);

    ?????p[2].setY(200);

    ?????QImage img(“ok.png”);

    ?????QPixmap? map(“ok.png”);

    ?????QBitmap? bit=map.createMaskFromColor(QColor(0,0,0));

    //?????QPen pen(QColor(255,0,0));

    ?????QBrush br(QColor(0,255,0));

    ??????QPen pen();

    ?????

    ? ????//純黑色設置為透明

    ?????//進行繪制工作

    ?????//1.產生繪制對象QPainter

    ?????QPainter? g(this);? //this參數指定繪制的目標

    ?????//2.設置繪制對象的屬性

    ?????g.setPen(pen);

    ?????g.setFont(“楷書”,45,100);?? //設置字體

    ?????//3.進行繪制:圖形,圖像與字符串

    ?????g.drawLine(10,10,400,400);

    ?????g.drawArc(10,10,300,300,10*16,120*16);

    ?????//前4個參數為弧的外切矩形,參數5,6為起始角度和結束角度,1/16度數

    ?????g.drawConvexPolygon(p,3);? //參數2為多邊形的頂點個數

    ?????g.drawEllipase(0,0,this->width(),this->height());

    ?????g.drawText(100,100, “this is a maomaochong”);

    ?????g.drawImage(10,10,img);

    ? ????g.drawPixmap(10,10,300,300,bit);?

    }

    ?

    ?

    ?

    總結

    以上是生活随笔為你收集整理的QT 图形绘制大全的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。