Qt 5 開發(fā)及實(shí)例(第5版) 課件 第7章 Qt 5繪圖及實(shí)例_第1頁(yè)
Qt 5 開發(fā)及實(shí)例(第5版) 課件 第7章 Qt 5繪圖及實(shí)例_第2頁(yè)
Qt 5 開發(fā)及實(shí)例(第5版) 課件 第7章 Qt 5繪圖及實(shí)例_第3頁(yè)
Qt 5 開發(fā)及實(shí)例(第5版) 課件 第7章 Qt 5繪圖及實(shí)例_第4頁(yè)
Qt 5 開發(fā)及實(shí)例(第5版) 課件 第7章 Qt 5繪圖及實(shí)例_第5頁(yè)
已閱讀5頁(yè),還剩80頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

QT5開發(fā)及實(shí)例(第5版)第7章Qt5繪圖及實(shí)例——基礎(chǔ)圖形的繪制01Qt5繪圖基礎(chǔ)類1.QPainter/QPen/QBrush等類及實(shí)例2.QPainterPath(路徑繪圖)類及實(shí)例Qt5繪圖基礎(chǔ)類1.QPainter/QPen/QBrush等類及實(shí)例(1)QPainter類QPainter類是一個(gè)繪制工具,提供了高度優(yōu)化的函數(shù),可以繪制從簡(jiǎn)單的直線到復(fù)雜圖形,還可以繪制對(duì)齊的文本和圖像。QPainter類在QWidget上執(zhí)行繪圖操作,QWidget類是所有界面控件的基類,它有一個(gè)paintEvent()事件,在此事件里創(chuàng)建一個(gè)QPainter對(duì)象獲取繪圖設(shè)備的接口,就可以用QPainter對(duì)象在繪圖設(shè)備的“畫布”上繪圖了。QWidget繪圖區(qū)如圖。QPainter在繪圖設(shè)備上繪圖,就是用一系列繪圖函數(shù)(draw函數(shù))繪制各種基本的圖形元素,包括點(diǎn)、直線、圓形、矩形、曲線、文字等,常用的繪圖函數(shù)如表。Qt5繪圖基礎(chǔ)類(2)筆和樣式:QPen類QPen(畫筆)是基本圖形對(duì)象,用于繪制矩形、橢圓形、多邊形或其他形狀的線、曲線和輪廓。有預(yù)定義筆樣式,還可以自定義筆樣式。①線條顏色:setColor(color)函數(shù)設(shè)置線條顏色即畫筆顏色,color為QColor類型。對(duì)應(yīng)的讀取畫筆顏色的函數(shù)為color()。②線條寬度:setWidth(width)函數(shù)設(shè)置線條寬度,width為像素。③線條樣式:setStyle(style)函數(shù)用于設(shè)置線條樣式,參數(shù)style是枚舉類型Qt::PenStyle::x,幾種典型的線條樣式的繪圖效果如圖。Qt5繪圖基礎(chǔ)類④線條端點(diǎn)樣式:QPen::setCapStyle(style)函數(shù)用于設(shè)置線條端點(diǎn)樣式,參數(shù)style是一個(gè)枚舉類型Qt::PenCapStyle::x的常量,x有3種取值,對(duì)應(yīng)繪圖效果如圖。⑤線條連接樣式:QPen::setJoinStyle(style)函數(shù)用于設(shè)置兩個(gè)線條連接時(shí)端點(diǎn)的樣式,參數(shù)style是枚舉類型Qt::PenJoinStyle::x,x枚舉類型的取值及其繪圖效果如圖。Qt5繪圖基礎(chǔ)類⑥自定義筆樣式:設(shè)置Qt::PenStyle::CustomDashLine筆樣式并調(diào)用setDashPattern()方法自定義筆樣式。例如:pen->setStyle(Qt::PenStyle::CustomDashLine);pen->setDashPattern([1,4,5,4]);painter->setPen(pen);數(shù)字列表定義樣式數(shù)字項(xiàng)必須是偶數(shù),奇數(shù)定義筆劃線,偶數(shù)對(duì)應(yīng)空格。數(shù)字越大,空格或筆劃線越大。Qt5繪圖基礎(chǔ)類(3)畫刷:QBrush類QBrush定義了QPainter繪圖時(shí)的填充特性,包括填充顏色、填充樣式、材質(zhì)填充時(shí)的材質(zhì)圖片等,其主要函數(shù)如表。函數(shù)功能setColor(color)設(shè)置畫刷顏色,實(shí)體填充時(shí)即為填充顏色,參數(shù)color為QColor類型setStyle(style)設(shè)置畫刷樣式setTexture(pixmap)設(shè)置一個(gè)QPixmap類型的圖片pixmap作為畫刷的圖片,畫刷樣式自動(dòng)設(shè)置為Qt::TexturePatternsetTextureImage(image)設(shè)置一個(gè)QImage類型的圖片image作為畫刷的圖片,畫刷樣式自動(dòng)設(shè)置為Qt::TexturePatternQt5繪圖基礎(chǔ)類表中,setStyle(style)函數(shù)設(shè)置畫刷的樣式,參數(shù)style是枚舉類型Qt::BrushStyle::x,該枚舉類型取值填充效果如圖。圖中:(1行,1列):SolidPattern(1行,2列):Dense1Pattern(1行,3列):Dense2Pattern(1行,4列):Dense3Pattern(1行,5列):DiagCrossPattern(2行,1列):Dense5Pattern(2行,2列):Dense6Pattern(2行,3列):HorPattern(2行,4列):VerPattern(2行,5列):BDiagPattern例如:brush=newQBrush(Qt::BrushStyle::SolidPattern);painter->setBrush(brush);Qt5繪圖基礎(chǔ)類漸變填充包括基本漸變填充和延展填充。①基本漸變填充使用漸變色填充需要用漸變類的對(duì)象作為Painter的brush,有以下3個(gè)用于漸變填充的類。QLinearGradient:線形漸變。指定一個(gè)起點(diǎn)及其顏色,以及一個(gè)終點(diǎn)及其顏色,還可以指定中間的某個(gè)點(diǎn)的顏色。QRadialGradient:輻射形漸變。有簡(jiǎn)單輻射形漸變和擴(kuò)展輻射形漸變兩種方式。QConicalGradient:圓錐形漸變。圍繞一個(gè)中心點(diǎn)逆時(shí)針生成漸變色。這3個(gè)漸變類都繼承自QGradient類,其填充效果如圖。Qt5繪圖基礎(chǔ)類②延展填充參數(shù)method是枚舉類型,取值如下:PadSpread:用結(jié)束點(diǎn)的顏色填充外部區(qū)域,這是默認(rèn)的方式。RepeatSpread:重復(fù)使用漸變方式填充外部區(qū)域。ReflectSpread:反射式重復(fù)使用漸變方式填充外部區(qū)域。這3種延展填充的效果如圖。Qt5繪圖基礎(chǔ)類(4)圖形屬性設(shè)置與獲取QPainter類繪制操作在QWidget.paintEvent()中完成,所有繪圖代碼都必須寫在QtGui.QPainter對(duì)象的begin()和end()之間。將定義好的QPen、QBrush對(duì)象作為屬性設(shè)置到QPainter上,即可畫出指定線條樣式和填充的圖形。QPainter類提供了一系列函數(shù)用于設(shè)置和獲取圖形屬性,其中部分常用的函數(shù)如表。函數(shù)原型功能setPen(線型,顏色)pen()設(shè)置畫筆線型和顏色獲取當(dāng)前畫筆rotate(角度)指定圖形旋轉(zhuǎn)角度(弧度)save()restore()保存當(dāng)前圖形恢復(fù)保存圖形scale(sx,sy)按(sx,sy)比例縮放setBrush(brush)brush()設(shè)置畫刷獲取當(dāng)前畫刷setFont()font()設(shè)置字體獲取字體setBackground(顏色)setBackgroundMode(mode)設(shè)置背景顏色設(shè)置背景模式setRenderHint(hint,邏輯值)

