Qt-5開發(fā)及實例-第6章-Qt-5圖形與圖片課件_第1頁
Qt-5開發(fā)及實例-第6章-Qt-5圖形與圖片課件_第2頁
Qt-5開發(fā)及實例-第6章-Qt-5圖形與圖片課件_第3頁
Qt-5開發(fā)及實例-第6章-Qt-5圖形與圖片課件_第4頁
Qt-5開發(fā)及實例-第6章-Qt-5圖形與圖片課件_第5頁
已閱讀5頁,還剩143頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第6章

Qt5圖形與圖片——Qt5位置相關(guān)函數(shù)第6章Qt5圖形與圖片——Qt5位置相關(guān)函數(shù)01區(qū)

述01區(qū)別概述2區(qū)

述Qt提供了很多關(guān)于獲取窗體位置及顯示區(qū)域大小的函數(shù),如x()、y()和pos()、rect()、size()、geometry()等,統(tǒng)稱為“位置相關(guān)函數(shù)”或“位置函數(shù)”。幾種主要位置函數(shù)及其之間的區(qū)別如圖6.1所示。區(qū)別概述Qt提供了很多關(guān)于獲取窗體位置及顯示區(qū)域3區(qū)

述其中,x()、y()和pos()函數(shù)的作用都是獲得整個窗體左上角的坐標(biāo)位置。frameGeometry()函數(shù)與geometry()函數(shù)相對應(yīng)。frameGeometry()函數(shù)是獲得整個窗體的左上頂點和長、寬值,而geometry()函數(shù)獲得的是窗體內(nèi)中央?yún)^(qū)域的左上頂點坐標(biāo)及長、寬值。

直接調(diào)用width()和height()函數(shù)獲得的是中央?yún)^(qū)域的長、寬值。rect()、size()函數(shù)獲得的結(jié)果也都是對于窗體的中央?yún)^(qū)域而言的。size()函數(shù)獲得的是窗體中央?yún)^(qū)域的長、寬值。rect()函數(shù)與geometry()函數(shù)相同,返回一個QRect對象,這兩個函數(shù)獲得的長、寬值是相同的,都是窗體中央?yún)^(qū)域的長、寬值,只是左上頂點的坐標(biāo)值不一樣。geometry()函數(shù)獲得的左上頂點坐標(biāo)是相對于父窗體而言的坐標(biāo),而rect()函數(shù)獲得的左上頂點坐標(biāo)始終為(0,0)。區(qū)別概述其中,402“實例”位置函數(shù)的應(yīng)用02“實例”位置函數(shù)的應(yīng)用5“實例”位置函數(shù)的應(yīng)用【例】(難度一般)(CH601)設(shè)計界面,當(dāng)改變對話框的大小或移動對話框時,調(diào)用各個函數(shù)所獲得的信息也相應(yīng)地發(fā)生變化,從變化中可得知各函數(shù)之間的區(qū)別。具體實現(xiàn)步驟如下。(1)新建QtWidgetsApplication(詳見1.3.1節(jié)),項目名稱為“Geometry”,基類選擇“QDialog”,類名命名為“Geometry”,取消“創(chuàng)建界面”復(fù)選框的選中狀態(tài)。單擊“下一步”按鈕,最后單擊“完成”按鈕,完成該項目工程的建立。(2)Geometry類繼承自QDialog類,在頭文件中聲明所需的控件(主要為QLabel類)及所需要的函數(shù)。打開“geometry.h”頭文件,添加如下代碼。(3)在構(gòu)造函數(shù)中完成控件的創(chuàng)建及初始化工作,打開“geometry.cpp”文件,添加如下代碼。updateLabel()函數(shù)完成獲得各位置函數(shù)的信息并顯示功能,具體代碼。“實例”位置函數(shù)的應(yīng)用【例】(難度一般)(CH601)設(shè)計界6“實例”位置函數(shù)的應(yīng)用重新定義QWidget的moveEvent()函數(shù),響應(yīng)對話框的移動事件,使得窗體在被移動時能夠同步更新各函數(shù)的顯示結(jié)果,具體代碼如下:voidGeometry::moveEvent(QMoveEvent*){updateLabel();}重新定義QWidget的resizeEvent()函數(shù),響應(yīng)對話框的大小調(diào)整事件,使得在窗體大小發(fā)生改變時,也能夠同步更新各函數(shù)的顯示結(jié)果,具體代碼如下:voidGeometry::resizeEvent(QResizeEvent*){updateLabel();}“實例”位置函數(shù)的應(yīng)用重新定義QWidget的moveEve7“實例”位置函數(shù)的應(yīng)用(4)運行程序,效果如圖6.2所示?!皩嵗蔽恢煤瘮?shù)的應(yīng)用(4)運行程序,效果如圖6.2所示。8第6章