renderHints()設(shè)置抗鋸齒(QPainter::RenderHint::x):Antialiasing:圖形邊緣抗鋸齒。TextAntialiasing:文本抗鋸齒。獲取狀態(tài)translate(offset)以當(dāng)前位置移動(dòng)offsetcompositionMode()圖像合成支持的模式begin()end()繪圖開始繪圖結(jié)束Qt5繪圖基礎(chǔ)類(5)QPainter基本繪圖實(shí)例【例】(簡(jiǎn)單)(CH701)用QPainter結(jié)合QPen、QBrush等類繪圖,實(shí)現(xiàn)圖形改變線型、填色,同時(shí)畫文本和圖像。以“直接編寫代碼”(即取消勾選“Generateform”復(fù)選框)方式創(chuàng)建Qt項(xiàng)目,項(xiàng)目名painterDraw,“ClassInformation”頁(yè)基類選“QWidget”。代碼如下(painterDraw.cpp):運(yùn)行程序,顯示如圖。Qt5繪圖基礎(chǔ)類2.QPainterPath(路徑繪圖)類及實(shí)例(1)QPainterPath類QPainterPath類提供了一個(gè)繪制路徑的容器,可以創(chuàng)建和重用圖形形狀。QPainterPath是一個(gè)圖形構(gòu)建塊的對(duì)象(如矩形、橢圓、直線和曲線),構(gòu)建塊可以加入在封閉的子路徑(如矩形和橢圓形)或者作為未封閉的子路徑獨(dú)立存在(如直線和曲線)。QPainterPath可以進(jìn)行填充、顯示輪廓和裁剪,還可以使用QPainterPathStroker類生成可填充輪廓的繪圖路徑。Qt5繪圖基礎(chǔ)類函數(shù)功能arcTo(rect,staryAngle,arcLength)連線到弧moveTo(point)移動(dòng)到點(diǎn),關(guān)閉一個(gè)子路徑,開始一個(gè)新的子路徑lineTo(point)連線到點(diǎn)quadTo(ctrlPoint,endPoint)由當(dāng)前點(diǎn)經(jīng)過(guò)控制點(diǎn)到達(dá)結(jié)束點(diǎn)cubicTo(ctrlPoint1,ctrlPoint2,endPoint)由當(dāng)前點(diǎn)經(jīng)過(guò)2個(gè)控制點(diǎn)到達(dá)結(jié)束點(diǎn)addEllipse(rect)加入橢圓addPolygon(polygon)加入多邊形addRect(rect)加入矩形addRountedRect(rect,xR,yR,mode)加入圓角矩形addText(point,font,text)加入指定點(diǎn)位置文本addPath(path)加入子路徑setFillRule(fillRule)fillRule()設(shè)置填充規(guī)則獲取填充規(guī)則translate(dx,dy)translated(dx,dy)將當(dāng)前點(diǎn)移動(dòng)offset(dx,dy)currentPosition()獲取當(dāng)前位置connectPath(path)連接到子路徑closeSubpath()關(guān)閉當(dāng)前路徑clear()清除isEmpty()檢測(cè)是否為空QPainterPath類的常用函數(shù)如表。Qt5繪圖基礎(chǔ)類(2)QPainterPath路徑繪圖實(shí)例【例】(簡(jiǎn)單)(CH702)用QPainterPath編程演示路徑繪圖。以“直接編寫代碼”(即取消勾選“Generateform”復(fù)選框)方式創(chuàng)建Qt項(xiàng)目,項(xiàng)目名painterPathDraw,“ClassInformation”頁(yè)基類選“QWidget”。代碼如下(painterPathDraw.cpp):運(yùn)行程序,顯示如圖。02QPainter繪圖框架實(shí)例1.程序結(jié)構(gòu)及項(xiàng)目創(chuàng)建2.繪圖區(qū)的實(shí)現(xiàn)3.設(shè)置區(qū)的實(shí)現(xiàn)QPainter繪圖框架實(shí)例【例】(難度中等)(CH703)用前面介紹的QPainter等Qt5的繪圖基礎(chǔ)類設(shè)計(jì)一個(gè)集成了各種圖形設(shè)置功能的繪圖框架,界面如圖。QPainter繪圖框架實(shí)例1.程序結(jié)構(gòu)及項(xiàng)目創(chuàng)建顯然,本例程序的界面分為左右兩塊區(qū)域,左邊是繪圖區(qū),右邊為設(shè)置區(qū),它們分別對(duì)應(yīng)了程序主體結(jié)構(gòu)的兩大部分:一是用于畫圖的區(qū)域PaintArea類(實(shí)現(xiàn)繪圖區(qū));二是主窗口MainWidget類(實(shí)現(xiàn)設(shè)置區(qū)),故整個(gè)程序可簡(jiǎn)單地表示為如圖的結(jié)構(gòu)。QPainter繪圖框架實(shí)例根據(jù)設(shè)計(jì)的程序結(jié)構(gòu)來(lái)創(chuàng)建Qt項(xiàng)目,步驟如下。(1)以“直接編寫代碼”(即取消勾選“Generateform”復(fù)選框)方式創(chuàng)建Qt項(xiàng)目,項(xiàng)目名PaintEx,“ClassInformation”頁(yè)基類選“QWidget”,類名命名為“MainWidget”。(2)創(chuàng)建實(shí)現(xiàn)繪圖區(qū)的PaintArea類。右擊項(xiàng)目名,彈出快捷菜單選“添加新文件...”選項(xiàng),在彈出的對(duì)話框中選擇“C++Class”選項(xiàng)。單擊“Choose...”按鈕,在彈出的對(duì)話框的“Baseclass”下拉列表框中選擇基類名“QWidget”,在“Classname”文本框中輸入類的名稱“PaintArea”。QPainter繪圖框架實(shí)例2.繪圖區(qū)的實(shí)現(xiàn)PaintArea類繼承自QWidget類,在類聲明中,首先聲明一個(gè)枚舉型數(shù)據(jù)Shape,列舉了所有本實(shí)例可能用到的圖形形狀;其次聲明setShape()函數(shù)用于設(shè)置形狀,setPen()函數(shù)用于設(shè)置畫筆,setBrush()函數(shù)用于設(shè)置畫刷,setFillRule()函數(shù)用于設(shè)置填充模式,以及重繪事件paintEvent()函數(shù);最后聲明表示各種屬性的私有變量。打開paintarea.h頭文件,添加如下代碼。QPainter繪圖框架實(shí)例PaintArea類的構(gòu)造函數(shù)用于完成初始化工作,設(shè)置圖形顯示區(qū)域的背景色及最小顯示尺寸,具體代碼如下:#include"paintarea.h"#include<QPainter>PaintArea::PaintArea(QWidget*parent):QWidget(parent){setPalette(QPalette(Qt::white));setAutoFillBackground(true);setMinimumSize(400,400);}其中,setPalette(QPalette(Qt::white))、setAutoFillBackground(true)完成對(duì)窗體背景色的設(shè)置,與下面的代碼效果一致:QPalettep=palette();p.setColor(QPalette::Window,Qt::white);setPalette(p);QPainter繪圖框架實(shí)例setShape()函數(shù)可以設(shè)置形狀,setPen()函數(shù)可以設(shè)置畫筆,setBrush()函數(shù)可以設(shè)置畫刷,setFillRule()函數(shù)可以設(shè)置填充模式,具體代碼實(shí)現(xiàn)如下:voidPaintArea::setShape(Shapes){shape=s;update();}voidPaintArea::setPen(QPenp){

pen=p;

update();}voidPaintArea::setBrush(QBrushb){

brush=b;

update();}voidPaintArea::setFillRule(Qt::FillRulerule){

fillRule=rule;

update(); //重畫繪制區(qū)窗體}PaintArea類的重畫函數(shù)代碼。QPainter繪圖框架實(shí)例3.設(shè)置區(qū)的實(shí)現(xiàn)實(shí)現(xiàn)界面設(shè)置區(qū)的主窗口類MainWidget繼承自QWidget類,其頭文件mainwidget.h中包含完成各種圖形參數(shù)選擇的控制區(qū)的聲明、一系列設(shè)置與畫圖相關(guān)參數(shù)的槽函數(shù)的聲明,以及一個(gè)繪圖區(qū)PaintArea對(duì)象的聲明,代碼示例。MainWidget類的構(gòu)造函數(shù)中創(chuàng)建了各參數(shù)選擇欄的控件,打開mainwidget.cpp文件,添加如下代碼。說(shuō)明:(a)shapeComboBox->addItem(tr("Line"),PaintArea::Line):QComboBox的addItem()函數(shù)可以僅插入文本,也可同時(shí)插入與文本相對(duì)應(yīng)的具體數(shù)據(jù),通常為枚舉型數(shù)據(jù),便于后面操作時(shí)確定選擇的是哪個(gè)數(shù)據(jù)。(b)penStyleComboBox->addItem(tr("SolidLine"),static_cast<int>(Qt::SolidLine)):選用不同的參數(shù),對(duì)應(yīng)畫筆的不同線條樣式。(c)penCapComboBox->addItem(tr("SquareCap"),Qt::SquareCap):選用不同的參數(shù),對(duì)應(yīng)畫筆頂帽的不同風(fēng)格(即端點(diǎn)樣式)。(d)penJoinComboBox->addItem(tr("BevelJoin"),Qt::BevelJoin):選用不同的參數(shù),對(duì)應(yīng)畫筆連接點(diǎn)的不同風(fēng)格(即線條連接樣式)。QPainter繪圖框架實(shí)例(e)fillRuleComboBox->addItem(tr("OddEven"),Qt::OddEvenFill):Qt為QPainterPath類提供了兩種填充規(guī)則,分別是Qt::OddEvenFill和Qt::WindingFill,如圖。QPainter繪圖框架實(shí)例其中,Qt::OddEvenFill填充規(guī)則判斷的依據(jù)是從圖形中某一點(diǎn)畫一條水平線到圖形外。若這條水平線與圖形邊線的交點(diǎn)數(shù)目為奇數(shù),則說(shuō)明此點(diǎn)位于圖形的內(nèi)部;若交點(diǎn)數(shù)目為偶數(shù),則此點(diǎn)位于圖形的外部,如圖。QPainter繪圖框架實(shí)例而Qt::WindingFill填充規(guī)則的判斷依據(jù)則是從圖形中某一點(diǎn)畫一條水平線到圖形外,每個(gè)交點(diǎn)外邊線的方向可能向上,也可能向下,將這些交點(diǎn)數(shù)累加,方向相反的相互抵消,若最后結(jié)果不為0則說(shuō)明此點(diǎn)在圖形內(nèi),若最后結(jié)果為0則說(shuō)明在圖形外,如圖。(f)spreadComboBox->addItem(tr("PadSpread"),QGradient::PadSpread):鋪展效果也就是延展填充的效果有3種,分別為QGradient::PadSpread、QGradient::RepeatSpread和QGradient::ReflectSpread。(g)brushStyleComboBox->addItem(tr("SolidPattern"),static_cast<int>(Qt::SolidPattern)):選用不同的參數(shù),對(duì)應(yīng)畫刷的不同填充樣式。QPainter繪圖框架實(shí)例ShowShape()槽函數(shù)根據(jù)當(dāng)前下拉列表框中選擇的選項(xiàng),調(diào)用PaintArea類的setShape()函數(shù)設(shè)置PaintArea對(duì)象的形狀參數(shù),具體代碼如下:voidMainWidget::ShowShape(intvalue){PaintArea::Shapeshape=PaintArea::Shape(shapeComboBox->itemData(value,Qt::UserRole).toInt());paintArea->setShape(shape);}其中,QComboBox類的itemData方法返回當(dāng)前顯示的下拉列表框數(shù)據(jù),是一個(gè)QVariant對(duì)象,此對(duì)象與控件初始化時(shí)插入的枚舉型數(shù)據(jù)相關(guān),調(diào)用QVariant類的toInt()函數(shù)獲得此數(shù)據(jù)在枚舉型數(shù)據(jù)集合中的序號(hào)。QPainter繪圖框架實(shí)例在此函數(shù)中獲得與畫筆相關(guān)的所有屬性值,包括畫筆顏色、畫筆線寬、畫筆風(fēng)格、畫筆頂帽及畫筆連接點(diǎn),共同構(gòu)成QPen對(duì)象,并調(diào)用PaintArea對(duì)象的setPen()函數(shù)設(shè)置PaintArea對(duì)象的畫筆屬性。其他與畫筆參數(shù)相關(guān)的響應(yīng)函數(shù)完成的工作與此類似,具體代碼如下:voidMainWidget::ShowPenColor(){QColorcolor=QColorDialog::getColor(static_cast<int>(Qt::blue));penColorFrame->setPalette(QPalette(color));intvalue=penWidthSpinBox->value();Qt::PenStylestyle=Qt::PenStyle(penStyleComboBox->itemData(penStyleComboBox->currentIndex(),Qt::UserRole).toInt());Qt::PenCapStylecap=Qt::PenCapStyle(penCapComboBox->itemData(penCapComboBox->currentIndex(),Qt::UserRole).toInt());Qt::PenJoinStylejoin=Qt::PenJoinStyle(penJoinComboBox->itemData(penJoinComboBox->currentIndex(),Qt::UserRole).toInt());paintArea->setPen(QPen(color,value,style,cap,join));}QPainter繪圖框架實(shí)例ShowPenWidth()槽函數(shù)的具體實(shí)現(xiàn)代碼如下:voidMainWidget::ShowPenWidth(intvalue){QColorcolor=penColorFrame->palette().color(QPalette::Window);Qt::PenStylestyle=Qt::PenStyle(penStyleComboBox->itemData(penStyleComboBox->currentIndex(),Qt::UserRole).toInt());Qt::PenCapStylecap=Qt::PenCapStyle(penCapComboBox->itemData(penCapComboBox->currentIndex(),Qt::UserRole).toInt());Qt::PenJoinStylejoin=Qt::PenJoinStyle(penJoinComboBox->itemData(penJoinComboBox->currentIndex(),Qt::UserRole).toInt());paintArea->setPen(QPen(color,value,style,cap,join));}QPainter繪圖框架實(shí)例ShowPenStyle()槽函數(shù)的具體實(shí)現(xiàn)代碼如下:voidMainWidget::ShowPenStyle(intstyleValue){QColorcolor=penColorFrame->palette().color(QPalette::Window);intvalue=penWidthSpinBox->value();Qt::PenStylestyle=Qt::PenStyle(penStyleComboBox->itemData(styleValue,Qt::UserRole).toInt());Qt::PenCapStylecap=Qt::PenCapStyle(penCapComboBox->itemData(penCapComboBox->currentIndex(),Qt::UserRole).toInt());Qt::PenJoinStylejoin=Qt::PenJoinStyle(penJoinComboBox->itemData(penJoinComboBox->currentIndex(),Qt::UserRole).toInt());paintArea->setPen(QPen(color,value,style,cap,join));}QPainter繪圖框架實(shí)例ShowPenCap()槽函數(shù)的具體實(shí)現(xiàn)代碼如下:voidMainWidget::ShowPenCap(intcapValue){QColorcolor=penColorFrame->palette().color(QPalette::Window);intvalue=penWidthSpinBox->value();Qt::PenStylestyle=Qt::PenStyle(penStyleComboBox->itemData(penStyleComboBox->currentIndex(),Qt::UserRole).toInt());Qt::PenCapStylecap=Qt::PenCapStyle(penCapComboBox->itemData(capValue,Qt::UserRole).toInt());Qt::PenJoinStylejoin=Qt::PenJoinStyle(penJoinComboBox->itemData(penJoinComboBox->currentIndex(),Qt::UserRole).toInt());paintArea->setPen(QPen(color,value,style,cap,join));}QPainter繪圖框架實(shí)例ShowPenJoin()槽函數(shù)的具體實(shí)現(xiàn)代碼如下:voidMainWidget::ShowPenJoin(intjoinValue){QColorcolor=penColorFrame->palette().color(QPalette::Window);intvalue=penWidthSpinBox->value();Qt::PenStylestyle=Qt::PenStyle(penStyleComboBox->itemData(penStyleComboBox->currentIndex(),Qt::UserRole).toInt());Qt::PenCapStylecap=Qt::PenCapStyle(penCapComboBox->itemData(penCapComboBox->currentIndex(),Qt::UserRole).toInt());Qt::PenJoinStylejoin=Qt::PenJoinStyle(penJoinComboBox->itemData(joinValue,Qt::UserRole).toInt());paintArea->setPen(QPen(color,value,style,cap,join));}QPainter繪圖框架實(shí)例ShowFillRule()槽函數(shù)的具體實(shí)現(xiàn)代碼如下:voidMainWidget::ShowFillRule(){Qt::FillRulerule=Qt::FillRule(fillRuleComboBox->itemData(fillRuleComboBox->currentIndex(),Qt::UserRole).toInt());paintArea->setFillRule(rule);}ShowSpreadStyle()槽函數(shù)的具體實(shí)現(xiàn)代碼如下:voidMainWidget::ShowSpreadStyle(){spread=QGradient::Spread(spreadComboBox->itemData(spreadComboBox->currentIndex(),Qt::UserRole).toInt());}QPainter繪圖框架實(shí)例ShowBrushColor()槽函數(shù)與設(shè)置畫筆顏色函數(shù)類似,但選定顏色后并不直接調(diào)用PaintArea對(duì)象的setBrush()函數(shù),而是調(diào)用ShowBrush()函數(shù)設(shè)置顯示區(qū)的畫刷屬性,具體實(shí)現(xiàn)代碼如下:voidMainWidget::ShowBrushColor(){QColorcolor=QColorDialog::getColor(static_cast<int>(Qt::blue));brushColorFrame->setPalette(QPalette(color));ShowBrush(brushStyleComboBox->currentIndex());}ShowBrush()槽函數(shù)的具體實(shí)現(xiàn)代碼。QPainter繪圖框架實(shí)例最后,打開項(xiàng)目的main.cpp文件,修改代碼如下:#include"mainwidget.h"#include<QApplication>#include<QFont>intmain(intargc,char*argv[]){QApplicationa(argc,argv);QFontf("ZYSong18030",12);a.setFont(f);MainWidgetw;w.show();returna.exec();}03繪制實(shí)時(shí)時(shí)鐘實(shí)例1.實(shí)現(xiàn)思路2.程序邏輯設(shè)計(jì)3.代碼實(shí)現(xiàn)繪制實(shí)時(shí)時(shí)鐘實(shí)例【例】(難度中等)(CH704)運(yùn)用QPainter的各種圖形屬性設(shè)置與獲取方法,結(jié)合Qt的定時(shí)器,設(shè)計(jì)實(shí)現(xiàn)一個(gè)動(dòng)態(tài)的實(shí)時(shí)時(shí)鐘,運(yùn)行效果如圖。繪制實(shí)時(shí)時(shí)鐘實(shí)例1.實(shí)現(xiàn)思路考慮采用如下方法實(shí)現(xiàn):(1)時(shí)針形狀和分針形狀用多邊形對(duì)象,填色不帶邊框。時(shí)分秒針采用不同顏色。(2)用繪制文本的方式顯示當(dāng)前日期。(3)創(chuàng)建定時(shí)器,1秒觸發(fā)一次繪制事件,執(zhí)行繪制程序,實(shí)現(xiàn)動(dòng)態(tài)效果。2.程序邏輯設(shè)計(jì)根據(jù)以上思路來(lái)設(shè)計(jì)繪制程序的邏輯流程,描述如下:(1)根據(jù)當(dāng)前日期,繪制當(dāng)前日期文本。(2)繪制時(shí)鐘背景:①循環(huán)12次,每次先初始位置繪制小時(shí)線條,然后根據(jù)小時(shí)變量值旋轉(zhuǎn)對(duì)應(yīng)角度,繪制對(duì)應(yīng)小時(shí)刻度。②循環(huán)60次,每次先初始位置繪制分鐘線條,然后根據(jù)分鐘變量值旋轉(zhuǎn)對(duì)應(yīng)角度,繪制對(duì)應(yīng)分鐘刻度。(3)設(shè)置時(shí)針畫筆和畫刷,保存當(dāng)前繪圖,根據(jù)當(dāng)前小時(shí),旋轉(zhuǎn)對(duì)應(yīng)角度,畫時(shí)針多邊形,恢復(fù)保存繪圖。(4)設(shè)置分針畫筆和畫刷,保存當(dāng)前繪圖,根據(jù)當(dāng)前分鐘,旋轉(zhuǎn)對(duì)應(yīng)角度,畫分針多邊形,恢復(fù)保存繪圖。(5)設(shè)置秒針畫筆和畫刷,保存當(dāng)前繪圖,根據(jù)當(dāng)前秒數(shù),旋轉(zhuǎn)對(duì)應(yīng)角度,畫秒針直線,恢復(fù)保存繪圖。繪制實(shí)時(shí)時(shí)鐘實(shí)例3.代碼實(shí)現(xiàn)以“直接編寫代碼”(即取消勾選“Generateform”復(fù)選框)方式創(chuàng)建Qt項(xiàng)目,項(xiàng)目名drawClock,“ClassInformation”頁(yè)基類選“QWidget”,類名命名為“myClock”。代碼如下(drawClock.cpp):說(shuō)明:如果在myClock類的源文件中加入如下方法代碼:voidmyClock::resizeEvent(QPaintEvent*event){intw=this->width();inth=this->height();intside=std::min(w,h);//為窗口設(shè)置一個(gè)圓形遮罩QRegion*maskedRegion=newQRegion(QRect(w/2-side/2,h/2-side/2,side,side),QRegion::RegionType::Ellipse);this->setMask(*maskedRegion);}繪制實(shí)時(shí)時(shí)鐘實(shí)例去除窗口的外框,顯示效果如圖7.18所示。QT5開發(fā)及實(shí)例(第5版)第7章Qt5繪圖及實(shí)例——GraphicsView繪圖01視圖、場(chǎng)景、圖元的概念1.視圖:QGraphicsView類2.場(chǎng)景:QGraphicsScene類3.圖元:QGraphicsItem類視圖、場(chǎng)景、圖元的概念Qt針對(duì)這三元素對(duì)應(yīng)有三個(gè)基類實(shí)現(xiàn),在其上又派生出眾多子類,它們一起組成了完整的GraphicsView系統(tǒng)。三元素之間的關(guān)系如圖。視圖、場(chǎng)景、圖元的概念1.視圖:QGraphicsView類視圖是一種控件,它提供一個(gè)可視的窗口用于顯示場(chǎng)景中的圖元。在同一個(gè)場(chǎng)景中可以有多個(gè)視圖,也可以將一個(gè)視圖先后與不同的場(chǎng)景相關(guān)聯(lián)。視圖是可滾動(dòng)的窗口部件,可以提供滾動(dòng)條來(lái)瀏覽大的場(chǎng)景。如果需要使用OpenGL,則可以用QGraphicsView::setViewport()函數(shù)將視圖設(shè)置為QGLWidget。視圖能接受鍵盤和鼠標(biāo)的輸入事件,并將它們翻譯為場(chǎng)景事件。使用變換矩陣函數(shù)QGraphicsView::matrix()可以變換場(chǎng)景的坐標(biāo),實(shí)現(xiàn)場(chǎng)景縮放和旋轉(zhuǎn)。視圖、場(chǎng)景、圖元的概念2.場(chǎng)景:QGraphicsScene類場(chǎng)景主要完成的工作包括:(1)提供對(duì)它包含的圖元的操作接口和傳遞事件。通過(guò)Qt的事件傳播體系結(jié)構(gòu)將場(chǎng)景事件發(fā)送給圖元,同時(shí)也管理圖元之間的事件傳播。(2)管理各個(gè)圖元的狀態(tài)(如選擇和焦點(diǎn)處理)??梢酝ㄟ^(guò)QGraphicsScene::setSelectionArea()函數(shù)選擇圖元,選擇區(qū)域可以是任意形狀(用QPainterPath表示)。若要得到當(dāng)前選擇的圖元列表,則可以使用QGraphicsScene::selectedItems()函數(shù)。可以通過(guò)QGraphicsScene::setFocusItem()函數(shù)或QGraphicsScene::setFocus()函數(shù)來(lái)設(shè)置圖元的焦點(diǎn),獲得當(dāng)前具有焦點(diǎn)的圖元使用QGraphicsScene::focusItem()函數(shù)。(3)提供無(wú)變換的繪制(如打?。┕δ?。如果需要將場(chǎng)景內(nèi)容繪制到特定的繪圖設(shè)備,則可以使用QGraphicsScene::render()函數(shù)在繪圖設(shè)備上繪制場(chǎng)景。視圖、場(chǎng)景、圖元的概念3.圖元:QGraphicsItem類QGraphicsItem主要有以下功能。

處理鼠標(biāo)按下、移動(dòng)、釋放、雙擊、懸停、滾輪和右鍵菜單事件。

處理鍵盤輸入事件。

處理拖曳事件。

分組。

碰撞檢測(cè)。此外,圖元也有自己的坐標(biāo)系統(tǒng),也能提供場(chǎng)景和圖元。圖元還可以通過(guò)QGraphicsItem::matrix()函數(shù)來(lái)進(jìn)行自身的交換,可以包含子圖元。使用GraphicsView圖元系統(tǒng)來(lái)繪圖還具有如下這些優(yōu)點(diǎn):(1)可以充分利用Qt繪圖系統(tǒng)的反鋸齒、OpenGL工具來(lái)改善繪圖性能。(2)GraphicsView支持事件傳播體系結(jié)構(gòu),可以使圖元在場(chǎng)景中的交互能力提高1倍,圖元能夠處理鍵盤事件和鼠標(biāo)事件。其中,鼠標(biāo)事件包括鼠標(biāo)被按下、移動(dòng)、釋放和雙擊,還可以跟蹤鼠標(biāo)的移動(dòng)。(3)GraphicsView系統(tǒng)通過(guò)二元空間劃分樹(BinarySpacePartitioning,BSP)提供快速的圖元查找,甚至能夠?qū)崟r(shí)地顯示包含上百萬(wàn)個(gè)圖元的超大場(chǎng)景!02GraphicsView坐標(biāo)系統(tǒng)1.視圖坐標(biāo)2.場(chǎng)景坐標(biāo)3.圖元坐標(biāo)GraphicsView坐標(biāo)系統(tǒng)1.視圖坐標(biāo)視圖坐標(biāo)是窗口部件的坐標(biāo)。視圖坐標(biāo)的單位是像素。QGraphicsView視圖的左上角是(0,0),x軸正方向向右,y軸正方向向下。所有的鼠標(biāo)事件最開始都是使用視圖坐標(biāo)。QGraphicsView類繼承自QWidget類,因此它與其他的QWidget類一樣,以窗口的左上角作為自己坐標(biāo)系的原點(diǎn),如圖。GraphicsView坐標(biāo)系統(tǒng)2.場(chǎng)景坐標(biāo)場(chǎng)景坐標(biāo)是所有圖元的基礎(chǔ)坐標(biāo)系統(tǒng)。場(chǎng)景坐標(biāo)描述了頂層的圖元,每個(gè)圖元都有場(chǎng)景坐標(biāo)和相應(yīng)的包容框。場(chǎng)景坐標(biāo)的原點(diǎn)在場(chǎng)景中心,x軸正方向向右,y軸正方向向下。QGraphicsScene類的坐標(biāo)系以場(chǎng)景中心為原點(diǎn)(0,0),如圖。GraphicsView坐標(biāo)系統(tǒng)3.圖元坐標(biāo)圖元使用自己的本地坐標(biāo),這個(gè)坐標(biāo)系統(tǒng)通常以圖元中心為原點(diǎn),它也是所有變換的原點(diǎn)。圖元坐標(biāo)方向也是x軸正方向向右,y軸正方向向下。創(chuàng)建圖元后,只需注意圖元坐標(biāo)就可以了,QGraphicsView和QGraphicsScene會(huì)完成所有的變換。在調(diào)用QGraphicsItem類的paint()函數(shù)重繪圖元時(shí),就以圖元坐標(biāo)系為基準(zhǔn),如圖。GraphicsView坐標(biāo)系統(tǒng)GraphicsView系統(tǒng)提供的各種坐標(biāo)變換函數(shù),見表。函數(shù)轉(zhuǎn)換類型QGraphicsView::mapToScene()從視圖到場(chǎng)景QGraphicsView::mapFromScene()從場(chǎng)景到視圖QGraphicsItem::mapToScene()從圖元到場(chǎng)景QGraphicsItem::mapFromScene()從場(chǎng)景到圖元QGraphicsItem::mapToParent()從子圖元到父圖元QGraphicsItem::mapFromParent()從父圖元到子圖元QGraphicsItem::mapToItem()從本圖元到其他圖元QGraphicsItem::mapFromItem()從其他圖元到本圖元03飛舞的蝴蝶實(shí)例1.創(chuàng)建項(xiàng)目及圖元類2.自定義圖元功能3.圖元加入場(chǎng)景飛舞的蝴蝶實(shí)例【例】(難度中等)(CH705)設(shè)計(jì)程序,在屏幕上顯示一只上下翻飛的美麗蝴蝶。1.創(chuàng)建項(xiàng)目及圖元類(1)以“直接編寫代碼”(即取消勾選“Generateform”復(fù)選框)方式創(chuàng)建Qt項(xiàng)目,項(xiàng)目名Butterfly,“ClassInformation”頁(yè)基類選“QMainWindow”,類名命名為“MainWindow”。(2)創(chuàng)建實(shí)現(xiàn)蝴蝶圖元的Butterfly類。右擊項(xiàng)目名,彈出快捷菜單選“添加新文件...”選項(xiàng),在彈出的對(duì)話框中選擇“C++Class”選項(xiàng)。單擊“Choose...”按鈕,在彈出的對(duì)話框的“Baseclass”下拉列表框中選擇基類名“QObject”,在“Classname”文本框中輸入類的名稱“Butterfly”。單擊“下一步”按鈕,單擊“完成”按鈕,生成圖元類Butterfly的頭文件butterfly.h和源文件butterfly.cpp。飛舞的蝴蝶實(shí)例2.自定義圖元功能(1)Butterfly類繼承自QObject類和QGraphicsItem類,在頭文件butterfly.h中完成的代碼如下:#include<QObject>#include<QGraphicsItem>#include<QPainter>#include<QGraphicsScene>#include<QGraphicsView>classButterfly:publicQObject,publicQGraphicsItem{Q_OBJECTpublic:explicitButterfly(QObject*parent=0);voidtimerEvent(QTimerEvent*); //(a)QRectFboundingRect()const; //(b)signals:publicslots:protected:voidpaint(QPainter*painter,constQStyleOptionGraphicsItem*option,QWidget*widget); //重繪函數(shù)private:boolup; //(c)QPixmappix_up; //翅膀掀起的蝴蝶圖片QPixmappix_down; //翅膀撲下的蝴蝶圖片qrealangle;};飛舞的蝴蝶實(shí)例(2)在源文件butterfly.cpp中完成的代碼如下:#include"butterfly.h"#include<math.h>conststaticdoublePI=3.1416;Butterfly::Butterfly(QObject*parent):QObject(parent){up=true; //給標(biāo)志蝴蝶翅膀位置的變量賦初值//調(diào)用QPixmap的load()函數(shù)加載所用的圖片pix_up.load("up.png");pix_down.load("down.png");startTimer(100); //啟動(dòng)定時(shí)器并設(shè)置時(shí)間間隔100毫秒}boundingRect()函數(shù)為圖元限定區(qū)域范圍,此范圍是以圖元自身的坐標(biāo)系為基礎(chǔ)設(shè)定的,具體實(shí)現(xiàn)代碼如下:QRectFButterfly::boundingRect()const{qrealadjust=2;returnQRectF(-pix_up.width()/2-adjust,-pix_up.height()/2-adjust, pix_up.width()+adjust*2,pix_up.height()+adjust*2);}飛舞的蝴蝶實(shí)例在重繪函數(shù)paint()中,首先判斷當(dāng)前已顯示的圖片是pix_up還是pix_down。實(shí)現(xiàn)蝴蝶翅膀上下翻飛效果時(shí),若當(dāng)前顯示的是pix_up(翅膀掀起)圖片,則重繪pix_down(翅膀撲下)圖片,反之亦然。具體實(shí)現(xiàn)代碼如下:voidButterfly::paint(QPainter*painter,constQStyleOptionGraphicsItem*option,QWidget*widget){if(up){painter->drawPixmap(boundingRect().topLeft(),pix_up);up=!up;}else{painter->drawPixmap(boundingRect().topLeft(),pix_down);up=!up;}}飛舞的蝴蝶實(shí)例定時(shí)器的timerEvent()函數(shù)實(shí)現(xiàn)蝴蝶的飛舞,具體代碼如下:voidButterfly::timerEvent(QTimerEvent*){//邊界控制qrealedgex=scene()->sceneRect().right()+boundingRect().width()/2; //限定蝴蝶飛舞的右邊界qrealedgetop=scene()->sceneRect().top()+boundingRect().height()/2; //限定蝴蝶飛舞的上邊界qrealedgebottom=scene()->sceneRect().bottom()+boundingRect().height()/2; //限定蝴蝶飛舞的下邊界if(pos().x()>=edgex) //若超過(guò)了右邊界,則水平移回左邊界處setPos(scene()->sceneRect().left(),pos().y());if(pos().y()<=edgetop) //若超過(guò)了上邊界,則垂直移回下邊界處setPos(pos().x(),scene()->sceneRect().bottom());if(pos().y()>=edgebottom) //若超過(guò)了下邊界,則垂直移回上邊界處setPos(pos().x(),scene()->sceneRect().top());angle+=(qrand()%10)/20.0;qrealdx=fabs(sin(angle*PI)*10.0);qrealdy=(qrand()%20)-10.0;setPos(mapToParent(dx,dy));}飛舞的蝴蝶實(shí)例3.圖元加入場(chǎng)景在完成了蝴蝶圖元的實(shí)現(xiàn)后,在源文件main.cpp中將它加載到場(chǎng)景中,并關(guān)聯(lián)一個(gè)視圖,具體實(shí)現(xiàn)代碼如下:#include<QApplication>#include"butterfly.h"#include<QGraphicsScene>intmain(intargc,char*argv[]){QApplicationa(argc,argv);QGraphicsScene*scene=newQGraphicsScene;scene->setSceneRect(QRectF(-200,-200,400,400));Butterfly*butterfly=newButterfly;butterfly->setPos(-100,0);scene->addItem(butterfly);QGraphicsView*view=newQGraphicsView;view->setScene(scene);view->resize(400,400);view->show();returna.exec();}QT5開發(fā)及實(shí)例(第5版)第7章Qt5繪圖及實(shí)例——二維圖表繪制01QtCharts基礎(chǔ)1.圖表對(duì)象2.?dāng)?shù)據(jù)3.坐標(biāo)軸QtCharts基礎(chǔ)1.圖表對(duì)象QtCharts的圖表對(duì)象是基于Qt的GraphicsView系統(tǒng)實(shí)現(xiàn)的,由QGraphicsView派生出一個(gè)圖表視圖QChartView類;再由圖元QGraphicsItem派生出一個(gè)圖表QChart類。圖表的創(chuàng)建本質(zhì)上就是將一個(gè)圖元(QChart)添加進(jìn)視圖(QChartView)的操作。QChartView有一個(gè)setChart方法設(shè)置要顯示的圖表,在程序中使用如下形式的代碼創(chuàng)建圖表:chart=newQChart(); //創(chuàng)建圖表chartView=newQChartView(this);chartView->setChart(chart); //添加進(jìn)視圖QtCharts基礎(chǔ)2.?dāng)?shù)據(jù)QtCharts的圖表數(shù)據(jù)經(jīng)由一種叫做“序列(Series)”的類加以封裝,序列有很多種,均以QXxxSeries規(guī)范命名,其中“Xxx”是數(shù)據(jù)所表示的圖形類型,常用的序列類及對(duì)應(yīng)的圖形類型如表。類名圖形QLineSeries線型(包括函數(shù)曲線和折線)圖QBarSeries柱狀圖QHorizontalStackedBarSeries堆疊柱狀圖QPercentBarSeries百分比柱狀圖QPieSeries餅狀圖QScatterSeries散點(diǎn)圖QCandlestickSeries蠟燭圖(用于分析股市)QAreaSeries區(qū)域填充圖序列是管理數(shù)據(jù)的類,需要將它添加進(jìn)已有的圖表對(duì)象才能顯出圖來(lái),用如下語(yǔ)句創(chuàng)建一個(gè)序列,往其中添加數(shù)據(jù)并放進(jìn)圖表:序列名=newQXxxSeries(); //創(chuàng)建序列序列名->append(數(shù)據(jù)/數(shù)據(jù)集);chart->addSeries(序列名); //將序列添加進(jìn)圖表QtCharts基礎(chǔ)3.坐標(biāo)軸常用的坐標(biāo)軸有文字和數(shù)值兩種基本類型。(1)文字坐標(biāo)實(shí)際應(yīng)用中,柱狀圖的橫坐標(biāo)經(jīng)常是用文字表示的年(月)份或統(tǒng)計(jì)對(duì)象的類別名稱,用QBarCategoryAxis類建立文字型坐標(biāo)軸,如下:文字列表=["...","...",...];axisX=newQBarCategoryAxis(); //創(chuàng)建文字坐標(biāo)axisX->append(文字列表);chart->addAxis(axisX,Qt::AlignmentFlag::AlignBottom); //將坐標(biāo)添加進(jìn)圖表序列名->attachAxis(axisX); //將序列關(guān)聯(lián)到坐標(biāo)QtCharts基礎(chǔ)(2)數(shù)值坐標(biāo)數(shù)值坐標(biāo)由QValueAxis類建立,它能根據(jù)所關(guān)聯(lián)序列數(shù)據(jù)值的分布自適應(yīng)地調(diào)整其顯示刻度和范圍,當(dāng)然也提供了一系列setXxx方法給用戶自己設(shè)置想要的效果,通常編程語(yǔ)句形式如下:axisY=newQValueAxis(); //創(chuàng)建數(shù)值坐標(biāo)//設(shè)置坐標(biāo)屬性axisY->setXxx1(...);axisY->setXxx2(...);......chart->addAxis(axisY,Qt::AlignmentFlag::AlignLeft); //將坐標(biāo)添加進(jìn)圖表序列名->attachAxis(axisY); //將序列關(guān)聯(lián)到坐標(biāo)QtCharts基礎(chǔ)用QtCharts繪制圖表,通常依次按如下的步驟進(jìn)行:在Qt項(xiàng)目中引入QtCharts庫(kù)在項(xiàng)目配置文件(.pro)中添加配置:QT+=charts在程序頭文件中添加類庫(kù)包含并引入命名空間:#include<QtCharts>QT_CHARTS_USE_NAMESPACE創(chuàng)建圖表和視圖構(gòu)造(產(chǎn)生)數(shù)據(jù)、創(chuàng)建序列并添加數(shù)據(jù)建立和設(shè)置坐標(biāo)軸02繪制螺旋曲線實(shí)例繪制螺旋曲線實(shí)例【例】(簡(jiǎn)單)(CH706)繪制阿基米德螺線和雙曲螺線。以“直接編寫代碼”(即取消勾選“Generateform”復(fù)選框)方式創(chuàng)建Qt項(xiàng)目,項(xiàng)目名chartLine,“ClassInformation”頁(yè)基類選“QWidget”,類名命名為“myLineChart”。代碼如下(chartLine.cpp):說(shuō)明:(a)