Qt5圖形與圖片——Qt5基礎(chǔ)圖形的繪制第6章Qt5圖形與圖片——Qt5基礎(chǔ)圖形的繪制【例】(難度中等)(CH602)設(shè)計界面,區(qū)分各種形狀及畫筆顏色、畫筆線寬、畫筆風(fēng)格、畫筆頂帽、畫筆連接點、填充模式、鋪展效果、畫刷顏色、畫刷風(fēng)格設(shè)置等?!纠浚y度中等)(CH602)設(shè)計界面,區(qū)分各種形狀及畫筆1001繪圖框架設(shè)計01繪圖框架設(shè)計11繪圖框架設(shè)計利用QPainter繪制各種圖形使用的框架的實例如圖6.3所示。繪圖框架設(shè)計利用QPainter繪制各種圖形使用的框架的實例12繪圖框架設(shè)計此實例的具體實現(xiàn)包含兩個部分的內(nèi)容:一是用于畫圖的區(qū)域PaintArea類,二是主窗口MainWidget類。繪制各種圖形實例的框架如圖6.4所示。繪圖框架設(shè)計此實例的具體實現(xiàn)包含兩個部分的內(nèi)容:一是用于畫圖13繪圖框架設(shè)計具體實現(xiàn)步驟如下。(1)新建QtWidgetsApplication(詳見1.3.1節(jié)),項目名稱為“PaintEx”,基類選擇“QWidget”,類名命名為“MainWidget”,取消“創(chuàng)建界面”復(fù)選框的選中狀態(tài)。單擊“下一步”按鈕,最后單擊“完成”按鈕,完成該項目工程的建立。(2)添加該工程的提供實現(xiàn)繪圖區(qū)的函數(shù)所在的文件,在“PaintEx”項目名上單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“添加新文件...”選項,在彈出的對話框中選擇“C++Class”選項。單擊“Choose...”按鈕,在彈出的對話框的“Baseclass”下拉列表框中選擇基類名“QWidget”,在“Classname”文本框中輸入類的名稱“PaintArea”。(3)單擊“下一步”按鈕,單擊“完成”按鈕,添加文件“paintarea.h”和文件“paintarea.cpp”。繪圖框架設(shè)計具體實現(xiàn)步驟如下。1402繪圖區(qū)的實現(xiàn)02繪圖區(qū)的實現(xiàn)15繪圖區(qū)的實現(xiàn)打開“paintarea.h”頭文件,添加如下代碼:#include<QPen>#include<QBrush>classPaintArea:publicQWidget{Q_OBJECTpublic:enumShape{Line,Rectangle,RoundRect,Ellipse,Polygon,Polyline,Points,Arc,Path,Text,Pixmap};

explicitPaintArea(QWidget*parent=0);voidsetShape(Shape);voidsetPen(QPen);voidsetBrush(QBrush);voidsetFillRule(Qt::FillRule);voidpaintEvent(QPaintEvent*);signals:publicslots:private:Shapeshape;QPenpen;QBrushbrush;Qt::FillRulefillRule;};繪圖區(qū)的實現(xiàn)打開“paintarea.h”頭文件,添加如下代16繪圖區(qū)的實現(xiàn)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)完成對窗體背景色的設(shè)置,與下面的代碼效果一致:QPalettep=palette();p.setColor(QPalette::Window,Qt::white);setPalette(p);繪圖區(qū)的實現(xiàn)PaintArea類的構(gòu)造函數(shù)用于完成初始化工作17繪圖區(qū)的實現(xiàn)setShape()函數(shù)可以設(shè)置形狀,setPen()函數(shù)可以設(shè)置畫筆,setBrush()函數(shù)可以設(shè)置畫刷,setFillRule()函數(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ū)窗體}繪圖區(qū)的實現(xiàn)setShape()函數(shù)可以設(shè)置形狀,setPe18PaintArea類的重畫函數(shù)代碼。其中,(a)QRectrect(50,100,300,200):設(shè)定一個方形區(qū)域,為畫長方形、圓角方形、橢圓等做準(zhǔn)備。(b)staticconstQPointpoints[4]={…}:創(chuàng)建一個QPoint的數(shù)組,包含四個點,為畫多邊形、多邊線及點做準(zhǔn)備。(c)intstartAngle=30*16、intspanAngle=120*16:其中,參數(shù)startAngle表示起始角,為弧形的起始點與圓心之間連線與水平方向的夾角;參數(shù)spanAngle表示的是跨度角,為弧形起點、終點分別與圓心連線之間的夾角,如圖6.5所示。(d)switch(shape){…}:使用一個switch()語句,對所要畫的形狀做判斷,調(diào)用QPainter的各個draw()函數(shù)完成圖形的繪制。繪圖區(qū)的實現(xiàn)PaintArea類的重畫函數(shù)代碼。繪圖區(qū)的實現(xiàn)19繪圖區(qū)的實現(xiàn)(1)利用QPainter繪制圖形(Shape)。Qt為開發(fā)者提供了豐富的繪制基本圖形的draw()函數(shù),如圖6.6所示。繪圖區(qū)的實現(xiàn)(1)利用QPainter繪制圖形(Shape)20繪圖區(qū)的實現(xiàn)(2)利用QPainterPath繪制簡單圖形。利用QPainterPath繪制簡單圖形,QPainterPath類為QPainter類提供了一個存儲容器,里面包含了所要繪制的內(nèi)容的集合及繪制的順序,如長方形、多邊形、曲線等各種任意圖形。當(dāng)需要繪制此預(yù)先存儲在QPainterPath對象中的內(nèi)容時,只需調(diào)用QPainter類的drawPath()函數(shù)即可。QPainterPath類提供了許多函數(shù)接口,可以很方便地加入一些規(guī)則圖形。例如,addRect()加入一個方形,addEllipse()函數(shù)加入一個橢圓形,addText()函數(shù)加入一個字符串,addPolygon()函數(shù)加入一個多邊形等。同時,QPainterPath類還提供了addPath()函數(shù),用于加入另一個QPainterPath對象中保存的內(nèi)容。QPainterPath對象的當(dāng)前點自動處在上一部分圖形內(nèi)容的結(jié)束點上,若下一部分圖形的起點不在此結(jié)束點,則需調(diào)用moveTo()函數(shù)將當(dāng)前點移動到下一部分圖形的起點。cubicTo()函數(shù)繪制的是貝賽爾曲線,如圖6.7所示。繪圖區(qū)的實現(xiàn)(2)利用QPainterPath繪制簡單圖形。21繪圖區(qū)的實現(xiàn)利用QPainterPath類可以實現(xiàn)QPainter類的draw()函數(shù)能夠?qū)崿F(xiàn)的所有圖形。例如,對于QPainter::drawRect()函數(shù),除可用上面介紹的QPainterPath::addRect()的方式實現(xiàn)外,還可以用如下方式實現(xiàn):QPainterPathpath;path.moveTo(0,0);path.lineTo(200,0);path.lineTo(200,100);path.lineTo(0,100);path.lineTo(0,0);這是一個更通用的方法,其他(如多邊形等)圖形都能夠使用這種方式實現(xiàn)。繪圖區(qū)的實現(xiàn)利用QPainterPath類可以實現(xiàn)QPain2203主窗口的實現(xiàn)03主窗口的實現(xiàn)23主窗口的實現(xiàn)主窗口類MainWiget繼承自QWidget類,包含完成各種圖形參數(shù)選擇的控制區(qū)的聲明、一系列設(shè)置與畫圖相關(guān)參數(shù)的槽函數(shù)的聲明,以及一個繪圖區(qū)PaintArea對象的聲明。打開“mainwidget.h”頭文件,添加如下代碼。MainWiget類的構(gòu)造函數(shù)中創(chuàng)建了各參數(shù)選擇控件,打開“mainwiget.cpp”文件,添加如下代碼。其中,(a)shapeComboBox->addItem(tr("Line"),PaintArea::Line):QComboBox的addItem()函數(shù)可以僅插入文本,也可同時插入與文本相對應(yīng)的具體數(shù)據(jù),通常為枚舉型數(shù)據(jù),便于后面操作時確定選擇的是哪個數(shù)據(jù)。(b)penStyleComboBox->addItem(tr("SolidLine"),static_cast<int>(Qt::SolidLine)):選用不同的參數(shù),對應(yīng)畫筆的不同風(fēng)格,如圖6.8所示。主窗口的實現(xiàn)主窗口類MainWiget繼承自QWidget類24主窗口的實現(xiàn)(c)penCapComboBox->addItem(tr("SquareCap"),Qt::SquareCap):選用不同的參數(shù),對應(yīng)畫筆頂帽的不同風(fēng)格,如圖6.9所示。其中,Qt::SquareCap表示在線條的頂點處是方形的,且線條繪制的區(qū)域包括了端點,并且再往外延伸半個線寬的長度;Qt::FlatCap表示在線條的頂點處是方形的,但線條繪制區(qū)域不包括端點在內(nèi);Qt::RoundCap表示在線條的頂點處是圓形的,且線條繪制區(qū)域包含了端點。主窗口的實現(xiàn)(c)penCapComboBox->addI25主窗口的實現(xiàn)(d)penJoinComboBox->addItem(tr("BevelJoin"),Qt::BevelJoin):選用不同的參數(shù),對應(yīng)畫筆連接點的不同風(fēng)格,如圖6.10所示。其中,Qt::BevelJoin風(fēng)格連接點是指兩條線的中心線頂點相匯,相連處依然保留線條各自的方形頂端;Qt::MiterJoin風(fēng)格連接點是指兩條線的中心線頂點相匯,相連處線條延長到線的外側(cè)匯集至點,形成一個尖頂?shù)倪B接;Qt::RoundJoin風(fēng)格連接點是指兩條線的中心線頂點相匯,相連處以圓弧形連接。主窗口的實現(xiàn)(d)penJoinComboBox->add26主窗口的實現(xiàn)(e)fillRuleComboBox->addItem(tr("OddEven"),Qt::OddEvenFill):Qt為QPainterPath類提供了兩種填充規(guī)則,分別是Qt::OddEvenFill和Qt::WindingFill,如圖6.11所示。主窗口的實現(xiàn)(e)fillRuleComboBox->ad27其中,Qt::OddEvenFill填充規(guī)則判斷的依據(jù)是從圖形中某一點畫一條水平線到圖形外。若這條水平線與圖形邊線的交點數(shù)目為奇數(shù),則說明此點位于圖形的內(nèi)部;若交點數(shù)目為偶數(shù),則此點位于圖形的外部,如圖6.12所示。而Qt::WindingFill填充規(guī)則的判斷依據(jù)則是從圖形中某一點畫一條水平線到圖形外,每個交點外邊線的方向可能向上,也可能向下,將這些交點數(shù)累加,方向相反的相互抵消,若最后結(jié)果不為0則說明此點在圖形內(nèi),若最后結(jié)果為0則說明在圖形外,如圖6.13所示。