創(chuàng)建視圖語(yǔ)句“QChartView*chartView=newQChartView(this)”必須帶一個(gè)this參數(shù),明確該視圖是作為主程序myLineChart類的一個(gè)組件,才能在界面上顯示圖表。setGeometry方法設(shè)定視圖組件在窗體上的位置和尺寸,其參數(shù)可根據(jù)程序?qū)嶋H顯示效果作調(diào)整。(b)

用for循環(huán)產(chǎn)生1000個(gè)采樣點(diǎn),暫存于pointList數(shù)組,然后遍歷數(shù)組,將其中元素值分別代入兩種螺線的方程得到數(shù)據(jù),添加到兩個(gè)序列中。繪制螺旋曲線實(shí)例“序列名->setName("...")”設(shè)置數(shù)據(jù)曲線的名稱(在圖例中標(biāo)注),其中,①Archimedes(阿基米德螺線):亦稱等速螺線,是一個(gè)點(diǎn)勻速離開一個(gè)固定點(diǎn)的同時(shí)又以固定的角速度繞該固定點(diǎn)轉(zhuǎn)動(dòng)而產(chǎn)生的軌跡。阿基米德螺線在笛卡爾坐標(biāo)系中的方程為:②hyperbolic(雙曲螺線):阿基米德螺線的相鄰兩個(gè)螺旋之間是等距(均勻)的,但是在自然界中還存在著大量非等距的螺旋曲線,例如,隕落的彗星運(yùn)動(dòng)軌跡會(huì)隨時(shí)間推移加速地墜入引力中心,雙曲螺線就很好地反映了這類現(xiàn)象。雙曲螺線的方程如下:繪制螺旋曲線實(shí)例典型的阿基米德螺線與雙曲螺線圖案如圖。繪制螺旋曲線實(shí)例(c)