主窗口的實現(xiàn)其中,Qt::OddEvenFill填充規(guī)則判斷的依據(jù)是從圖28主窗口的實現(xiàn)(f)spreadComboBox->addItem(tr(“PadSpread”),QGradient::PadSpread):鋪展效果有三種,分別為QGradient::PadSpread、QGradient::RepeatSpread和QGradient::ReflectSpread。其中,PadSpread是默認(rèn)的鋪展效果,也是最常見的鋪展效果,沒有被漸變覆蓋的區(qū)域填充單一的起始顏色或終止顏色;RepeatSpread效果與ReflectSpread效果只對線性漸變和圓形漸變起作用,如圖6.14所示。主窗口的實現(xiàn)(f)spreadComboBox->addI29主窗口的實現(xiàn)

(g)brushStyleComboBox->addItem(tr("SolidPattern"),static_cast<int>(Qt::SolidPattern)):選用不同的參數(shù),對應(yīng)畫刷的不同風(fēng)格,如圖6.15所示。主窗口的實現(xiàn)(g)brushStyleComboBox->30主窗口的實現(xiàn)ShowShape()槽函數(shù),根據(jù)當(dāng)前下拉列表框中選擇的選項,調(diào)用PaintArea類的setShape()函數(shù)設(shè)置PaintArea對象的形狀參數(shù),具體代碼如下:voidMainWidget::ShowShape(intvalue){PaintArea::Shapeshape=PaintArea::Shape(shapeComboBox->itemData(value,Qt::UserRole).toInt());paintArea->setShape(shape);}其中,QComboBox類的itemData方法返回當(dāng)前顯示的下拉列表框數(shù)據(jù),是一個QVariant對象,此對象與控件初始化時插入的枚舉型數(shù)據(jù)相關(guān),調(diào)用QVariant類的toInt()函數(shù)獲得此數(shù)據(jù)在枚舉型數(shù)據(jù)集合中的序號。主窗口的實現(xiàn)ShowShape()槽函數(shù),根據(jù)當(dāng)前下拉列表框31主窗口的實現(xiàn)在此函數(shù)中獲得與畫筆相關(guān)的所有屬性值,包括畫筆顏色、畫筆線寬、畫筆風(fēng)格、畫筆頂帽及畫筆連接點,共同構(gòu)成QPen對象,并調(diào)用PaintArea對象的setPen()函數(shù)設(shè)置PaintArea對象的畫筆屬性。其他與畫筆參數(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));}主窗口的實現(xiàn)在此函數(shù)中獲得與畫筆相關(guān)的所有屬性值,包括畫筆顏32主窗口的實現(xiàn)ShowPenWidth()槽函數(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));}主窗口的實現(xiàn)ShowPenWidth()槽函數(shù)的具體實現(xiàn)代碼33主窗口的實現(xiàn)ShowPenStyle()槽函數(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));}主窗口的實現(xiàn)ShowPenStyle()槽函數(shù)的具體實現(xiàn)代碼34主窗口的實現(xiàn)ShowPenCap()槽函數(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));}主窗口的實現(xiàn)ShowPenCap()槽函數(shù)的具體實現(xiàn)代碼如下35主窗口的實現(xiàn)ShowPenJoin()槽函數(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));}主窗口的實現(xiàn)ShowPenJoin()槽函數(shù)的具體實現(xiàn)代碼如36主窗口的實現(xiàn)ShowFillRule()槽函數(shù)的具體實現(xiàn)代碼如下:voidMainWidget::ShowFillRule(){Qt::FillRulerule=Qt::FillRule(fillRuleComboBox->itemData(fillRuleComboBox->currentIndex(),Qt::UserRole).toInt());paintArea->setFillRule(rule);}ShowSpreadStyle()槽函數(shù)的具體實現(xiàn)代碼如下:voidMainWidget::ShowSpreadStyle(){spread=QGradient::Spread(spreadComboBox->itemData(spreadComboBox->currentIndex(),Qt::UserRole).toInt());}主窗口的實現(xiàn)ShowFillRule()槽函數(shù)的具體實現(xiàn)代碼37主窗口的實現(xiàn)ShowBrushColor()槽函數(shù),與設(shè)置畫筆顏色函數(shù)類似,但選定顏色后并不直接調(diào)用PaintArea對象的setBrush()函數(shù),而是調(diào)用ShowBrush()函數(shù)設(shè)置顯示區(qū)的畫刷屬性,具體實現(xiàn)代碼如下:voidMainWidget::ShowBrushColor(){QColorcolor=QColorDialog::getColor(static_cast<int>(Qt::blue));brushColorFrame->setPalette(QPalette(color));ShowBrush(brushStyleComboBox->currentIndex());}ShowBrush()槽函數(shù)的具體實現(xiàn)代碼。其中,(a)Qt::BrushStylestyle=Qt::BrushStyle(brushStyleComboBox->itemData(value,Qt::UserRole).toInt()):獲得所選的畫刷風(fēng)格,若選擇的是漸變或者紋理圖案,則需要進(jìn)行一定的處理。(b)主窗口的style變量值為Qt::LinearGradientPattern時,表明選擇的是線形漸變。QLinearGradientlinearGradient(startPoint,endPoint)創(chuàng)建線形漸變類對象需要兩個參數(shù),分別表示起止點位置。(c)主窗口的style變量值為Qt::RadialGradientPattern時,表明選擇的是圓形漸變。(d)主窗口的style變量值為Qt::ConicalGradientPattern時,表明選擇的是錐形漸變。主窗口的實現(xiàn)ShowBrushColor()槽函數(shù),與設(shè)置畫38主窗口的實現(xiàn)QConicalGradientconicalGradient(startPoint,-(180*angle)/PI)創(chuàng)建錐形漸變類對象需要兩個參數(shù),分別是錐形的頂點位置和漸變分界線與水平方向的夾角,如圖6.16所示。錐形漸變不需要設(shè)置鋪展效果,它的鋪展效果只能是QGradient::PadSpread。主窗口的實現(xiàn)QConicalGradientconical39主窗口的實現(xiàn)打開“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();}主窗口的實現(xiàn)打開“main.cpp”文件,添加如下代碼:#i40主窗口的實現(xiàn)運行程序,效果如圖6.17所示。主窗口的實現(xiàn)運行程序,效果如圖6.17所示。41第6章