為簡(jiǎn)單起見,本程序就用QtCharts系統(tǒng)的默認(rèn)坐標(biāo),用createDefaultAxes方法創(chuàng)建,并設(shè)置數(shù)值范圍。運(yùn)行程序,顯示圖表如圖。03繪制柱狀/折線圖實(shí)例繪制柱狀/折線圖實(shí)例【例】(難度中等)(CH707)統(tǒng)計(jì)近五年高考報(bào)名人數(shù)和錄取率信息,繪出圖表。以“直接編寫代碼”(即取消勾選“Generateform”復(fù)選框)方式創(chuàng)建Qt項(xiàng)目,項(xiàng)目名chartBar,“ClassInformation”頁(yè)基類選“QWidget”,類名命名為“myBarChart”。代碼如下(chartBar.cpp):說(shuō)明:(a)

圖表對(duì)象添加了序列后會(huì)自動(dòng)生成圖例,圖例是對(duì)圖表上各序列數(shù)據(jù)的標(biāo)注說(shuō)明,可增強(qiáng)易讀性。(b)

柱狀圖序列的setLabelsVisible方法控制棒柱上標(biāo)簽的可見性,標(biāo)簽用于標(biāo)注數(shù)值,使數(shù)據(jù)一目了然;setLabelsPosition方法設(shè)置標(biāo)簽的顯示位置,其參數(shù)QabstractBarSeries::LabelsPosition是一個(gè)枚舉類型,有以下幾種取值:LabelsCenter:標(biāo)簽顯示在棒柱中央。LabelsInsideEnd:標(biāo)簽顯示在棒柱頂端(本程序設(shè)定值)。LabelsInsideBase:標(biāo)簽顯示在棒柱底端。LabelsOutsideEnd:標(biāo)簽顯示在棒柱頂端的外部。(c)