Qt5圖形與圖片——Qt5雙緩沖機制第6章Qt5圖形與圖片——Qt5雙緩沖機制01原理與設(shè)計01原理與設(shè)計43原理與設(shè)計【例】(難度中等)(CH603)實現(xiàn)一個簡單的繪圖工具,可以選擇線型、線寬、顏色等基本要素,如圖6.18所示。QMainWindow對象作為主窗口,QToolBar對象作為工具欄,QWidget對象作為主窗口的中央窗體,也就是繪圖區(qū),如圖6.19所示。原理與設(shè)計【例】(難度中等)(CH603)實現(xiàn)一個簡單的繪圖44原理與設(shè)計具體實現(xiàn)步驟如下。(1)新建QtWidgetsApplication(詳見1.3.1節(jié)),項目名稱為“DrawWidget”,基類選擇“QMainWindow”,類名命名默認(rèn)為“MainWindow”,取消“創(chuàng)建界面”復(fù)選框的選中狀態(tài)。單擊“下一步”按鈕,最后單擊“完成”按鈕,完成該項目工程的建立。(2)添加該工程的提供實現(xiàn)繪圖區(qū)的函數(shù)所在的文件。在“DrawWidget”項目名上單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“添加新文件...”選項,在彈出的對話框中選擇“C++Class”選項。單擊“Choose...”按鈕,在彈出的對話框的“Baseclass”下拉列表框中選擇基類名“QWidget”,在“Classname”文本框中輸入類的名稱“DrawWidget”。(3)單擊“下一步”按鈕,單擊“完成”按鈕,添加文件“drawwidget.h”和文件“drawwidget.cpp”。原理與設(shè)計具體實現(xiàn)步驟如下。4502繪圖區(qū)的實現(xiàn)02繪圖區(qū)的實現(xiàn)46繪圖區(qū)的實現(xiàn)DrawWidget類繼承自QWidget類,在類聲明中對鼠標(biāo)事件mousePressEvent()和mouseMoveEvent()、重畫事件paintEvent()、尺寸變化事件resizeEvent()進(jìn)行了重定義。setStyle()、setWidth()及setColor()函數(shù)主要用于為主窗口傳遞各種與繪圖有關(guān)的參數(shù)。(1)打開“drawwidget.h”頭文件,添加的代碼。(2)打開“drawwidget.cpp”文件,DrawWidget構(gòu)造函數(shù)完成對窗體參數(shù)及部分功能的初始化工作,具體代碼如下:#include"drawwidget.h"#include<QtGui>#include<QPen>DrawWidget::DrawWidget(QWidget*parent):QWidget(parent){setAutoFillBackground(true); //對窗體背景色的設(shè)置setPalette(QPalette(Qt::white));pix=newQPixmap(size()); //此QPixmap對象用于準(zhǔn)備隨時接收繪制的內(nèi)容pix->fill(Qt::white); //填充背景色為白色setMinimumSize(600,400); //設(shè)置繪制區(qū)窗體的最小尺寸}繪圖區(qū)的實現(xiàn)DrawWidget類繼承自QWidget類,在47繪圖區(qū)的實現(xiàn)setStyle()函數(shù)接收主窗口傳來的線型風(fēng)格參數(shù),setWidth()函數(shù)接收主窗口傳來的線寬參數(shù)值,setColor()函數(shù)接收主窗口傳來的畫筆顏色值。具體代碼如下:voidDrawWidget::setStyle(ints){style=s;}voidDrawWidget::setWidth(intw){weight=w;}voidDrawWidget::setColor(QColorc){color=c;}重定義鼠標(biāo)按下事件mousePressEvent(),在按下鼠標(biāo)按鍵時,記錄當(dāng)前的鼠標(biāo)位置值startPos。voidDrawWidget::mousePressEvent(QMouseEvent*e){startPos=e->pos();}繪圖區(qū)的實現(xiàn)setStyle()函數(shù)接收主窗口傳來的線型風(fēng)格48繪圖區(qū)的實現(xiàn)QWidget的mouseTracking屬性指示窗體是否追蹤鼠標(biāo),默認(rèn)為false(不追蹤),即在至少有一個鼠標(biāo)按鍵被按下的前提下移動鼠標(biāo)才觸發(fā)mouseMoveEvent()事件,可以通過setMouseTracking(boolenable)方法對該屬性值進(jìn)行設(shè)置。如果設(shè)置為追蹤,則無論鼠標(biāo)按鍵是否被按下,只要鼠標(biāo)移動,就會觸發(fā)mouseMoveEvent()事件。在此事件處理函數(shù)中,完成向QPixmap對象中繪圖的工作。具體代碼如下:voidDrawWidget::mouseMoveEvent(QMouseEvent*e){QPainter*painter=newQPainter; //新建一個QPainter對象QPenpen; //新建一個QPen對象pen.setStyle((Qt::PenStyle)style); //(a)pen.setWidth(weight); //設(shè)置畫筆的線寬值pen.setColor(color); //設(shè)置畫筆的顏色painter->begin(pix); //(b)painter->setPen(pen); //將QPen對象應(yīng)用到繪制對象中

//繪制從startPos到鼠標(biāo)當(dāng)前位置的直線painter->drawLine(startPos,e->pos());painter->end();startPos=e->pos(); //更新鼠標(biāo)的當(dāng)前位置,為下次繪制做準(zhǔn)備update(); //重繪繪制區(qū)窗體}繪圖區(qū)的實現(xiàn)QWidget的mouseTracking屬性指49繪圖區(qū)的實現(xiàn)下面是使用begin()和end()函數(shù)的一個例子:voidMyWidget::paintEvent(QPaintEvent*){QPainterp;p.begin(this);p.drawLine(...);p.end();}類似于下面的形式:voidMyWidget::paintEvent(QPaintEvent*){QPainterp(this);p.drawLine(...);}繪圖區(qū)的實現(xiàn)下面是使用begin()和end()函數(shù)的一個例50繪圖區(qū)的實現(xiàn)重畫函數(shù)paintEvent()完成繪制區(qū)窗體的更新工作,只需調(diào)用drawPixmap()函數(shù)將用于接收圖形繪制的QPixmap對象繪制在繪制區(qū)窗體控件上即可。具體代碼如下:voidDrawWidget::paintEvent(QPaintEvent*){QPainterpainter(this);painter.drawPixmap(QPoint(0,0),*pix);}調(diào)整繪制區(qū)大小函數(shù)resizeEvent(),當(dāng)窗體的大小發(fā)生改變時,效果看起來雖然像是繪制區(qū)大小改變了,但實際能夠進(jìn)行繪制的區(qū)域仍然沒有改變。因為繪圖的大小并沒有改變,還是原來繪制區(qū)窗口的大小,所以在窗體尺寸變化時應(yīng)及時調(diào)整用于繪制的QPixmap對象的大小。具體代碼如下:voidDrawWidget::resizeEvent(QResizeEvent*event){if(height()>pix->height()||width()>pix->width()) //(a){QPixmap*newPix=newQPixmap(size()); //創(chuàng)建一個新的QPixmap對象newPix->fill(Qt::white); //填充新QPixmap對象newPix的顏色為白色背景色QPainterp(newPix);p.drawPixmap(QPoint(0,0),*pix); //在newPix中繪制原pix中的內(nèi)容pix=newPix;