折線圖序列的setPen方法設(shè)置折線的畫筆,本程序使用紅色(QPen(Qt::GlobalColor::red))線寬為2(pen->setWidth(2))的筆;setPointLabelsVisible方法控制折線上數(shù)據(jù)點(diǎn)標(biāo)簽的可見性;setPointLabelsFormat方法指定標(biāo)簽具體要顯示哪個(gè)坐標(biāo)方向的數(shù)值及顯示格式,參數(shù)字符串中的@yPoint表示顯示y軸數(shù)值(本程序設(shè)定),@xPoint表示顯示x軸數(shù)值(前提是x軸也必須為數(shù)值坐標(biāo)),其他字符則作為數(shù)值的單位或說(shuō)明性文字。繪制柱狀/折線圖實(shí)例運(yùn)行程序,顯示圖表如圖。04繪制餅狀圖實(shí)例繪制餅狀圖實(shí)例【例】(簡(jiǎn)單)(CH708)用餅狀圖表示中國(guó)高等教育普及率。以“直接編寫代碼”(即取消勾選“Generateform”復(fù)選框)方式創(chuàng)建Qt項(xiàng)目,項(xiàng)目名chartPie,“ClassInformation”頁(yè)基類選“QWidget”,類名命名為“myPieChart”。代碼如下(chartPie.cpp):說(shuō)明:(a)