//將newPix賦值給pix作為新的繪制圖形接收對象}QWidget::resizeEvent(event); //完成其余的工作}繪圖區(qū)的實現(xiàn)重畫函數(shù)paintEvent()完成繪制區(qū)窗體的51繪圖區(qū)的實現(xiàn)clear()函數(shù)完成繪制區(qū)的清除工作,只需調(diào)用一個新的、干凈的QPixmap對象來代替pix,并調(diào)用update()函數(shù)重繪即可。具體代碼如下:voidDrawWidget::clear(){QPixmap*clearPix=newQPixmap(size());clearPix->fill(Qt::white);pix=clearPix;update();}繪圖區(qū)的實現(xiàn)clear()函數(shù)完成繪制區(qū)的清除工作,只需調(diào)用5203主窗口的實現(xiàn)03主窗口的實現(xiàn)53主窗口的實現(xiàn)主窗口類MainWindow繼承自QMainWindow類,只包含一個工具欄和一個中央窗體。首先,聲明一個構(gòu)造函數(shù)、一個用于創(chuàng)建工具欄的函數(shù)createToolBar()、一個用于進(jìn)行選擇線型風(fēng)格的槽函數(shù)ShowStyle()和一個用于進(jìn)行顏色選擇的槽函數(shù)ShowColor()。然后,聲明一個DrawWidget類對象作為主窗口的私有變量,以及聲明代表線型風(fēng)格、線寬選擇、顏色選擇及清除按鈕的私有變量。(1)打開“mainwindow.h”文件,添加如下代碼。主窗口的實現(xiàn)主窗口類MainWindow繼承自QMainWi54主窗口的實現(xiàn)(2)打開“mainwindow.cpp”文件,MainWindow類的構(gòu)造函數(shù)完成初始化工作,各個功能見注釋說明,具體代碼如下:#include"mainwindow.h"#include<QToolBar>#include<QColorDialog>MainWindow::MainWindow(QWidget*parent):QMainWindow(parent){drawWidget=newDrawWidget; //新建一個DrawWidget對象setCentralWidget(drawWidget); //新建的DrawWidget對象作為主窗口的中央窗體createToolBar(); //實現(xiàn)一個工具欄setMinimumSize(600,400); //設(shè)置主窗口的最小尺寸ShowStyle(); //初始化線型,設(shè)置控件中的當(dāng)前值作為初始值drawWidget->setWidth(widthSpinBox->value());//初始化線寬drawWidget->setColor(Qt::black); //初始化顏色}createToolBar()函數(shù)完成工具欄的創(chuàng)建。主窗口的實現(xiàn)(2)打開“mainwindow.cpp”文件,55主窗口的實現(xiàn)改變線型參數(shù)的槽函數(shù)ShowStyle(),通過調(diào)用DrawWidget類的setStyle()函數(shù)將當(dāng)前線型選擇控件中的線型參數(shù)傳給繪制區(qū);設(shè)置畫筆顏色的槽函數(shù)ShowColor(),通過調(diào)用DrawWidget類的setColor()函數(shù)將用戶在標(biāo)準(zhǔn)顏色對話框中選擇的顏色值傳給繪制區(qū)。這兩個函數(shù)的具體代碼如下:voidMainWindow::ShowStyle(){drawWidget->setStyle(styleComboBox->itemData(styleComboBox->currentIndex(),Qt::UserRole).toInt());}voidMainWindow::ShowColor(){QColorcolor=QColorDialog::getColor(static_cast<int>(Qt::black),this); //使用標(biāo)準(zhǔn)顏色對話框QColorDialog獲得一個顏色值if(color.isValid()){ //將新選擇的顏色傳給繪制區(qū),用于改變畫筆的顏色值drawWidget->setColor(color); QPixmapp(20,20);p.fill(color);colorBtn->setIcon(QIcon(p)); //更新顏色選擇按鈕上的顏色顯示}}主窗口的實現(xiàn)改變線型參數(shù)的槽函數(shù)ShowStyle(),通過56主窗口的實現(xiàn)(3)打開“main.cpp”文件,添加如下代碼:#include<QFont>intmain(intargc,char*argv[]){QApplicationa(argc,argv);QFontfont("ZYSong18030",12);a.setFont(font);MainWindoww;w.show();returna.exec();}(4)運行程序,顯示效果如圖6.18所示。主窗口的實現(xiàn)(3)打開“main.cpp”文件,添加如下代碼57第6章

Qt5圖形與圖片——顯示Qt5SVG格式圖片第6章Qt5圖形與圖片——顯示Qt5SVG格式圖片顯示Qt5SVG格式圖片SVG的英文全稱是ScalableVectorGraphics,即可縮放的矢量圖形。它是由萬維網(wǎng)聯(lián)盟(WorldWideWebConsortium,W3C)在2000年8月制定的一種新的二維矢量圖形格式,也是規(guī)范中的網(wǎng)格矢量圖形標(biāo)準(zhǔn),是一個開放的圖形標(biāo)準(zhǔn)。SVG格式的特點如下。(1)基于XML。(2)采用文本來描述對象。(3)具有交互性和動態(tài)性。(4)完全支持DOM。顯示Qt5SVG格式圖片SVG的英文全稱是Scalabl59顯示Qt5SVG格式圖片【例】(難度一般)(CH604)通過利用QSvgWidget類和QSvgRender類實現(xiàn)一個SVG圖片瀏覽器,顯示以“.svg”結(jié)尾的文件以介紹SVG格式圖片顯示的方法,如圖6.20所示。此實例由三個層次的窗體構(gòu)成,如圖6.21所示。在完成此功能的程序中使用與SVG相關(guān)的類,必須在程序中包含SVG相關(guān)的頭文件:

#include<QtSvg>由于Qt默認(rèn)生成的Makefile中只加入了QtGui、QtCore模塊的庫,所以必須在工程文件“.pro”中加入一行代碼:

QT+=svg這樣才可在編譯時加入QtSvg的庫。顯示Qt5SVG格式圖片【例】(難度一般)(CH604)60顯示Qt5SVG格式圖片具體實現(xiàn)步驟如下。(1)新建QtWidgetsApplication(詳見1.3.1節(jié)),項目名稱為“SVGTest”,基類選擇“QMainWindow”,類名命名默認(rèn)為“MainWindow”,取消“創(chuàng)建界面”復(fù)選框的選中狀態(tài)。單擊“下一步”按鈕,最后單擊“完成”按鈕,完成該項目工程的建立。(2)下面添加該工程的提供實現(xiàn)一個帶滾動條顯示區(qū)域的函數(shù)所在的文件。在“SVGTest”項目名上單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“添加新文件...”選項,在彈出的對話框中選擇“C++Class”選項。單擊“Choose...”按鈕,在彈出的對話框的“Baseclass”文本框中輸入基類名“QScrollArea”(手工添加),在“Classname”文本框中輸入類的名稱“SvgWindow”。(3)單擊“下一步”按鈕,單擊“完成”按鈕,添加文件“svgwindow.h”和文件“svgwindow.cpp”。(4)添加該工程的提供實現(xiàn)顯示SVG圖片的函數(shù)所在的文件。在“SVGTest”項目名上單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“添加新文件...”選項,在彈出的對話框中選擇“C++Class”選項。單擊“Choose...”按鈕,在彈出的對話框的“Baseclass”文本框中輸入基類名“QSvgWidget”(手工添加),在“Classname”文本框中輸入類的名稱“SvgWidget”。顯示Qt5SVG格式圖片具體實現(xiàn)步驟如下。61顯示Qt5SVG格式圖片(5)單擊“下一步”按鈕,單擊“完成”按鈕,添加文件“svgwidget.h”和文件“svgwidget.cpp”。(6)打開“svgwidget.h”頭文件。SvgWidget類繼承自QSvgWidget類,主要顯示SVG圖片。具體代碼如下:#include<QtSvg>#include<QSvgWidget>#include<QSvgRenderer>classSvgWidget:publicQSvgWidget{Q_OBJECTpublic:SvgWidget(QWidget*parent=0);voidwheelEvent(QWheelEvent*);//響應(yīng)鼠標(biāo)的滾輪事件,使SVG圖片能夠通過鼠標(biāo)滾輪的滾動進(jìn)行縮放private:QSvgRenderer*render; //用于圖片顯示尺寸的確定};顯示Qt5SVG格式圖片(5)單擊“下一步”按鈕,單擊“62顯示Qt5SVG格式圖片(7)打開“svgwidget.cpp”文件,SvgWidget構(gòu)造函數(shù)獲得本窗體的QSvgRenderer對象。具體代碼如下:SvgWidget::SvgWidget(QWidget*parent):QSvgWidget(parent){render=renderer();}顯示Qt5SVG格式圖片(7)打開“svgwidget.63顯示Qt5SVG格式圖片以下是鼠標(biāo)滾輪的響應(yīng)事件,使SVG圖片能夠通過鼠標(biāo)滾輪的滾動進(jìn)行縮放。具體代碼如下:voidSvgWidget::wheelEvent(QWheelEvent*e){ constdoublediff=0.1; //(a) QSizesize=render->defaultSize();

//(b) intwidth=size.width(); intheight=size.height(); if(e->delta()>0) //(c) {//對圖片的長、寬值進(jìn)行處理,放大一定的比例width=int(this->width()+this->width()*diff);height=int(this->height()+this->height()*diff); } else { //對圖片的長、寬值進(jìn)行處理,縮小一定的比例width=int(this->width()-this->width()*diff);height=int(this->height()-this->height()*diff); } resize(width,height); //利用新的長、寬值對圖片進(jìn)行resize()操作}顯示Qt5SVG格式圖片以下是鼠標(biāo)滾輪的響應(yīng)事件,使SV64顯示Qt5SVG格式圖片其中,(a)constdoublediff=0.1:diff的值表示每次滾輪滾動一定的值,圖片大小改變的比例。(b)QSizesize=render->defaultSize():該行代碼及下面兩行代碼用于獲取圖片顯示區(qū)的尺寸,以便進(jìn)行下一步的縮放操作。(c)if(e->delta()>0):利用QWheelEvent的delta()函數(shù)獲得滾輪滾動的距離值,通過此值來判斷滾輪滾動的方向。若delta()值大于零,則表示滾輪向前(遠(yuǎn)離用戶的方向)滾動;若小于零則表示向后(靠近用戶的方向)滾動。顯示Qt5SVG格式圖片其中,65顯示Qt5SVG格式圖片(8)SvgWindow類繼承自QScrollArea類,是一個帶滾動條的顯示區(qū)域。在SvgWindow實現(xiàn)中包含SvgWidget類的頭文件。SvgWindow類使圖片在放大到超過主窗口大小時,能夠通過拖曳滾動條的方式進(jìn)行查看。打開“svgwindow.h”頭文件,具體代碼如下:#include<QScrollArea>#include"svgwidget.h"classSvgWindow:publicQScrollArea{Q_OBJECTpublic:SvgWindow(QWidget*parent=0);voidsetFile(QString);voidmousePressEvent(QMouseEvent*);voidmouseMoveEvent(QMouseEvent*);private:SvgWidget*svgWidget;QPointmousePressPos;QPointscrollBarValuesOnMousePress;};顯示Qt5SVG格式圖片(8)SvgWindow類繼承自66顯示Qt5SVG格式圖片(9)SvgWindow類的構(gòu)造函數(shù),構(gòu)造SvgWidget對象,并調(diào)用QScrollArea類的setWidget()函數(shù)設(shè)置滾動區(qū)的窗體,使svgWidget成為SvgWindow的子窗口。打開“svgwindow.cpp”文件,具體代碼如下:SvgWindow::SvgWindow(QWidget*parent):QScrollArea(parent){svgWidget=newSvgWidget;setWidget(svgWidget);}當(dāng)主窗口中對文件進(jìn)行了選擇或修改時,將調(diào)用setFile()函數(shù)設(shè)置新的文件,具體代碼如下:voidSvgWindow::setFile(QStringfileName){svgWidget->load(fileName); //(a)QSvgRenderer*render=svgWidget->renderer();svgWidget->resize(render->defaultSize()); //(b)}其中,(a)svgWidget->load(fileName):將新的SVG文件加載到svgWidget中進(jìn)行顯示。(b)svgWidget->resize(render->defaultSize()):使svgWidget窗體按SVG圖片的默認(rèn)尺寸進(jìn)行顯示。顯示Qt5SVG格式圖片(9)SvgWindow類的構(gòu)造67顯示Qt5SVG格式圖片當(dāng)鼠標(biāo)鍵被按下時,對mousePressPos和scrollBarValuesOnMousePress進(jìn)行初始化,QScrollArea類的horizontalScrollBar()和verticalScrollBar()函數(shù)可以分別獲得svgWindow的水平滾動條和垂直滾動條。具體代碼如下:voidSvgWindow::mousePressEvent(QMouseEvent*event){mousePressPos=event->pos();scrollBarValuesOnMousePress.rx()=horizontalScrollBar()->value();scrollBarValuesOnMousePress.ry()=verticalScrollBar()->value();event->accept();}當(dāng)鼠標(biāo)鍵被按下并拖曳鼠標(biāo)時觸發(fā)mouseMoveEvent()函數(shù),通過滾動條的位置設(shè)置實現(xiàn)圖片拖曳的效果,具體代碼如下:voidSvgWindow::mouseMoveEvent(QMouseEvent*event){horizontalScrollBar()->setValue(scrollBarValuesOnMousePress.x()-event->pos().x()+mousePressPos.x()); //對水平滾動條的新位置進(jìn)行設(shè)置verticalScrollBar()->setValue(scrollBarValuesOnMousePress.y()-event->pos().y()+mousePressPos.y()); //對垂直滾動條的新位置進(jìn)行設(shè)置horizontalScrollBar()->update();verticalScrollBar()->update();event->accept();}顯示Qt5SVG格式圖片當(dāng)鼠標(biāo)鍵被按下時,對mouseP68顯示Qt5SVG格式圖片(10)主窗口MainWindow繼承自QMainWindow類,包含一個菜單欄,其中有一個“文件”菜單條,包含一個“打開”菜單項。打開“mainwindow.h”頭文件,具體代碼如下:#include<QMainWindow>#include"svgwindow.h"classMainWindow:publicQMainWindow{Q_OBJECTpublic:MainWindow(QWidget*parent=0);~MainWindow();voidcreateMenu();publicslots:voidslotOpenFile();private:SvgWindow*svgWindow; //用于調(diào)用相關(guān)函數(shù)傳遞選擇的文件名};顯示Qt5SVG格式圖片(10)主窗口MainWindo69顯示Qt5SVG格式圖片(11)在MainWindow構(gòu)造函數(shù)中,創(chuàng)建一個SvgWindow對象作為主窗口的中央窗體。打開“mainwindow.cpp”文件,具體代碼如下:MainWindow::MainWindow(QWidget*parent):QMainWindow(parent){setWindowTitle(tr("SVGViewer"));createMenu();svgWindow=newSvgWindow;setCentralWidget(svgWindow);}創(chuàng)建菜單欄,具體代碼如下:voidMainWindow::createMenu(){QMenu*fileMenu=menuBar()->addMenu(tr("文件"));QAction*openAct=newQAction(tr("打開"),this);connect(openAct,SIGNAL(triggered()),this,SLOT(slotOpenFile()));fileMenu->addAction(openAct);}顯示Qt5SVG格式圖片(11)在MainWindow構(gòu)70顯示Qt5SVG格式圖片通過標(biāo)準(zhǔn)文件對話框選擇SVG文件,并調(diào)用SvgWindow的setFile()函數(shù)將選擇的文件名傳遞給svgWindow進(jìn)行顯示,具體代碼如下:voidMainWindow::slotOpenFile(){QStringname=QFileDialog::getOpenFileName(this,"打開","/","svgfiles(*.svg)");svgWindow->setFile(name);}(12)運行程序,打開一張SVG圖片,查看預(yù)覽效果,如圖6.20所示。顯示Qt5SVG格式圖片通過標(biāo)準(zhǔn)文件對話框選擇SVG文件71第6章