本例的數(shù)據(jù)存儲(chǔ)在一個(gè)QMap容器類中,存儲(chǔ)的形式是一個(gè)鍵對(duì)應(yīng)一個(gè)值,通過(guò)迭代器遍歷QMap再逐項(xiàng)添加進(jìn)QPieSeries序列。(b)

餅狀圖序列的setLabelsVisible方法控制扇區(qū)標(biāo)簽的可見性,通常都會(huì)設(shè)為true以使圖形意義更直觀;setHoleSize方法設(shè)置餅圖中心空心圓的大小比例(在0~1之間);setPieSize設(shè)置餅圖占圖表視圖區(qū)的相對(duì)大?。ㄔ?~1之間)。

(c)

用QPieSeries對(duì)象的“slices()[索引]”可單獨(dú)獲取某一個(gè)數(shù)據(jù)扇區(qū),對(duì)其進(jìn)行特殊處理,因本例索引3的扇區(qū)("大學(xué)生")是這個(gè)圖表想要著重表達(dá)的部分,故將其設(shè)為紅色(slice->setPen(QPen(Qt::GlobalColor::red,2))、slice->setBrush(Qt::GlobalColor::red))并突出(slice->setExploded(true))顯示。繪制餅狀圖實(shí)例運(yùn)行程序,顯示圖表如圖。QT5開發(fā)及實(shí)例(第5版)第7章Qt5繪圖及實(shí)例——三維繪圖01QtDataVisualization基礎(chǔ)1.圖表對(duì)象2.數(shù)據(jù)3.坐標(biāo)軸QtDataVisualization

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論