Qt5圖形與圖片——Qt5SVG格式圖片顯示:概念解析第6章Qt5圖形與圖片——Qt5SVG格式圖片顯示00XML00XML73XML文檔對象模型(DocumentObjectModel,DOM)是W3C開發(fā)的獨立于平臺和語言的接口,它可以使程序和腳本動態(tài)地存取和更新XML文檔的內(nèi)容、結(jié)構(gòu)和風(fēng)格。DOM在內(nèi)存中將XML文件表示為一棵樹,用戶通過API可以隨意地訪問樹的任意節(jié)點內(nèi)容。在Qt中,XML文檔自身用QDomDocument表示,所有的節(jié)點類都從QDomNode繼承。SVG文件是利用XML表示的矢量圖形文件,每種圖形都用XML標(biāo)簽表示。例如,在SVG中畫折線的標(biāo)簽如下:<polylinefill="none"stroke="#888888"stroke-width="2"points="100,200,100,100"/>其中,polyline:表示繪制折線。fill:屬性表示填充。stroke:表示畫筆顏色。stroke-width:表示畫筆寬度。points:表示折線的點。XML文檔對象模型(DocumentObjectMode74第6章

Qt5圖形與圖片——Qt5位置相關(guān)函數(shù)第6章Qt5圖形與圖片——Qt5位置相關(guān)函數(shù)01區(qū)

述01區(qū)別概述76區(qū)

述Qt提供了很多關(guān)于獲取窗體位置及顯示區(qū)域大小的函數(shù),如x()、y()和pos()、rect()、size()、geometry()等,統(tǒng)稱為“位置相關(guān)函數(shù)”或“位置函數(shù)”。幾種主要位置函數(shù)及其之間的區(qū)別如圖6.1所示。區(qū)別概述Qt提供了很多關(guān)于獲取窗體位置及顯示區(qū)域77區(qū)

述其中,x()、y()和pos()函數(shù)的作用都是獲得整個窗體左上角的坐標(biāo)位置。frameGeometry()函數(shù)與geometry()函數(shù)相對應(yīng)。frameGeometry()函數(shù)是獲得整個窗體的左上頂點和長、寬值,而geometry()函數(shù)獲得的是窗體內(nèi)中央?yún)^(qū)域的左上頂點坐標(biāo)及長、寬值。

直接調(diào)用width()和height()函數(shù)獲得的是中央?yún)^(qū)域的長、寬值。rect()、size()函數(shù)獲得

溫馨提示

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

評論

0/150

提交評論