Qt 6.2C++程序設(shè)計(jì)與桌面應(yīng)用開發(fā) 思政教學(xué)課件 第9、10章 圖形繪制、多媒體編程_第1頁
Qt 6.2C++程序設(shè)計(jì)與桌面應(yīng)用開發(fā) 思政教學(xué)課件 第9、10章 圖形繪制、多媒體編程_第2頁
Qt 6.2C++程序設(shè)計(jì)與桌面應(yīng)用開發(fā) 思政教學(xué)課件 第9、10章 圖形繪制、多媒體編程_第3頁
Qt 6.2C++程序設(shè)計(jì)與桌面應(yīng)用開發(fā) 思政教學(xué)課件 第9、10章 圖形繪制、多媒體編程_第4頁
Qt 6.2C++程序設(shè)計(jì)與桌面應(yīng)用開發(fā) 思政教學(xué)課件 第9、10章 圖形繪制、多媒體編程_第5頁
已閱讀5頁,還剩155頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

Qt6.2/C++程序設(shè)計(jì)與桌面應(yīng)用開發(fā)21世紀(jì)高等學(xué)校計(jì)算機(jī)類課程創(chuàng)新規(guī)劃教材–微課視頻版教材目錄第1章初識Qt框架第2章Qt開發(fā)基礎(chǔ)第3章界面設(shè)計(jì)組件第4章主框架窗口第5章對話框設(shè)計(jì)第6章事件系統(tǒng)第7章文件與數(shù)據(jù)庫第8章模型/視圖結(jié)構(gòu)第9章圖形繪制第10章多媒體編程第11章網(wǎng)絡(luò)編程第12章進(jìn)程與線程教材目錄第9章圖形繪制9.1Qt繪圖基礎(chǔ)9.2基本圖形繪制9.3圖像繪制9.4其他繪制9.5坐標(biāo)變換9.1Qt繪圖基礎(chǔ)Qt提供了強(qiáng)大的二維繪圖系統(tǒng),可以使用相同的函數(shù)在屏幕和繪圖設(shè)備上進(jìn)行繪制。Qt繪圖主要基于3個(gè)類,即QPainter、QPaintDevice和QPaintEngine在Qt的繪圖系統(tǒng)中,具體的繪制操作由QPainter類來完成,QPainter類提供了大量高度優(yōu)化的函數(shù),來完成GUI編程中所需要的大部分圖形繪制工作。9.1.1簡單實(shí)例QPainter通常在一個(gè)窗口的重繪事件(QPainterEvent)的處理函數(shù)paintEvent()中進(jìn)行圖形的繪制;在繪圖之前需要重新實(shí)現(xiàn)窗口的QWidget::paintEvent()事件處理函數(shù),并準(zhǔn)備好畫筆(QPen)、畫刷(QBrush)和字體(QFont)等繪圖資源?!纠?.1】二維圖形繪制簡單示例。(1)啟動(dòng)QtCreator集成開發(fā)環(huán)境,創(chuàng)建一個(gè)名稱為examp9_1、類型為QtWidgetsApplication的Qt應(yīng)用程序,選擇QWidget主窗口基類,取消“Generateform”選項(xiàng)的勾選。(2)在主窗口類Widget的頭文件widget.h中添加重繪事件處理函數(shù)的聲明。代碼如下:(3)在主窗口類Widget的實(shí)現(xiàn)文件widget.cpp中添加重繪事件處理函數(shù)的實(shí)現(xiàn)代碼。(4)構(gòu)建并運(yùn)行程序。9.1.2QPainter類從例9.1中的程序代碼可以看出,QPainter對象完成了所有的圖形繪制工作,包括繪圖資源的準(zhǔn)備以及具體圖形的繪制。QPainter可以在繼承自QPaintDevice類的任何對象上進(jìn)行繪制操作,它沒有父類,只有一個(gè)直接子類QStylePainterQPainter類的對象通過其構(gòu)造方法創(chuàng)建。原型如下:QPainter(QPaintDevice*device)或QPainter()其中,參數(shù)device是QPaintDevice類的對象,即繪圖設(shè)備,表示在該部件上進(jìn)行繪制操作。使用這個(gè)構(gòu)造函數(shù)創(chuàng)建的對象會(huì)立即開始在設(shè)備上繪制,自動(dòng)調(diào)用begin()函數(shù),然后在QPainter的析構(gòu)函數(shù)中調(diào)用end()函數(shù)結(jié)束繪制。如果在構(gòu)建QPainter對象時(shí)不想指定繪制設(shè)備,那么可以使用不帶參數(shù)的構(gòu)造函數(shù),然后使用QPainter的begin()成員函數(shù)在開始繪制時(shí)指定繪制設(shè)備,等繪制完成后再調(diào)用end()函數(shù)結(jié)束繪制操作。QPainter::begin()函數(shù)的原型如下:voidQPainter::begin(QPaintDevice*device)其中,參數(shù)device表示繪圖設(shè)備。Qt用QPen類來表示畫筆。畫筆是用于繪制直線和圖形輪廓的繪圖工具,其屬性包括線型、線寬和顏色等。1、創(chuàng)建畫筆創(chuàng)建畫筆有2種方法:一種是調(diào)用QPainter類的setPen()函數(shù),通過設(shè)置顏色或樣式來創(chuàng)建;另一種就是使用QPen類的構(gòu)造函數(shù)。9.1.3QPen類QPen類的構(gòu)造方法有6種重載形式,原型如下:例如:QPenpen(QColor(255,0,0));構(gòu)造一個(gè)紅色、實(shí)線、線寬為1個(gè)像素的畫筆對象;QPenpen(Qt::DashLine);構(gòu)造一個(gè)黑色、虛線、線寬為1個(gè)像素的畫筆對象。這里的Qt::DashLine表示虛線,是一種畫筆樣式。2、樣式設(shè)置Qt的畫筆樣式就是指它所繪制的線條的樣式,用枚舉類型Qt::penStyle來表示,其值如表9.3所示。在Qt程序中,使用QPen::setStyle()函數(shù)或QPen::style()函數(shù)設(shè)置或獲取畫筆的線條樣式。例如,下面的代碼:QPenpen(Qt::NoPen);if(pen.style()==Qt::NoPen){pen.setStyle(Qt::DashLine);}會(huì)將畫筆的無線條更改為虛線樣式。3、線寬設(shè)置使用QPen::setWidth()函數(shù)或QPen::width()函數(shù)設(shè)置或獲取畫筆的線條的寬度。例如,下面的代碼:QPenpen;if(pen.width()==1){pen.setWidth(4);}會(huì)將畫筆的線寬從1個(gè)像素修改為4個(gè)像素。4、端點(diǎn)風(fēng)格設(shè)置QPen類的setCapStyle()函數(shù)用于設(shè)置端點(diǎn)樣式。在Qt中,線條的端點(diǎn)樣式用枚舉類型Qt::PenCapStyle來表示,其值有3種,分別為Qt::FlatCap、Qt::SquareCap和Qt::RoundCap它們的繪圖效果如例9.2所示?!纠?.2】編寫一個(gè)Qt應(yīng)用程序,在主窗口中繪制三條直線,演示Qt線條端點(diǎn)樣式的區(qū)別。(1)復(fù)制例9.1中的應(yīng)用程序,將項(xiàng)目名稱修改為examp9_2。(2)在QtCreator集成開發(fā)環(huán)境中打開項(xiàng)目examp9_2,修改Widget::paintEvent()函數(shù)中的代碼。(3)構(gòu)建并運(yùn)行程序。圖中三條直線從上至下依次設(shè)置為Qt::FlatCap、Qt::SquareCap和Qt::RoundCap端點(diǎn)樣式。從程序的運(yùn)行結(jié)果可以看出:Qt::FlatCap樣式在直線的端點(diǎn)處是平齊的;Qt::SquareCap樣式在直線的端點(diǎn)多出了一個(gè)正方形;Qt::RoundCap樣式在直線的端點(diǎn)處是圓弧形的。5、線條的連接樣式設(shè)置QPen類的setJoinStyle()函數(shù)用于設(shè)置線條連接樣式。在Qt中,線條的連接樣式用枚舉類型Qt::PenJoinStyle來表示,其值有4種,分別為Qt::MiterJoin、Qt::BevelJoin、Qt::RoundJoin和Qt::SvgMiterJoin。它們的繪圖效果如例9.3所示?!纠?.3】編寫一個(gè)Qt應(yīng)用程序,在主窗口中繪制直線,演示Qt線條連接樣式的區(qū)別。(1)復(fù)制例9.2中的應(yīng)用程序,將項(xiàng)目名稱修改為examp9_3。(2)在QtCreator集成開發(fā)環(huán)境中打開項(xiàng)目examp9_3,修改Widget::paintEvent()函數(shù)中的代碼。如下所示。(3)構(gòu)建并運(yùn)行程序,結(jié)果如圖9.5所示。6、顏色設(shè)置使用QPen類的setColor()和setBrush()函數(shù)設(shè)置畫筆顏色。Qt中的顏色使用QColor類的對象來表示,也可以使用Qt::GlobalColor枚舉類型中的預(yù)定義顏色對象來表示,如表9.4所示。9.1.4QBrush類QBrush類表示畫刷對象。畫刷用于填充圖形,其屬性包括填充顏色、填充樣式以及材質(zhì)填充時(shí)的材質(zhì)圖片等。QBrush類的部分成員函數(shù)及功能如表9.5所示。1、創(chuàng)建畫刷在Qt中,創(chuàng)建畫刷有2種方法:一種是調(diào)用QPainter類的setBrush()函數(shù),通過設(shè)置顏色或樣式來創(chuàng)建;另一種就是使用QBrush類的構(gòu)造函數(shù)。QBrush類的構(gòu)造方法有10種重載形式,原型如下:2、樣式設(shè)置Qt的畫刷樣式就是指它所用的填充圖形的樣式,用枚舉類型Qt::BrushStyle來表示,如表9.6所示?!纠?.4】編寫一個(gè)Qt應(yīng)用程序,在主窗口中繪制矩形,演示Qt的畫刷填充樣式的繪圖效果。(1)復(fù)制例9.1中的應(yīng)用程序,將項(xiàng)目名稱修改為examp9_4。(2)在QtCreator集成開發(fā)環(huán)境中打開項(xiàng)目examp9_4,修改Widget::paintEvent()函數(shù)中的代碼。(3)構(gòu)建并運(yùn)行程序。3、顏色設(shè)置畫刷的顏色設(shè)置非常簡單,直接調(diào)用QBrush::setColor()函數(shù)即可。例如,若將畫刷設(shè)置為黃色,可以使用下面的語句:

brush.setColor(Qt::yellow);當(dāng)然,也可以在構(gòu)造畫刷對象時(shí)就設(shè)置其顏色。9.2基本圖形繪制QPainter類提供了很多基本圖元的繪制功能,包括點(diǎn)、直線、橢圓、矩形、曲線等,由這些基本的圖元可以構(gòu)成復(fù)雜的圖形。QPainter類中常用的基本圖元繪制函數(shù)及功能如表9.7所示。9.2.1點(diǎn)和線的繪制點(diǎn)和線的繪制通過調(diào)用QPainter類的drawPoint()、drawPoints()和drawLine()、drawLines()、drawArc()、drawPolyline()等函數(shù)來完成。1、點(diǎn)的繪制Qt用QPoint

或QPointF類代表一個(gè)坐標(biāo)點(diǎn)。它包含一個(gè)橫坐標(biāo)和一個(gè)縱坐標(biāo),前者數(shù)值為int型,后者數(shù)值為float型。2、直線的繪制Qt用QLine

或QLineF

代表一條線段,前者數(shù)值為int型,后者數(shù)值為float型。QPainter類的直線繪制函數(shù)drawLine()和drawLines()均具有多種重載形式,以適應(yīng)不同類型的參數(shù)。3、折線的繪制折線的繪制可以通過指定QPoint數(shù)組或QPolygon對象來實(shí)現(xiàn),如下所示。4、圓弧的繪制使用QPainter::drawArc()函數(shù)繪制圓弧時(shí),需要指定一個(gè)長方形區(qū)域以及圓弧的起始角度和展開角度。這里角度的單位為(1/16)°,方向?yàn)槟鏁r(shí)針方向。9.2.2矩形和橢圓的繪制矩形和橢圓的繪制通過調(diào)用QPainter類的drawRect()、drawRects()、drawRoundedRect()和drawEllipse()函數(shù)來完成。1、矩形的繪制矩形繪制函數(shù)的重載形式如下:2、橢圓的繪制使用QPainter::drawEllipse()函數(shù)來繪制橢圓,其重載形式如下:9.2.3多邊形和扇形的繪制多邊形和扇形的繪制通過調(diào)用QPainter類的drawPolygon()和drawPie()函數(shù)來完成。1、多邊形的繪制QPainter::drawPolygon()函數(shù)的重載形式如下:2、扇形的繪制QPainter::drawPie()函數(shù)的重載形式如下:drawPie(constQRectF&,int,int)drawPie(int,int,int,int,int,int)drawPie(constQRect&,int,int)9.2.4漸變填充圖形的繪制漸變是繪圖中很常見的一種功能,它把幾種顏色混合在一起,讓它們能夠自然過渡,而不是一下子變成另一種顏色。在Qt中,使用QGradient類(或其子類)

和QBrush類共同實(shí)現(xiàn)圖形的漸變填充功能。Qt支持3種類型的漸變,分別是線性漸變、輻射漸變和錐形漸變。線性漸變在開始點(diǎn)和結(jié)束點(diǎn)之間插入顏色,由QLinearGradient類實(shí)現(xiàn);輻射漸變是在環(huán)繞它的圓環(huán)間插入顏色,由QRadialGradient類實(shí)現(xiàn);錐形漸變是在圓心周圍插入顏色,由QConicalGradient類實(shí)現(xiàn)。1、線性漸變線性漸變的范圍由2個(gè)控制點(diǎn)來定義,第1個(gè)控制點(diǎn)用0表示,第2個(gè)控制點(diǎn)用1表示,0點(diǎn)和1點(diǎn)連線上的位置對應(yīng)0~1中間的某個(gè)值,這個(gè)值由線性插值得到??梢栽?點(diǎn)和1點(diǎn)的連線上設(shè)置一系列的顏色分割點(diǎn),并在分割點(diǎn)上設(shè)定顏色。【例9.5】編寫一個(gè)Qt應(yīng)用程序,在主窗口中繪制矩形,演示Qt的線性漸變填充圖形的繪圖效果。(1)復(fù)制例9.1中的應(yīng)用程序,將項(xiàng)目名稱修改為examp9_5。(2)在QtCreator集成開發(fā)環(huán)境中打開項(xiàng)目examp9_5,修改Widget::paintEvent()函數(shù)中的代碼。如下所示。(3)構(gòu)建并運(yùn)行程序。2、輻射漸變輻射漸變由一個(gè)中心點(diǎn)、半徑、一個(gè)焦點(diǎn)以及顏色分割點(diǎn)控制。中心點(diǎn)和半徑定義一個(gè)圓。顏色從焦點(diǎn)向外成輻射狀擴(kuò)散,焦點(diǎn)可以是中心點(diǎn)或圓內(nèi)的其他點(diǎn)?!纠?.6】編寫一個(gè)Qt應(yīng)用程序,在主窗口中繪制橢圓,演示Qt的輻射漸變填充圖形的繪圖效果。(1)復(fù)制例9.1中的應(yīng)用程序,將項(xiàng)目名稱修改為examp9_6。(2)在QtCreator集成開發(fā)環(huán)境中打開項(xiàng)目examp9_6,修改Widget::paintEvent()函數(shù)中的代碼。如下所示。(3)構(gòu)建并運(yùn)行程序。3、錐形漸變錐形漸變由一個(gè)中心點(diǎn)和一個(gè)角度定義,顏色從X軸正向逆時(shí)針偏轉(zhuǎn)一個(gè)角度開始,按給定顏色分割點(diǎn)扭轉(zhuǎn)擴(kuò)散。錐形漸變類QConicalGradient的構(gòu)造函數(shù)有3個(gè),分別是:QConicalGradient(qrealcx,qrealcy,qrealangle)QConicalGradient(constQPointF¢er,qrealangle)QConicalGradient()cx、cy、center是中心點(diǎn)參數(shù);angle表示角度?!纠?.7】編寫一個(gè)Qt應(yīng)用程序,在主窗口中繪制橢圓,演示Qt的錐形漸變填充圖形的繪圖效果。(1)復(fù)制例9.1中的應(yīng)用程序,將項(xiàng)目名稱修改為examp9_7。(2)在QtCreator集成開發(fā)環(huán)境中打開項(xiàng)目examp9_7,修改Widget::paintEvent()函數(shù)中的代碼。(3)構(gòu)建并運(yùn)行程序。9.3圖像繪制Qt提供了4個(gè)用于處理圖像數(shù)據(jù)的類,即QImage、QPixmap、Qpicture和QBitmap,它們都是QPainterDevice

的子類,屬于Qt的繪圖設(shè)備。QImage類主要用于程序的I/O處理,也可以用于對像素的直接訪問與操作;QPixmap主要用來在屏幕上顯示圖像,它對圖像在屏幕上的顯示進(jìn)行了優(yōu)化;QBitmap是繼承自QPixmap的方便類,用來處理顏色深度為1的圖像,即黑白圖像;QPicture用來記錄和重放QPaint命令?!纠?.8】編寫一個(gè)Qt應(yīng)用程序,演示使用QImage類繪制圖像的操作方法。(1)復(fù)制例9.1中的應(yīng)用程序,將項(xiàng)目名稱修改為examp9_8。(2)在QtCreator集成開發(fā)環(huán)境中打開項(xiàng)目examp9_8,修改Widget::paintEvent()函數(shù)中的代碼。如下所示。(3)構(gòu)建并運(yùn)行程序。9.4其他繪制在QPainter成員函數(shù)中,除了基本圖形的繪制函數(shù)之外,還有一個(gè)名為drawText()的函數(shù)和一個(gè)名為drawPath()的函數(shù),使用它們繪制文字和路徑。9.4.1繪制文字Qt使用QPainter::drawText()函數(shù)來繪制文字,如例9.1所示。9.4.1繪制文字【例9.9】編寫一個(gè)Qt應(yīng)用程序,在主窗口中繪制文本,演示文本的繪制方法。(1)復(fù)制例9.1中的應(yīng)用程序,將項(xiàng)目名稱修改為examp9_9。(2)在QtCreator集成開發(fā)環(huán)境中打開項(xiàng)目examp9_9,修改Widget::paintEvent()函數(shù)中的代碼。(3)構(gòu)建并運(yùn)行程序。9.4.2繪制路徑一個(gè)繪圖路徑就是由多個(gè)矩形、橢圓、線條或者曲線等組成的對象。一個(gè)路徑可以是封閉的,例如矩形和橢圓;也可以是非封閉的,例如線條和曲線。如果要多次繪制一個(gè)復(fù)雜的圖形,可以使用QPainterPath類建立一個(gè)繪圖路徑,然后使用QPainter::drawPath()函數(shù)來進(jìn)行繪制。創(chuàng)建了QPainterPath對象后,可以使用其成員函數(shù)lineTo()、cubicTo()、quadTo()等將直線和曲線添加到路徑中來,也可以使用addEllipse()、addRect()、addRegion()、addText()等將Qt的其他一些基本圖元加入到繪圖路徑中?!纠?.10】編寫Qt應(yīng)用程序,演示路徑的繪制方法。(1)復(fù)制例9.1中的應(yīng)用程序,將項(xiàng)目名稱修改為examp9_10。(2)在QtCreator打開項(xiàng)目examp9_10,修改Widget::paintEvent()函數(shù)中的代碼。(3)構(gòu)建并運(yùn)行程序。9.5坐標(biāo)變換Qt的窗口默認(rèn)采用屏幕坐標(biāo)系統(tǒng)。該系統(tǒng)以窗口左上角為坐標(biāo)原點(diǎn);水平向右方向?yàn)閄軸正方向;垂直向下方向?yàn)閅軸正方向;且坐標(biāo)的增減以像素為單位。Qt中的坐標(biāo)變換,主要包括平移、縮放、扭曲和旋轉(zhuǎn)4種類型。9.5.1平移變換在Qt中,坐標(biāo)系統(tǒng)的平移變換可以采用2種方式,一種是使用QPainter::translate()函數(shù),另一種是使用QTransform類。QPainter::translate()函數(shù)的重載形式如下:translate(constQPointF&)translate(constQPoint&)translate(qreal,qreal)參數(shù)QPoint或QPointF對象表示新的坐標(biāo)原點(diǎn);qreal參數(shù)表示沿X軸和Y軸移動(dòng)的距離?!纠?.11】編寫一個(gè)Qt應(yīng)用程序,演示坐標(biāo)平移變換(1)復(fù)制例9.1中的應(yīng)用程序,將項(xiàng)目名稱修改為examp9_11。(2)在QtCreator集成開發(fā)環(huán)境中打開項(xiàng)目examp9_11,修改Widget::paintEvent()函數(shù)中的代碼。如下所示。(3)構(gòu)建并運(yùn)行程序。9.5.2縮放變換對坐標(biāo)系的縮放使用QPainter::scale()函數(shù)

或QTransform::scale()函數(shù)。下面是一段坐標(biāo)系的縮放變換示例代碼:9.5.3扭曲變換在Qt中繪圖時(shí),對坐標(biāo)系的扭曲變換使用QPainter::shear()函數(shù)或QTransform::shear()函數(shù)。下面是一段坐標(biāo)系的扭曲變換示例代碼:9.5.4旋轉(zhuǎn)變換在Qt中繪圖時(shí),對坐標(biāo)系的旋轉(zhuǎn)變換使用QPainter::rotate()函數(shù)或QTransform::rotate()函數(shù)。它們的函數(shù)原型如下:voidQPainter::rotate(qrealangle)或QTransform&QTransform::rotate(qrealangle,Qt::Axisaxis=Qt::ZAxis)其中,參數(shù)angle表示旋轉(zhuǎn)角度,正數(shù)表示順時(shí)針方向,負(fù)數(shù)表示逆時(shí)針方向;參數(shù)axis表示旋轉(zhuǎn)軸,用枚舉變量Qt::Axis表示?!纠?.12】編寫一個(gè)Qt應(yīng)用程序,演示坐標(biāo)的旋轉(zhuǎn)變換。運(yùn)行結(jié)果如圖9.25所示。(1)復(fù)制例9.1中的應(yīng)用程序,將項(xiàng)目名稱修改為examp9_12。(2)在QtCreator集成開發(fā)環(huán)境中打開項(xiàng)目examp9_12,修改Widget::paintEvent()函數(shù)中的代碼。如下所示。(3)構(gòu)建并運(yùn)行程序。課后作業(yè)思政本章結(jié)束Qt6.2/C++程序設(shè)計(jì)與桌面應(yīng)用開發(fā)21世紀(jì)高等學(xué)校計(jì)算機(jī)類課程創(chuàng)新規(guī)劃教材–微課視頻版教材目錄第1章初識Qt框架第2章Qt開發(fā)基礎(chǔ)第3章界面設(shè)計(jì)組件第4章主框架窗口第5章對話框設(shè)計(jì)第6章事件系統(tǒng)第7章文件與數(shù)據(jù)庫第8章模型/視圖結(jié)構(gòu)第9章圖形繪制第10章多媒體編程第11章網(wǎng)絡(luò)編程第12章進(jìn)程與線程教材目錄第10章多媒體編程10.1Qt多媒體簡介10.2音頻處理10.3視頻播放10.4視頻操作10.1Qt多媒體簡介Qt中的多媒體支持是由Qt的多媒體模塊(QtMultimedia)來提供的。通過Qt多媒體模塊所提供的眾多功能不同的類,應(yīng)用程序就可以輕松利用操作系統(tǒng)所提供的多媒體功能,如媒體播放和攝像設(shè)備的使用等,來實(shí)現(xiàn)應(yīng)用程序自身的多媒體功能。10.1.1Qt多媒體功能在Qt6.2中,可以實(shí)現(xiàn)的多媒體功能主要有:(1)訪問原始音頻設(shè)備進(jìn)行輸入或輸出;(2)低延遲播放音效文件,如*.wav等;(3)播放存放在播放列表中的被壓縮的音頻和視頻文件,如*.mp3、*.mp4等;(4)錄制聲音并壓制文件;(5)使用攝像設(shè)備進(jìn)行預(yù)覽、拍攝和視頻錄制;(6)將音頻文件解碼到內(nèi)存進(jìn)行處理。Qt應(yīng)用程序的多媒體功能,通過QtMultimedia和QtMultimediaWidgets兩個(gè)模塊提供的類來實(shí)現(xiàn)。要在Qt應(yīng)用程序中實(shí)現(xiàn)多媒體功能,需要在項(xiàng)目文件中添加如下語句:

Qt+=multimedia如果在項(xiàng)目中使用視頻處理功能,還需要同時(shí)加入下面的語句:

Qt+=multimediawidgets以便使用QVideoWidget

或QGraphicsVideoItem

類來進(jìn)行視頻的播放。10.1.2Qt多媒體模塊Qt的多媒體模塊是以附加模塊的形式提供的,分為QtMultimedia和QtMultimediaWidgets兩個(gè)子模塊。QtMultimedia子模塊提供了一些底層多媒體功能,比如音頻的采集和回放、頻譜分析、視頻的處理等。與Qt5相比較,Qt6.2的Multimedia模塊發(fā)生了較大的變化,其架構(gòu)及功能都得到了很好的優(yōu)化。Qt6.2的QtMultimedia模塊類及功能如下表所示。10.2音頻處理Qt對音頻的處理主要包括音頻的輸入與輸出。音頻的輸出就是將音頻輸出到音頻播放設(shè)備,播放音頻文件;音頻的輸入就是音頻數(shù)據(jù)的采集,也就是聲音的錄制操作。10.2.1相關(guān)Qt類Qt的多媒體模塊提供了一系列的音頻類,這些類提供了大量的低級和高級方法,來實(shí)現(xiàn)音頻的輸入、輸出和處理等多媒體應(yīng)用功能。這些類主要有:QAudioDevice、QMediaDevices、QaudioInput、QAudioOutput、QAudioFormat、QMediaFormat、QAudioSink、QAudioSource、QMediaPlayer、QMediaRecorder和QSoundEffect等。1、QAudioDevice類該類用于描述音頻設(shè)備,其部分成員函數(shù)及功能如表10.2所示。下面是一段簡單的示例代碼:2、QAudioOutput類該類用于描述可以與QMediaPlayer

或QMediaCaptureSession

一起使用的音頻輸出通道。可以使用它選擇要使用的物理輸出設(shè)備、使通道靜音或者更改通道的音量等。其部分成員函數(shù)及功能如表10.3所示。下面是一段簡單的示例代碼:構(gòu)建并運(yùn)行上述示例代碼,程序會(huì)播放audio.mp3音頻文件。注意需要將audio.mp3音頻文件放置在項(xiàng)目的構(gòu)建目錄里。3、QAudioInput類該類用于描述可以與QMediaCaptureSession

一起使用的輸入通道。它允許選擇要使用的物理輸入設(shè)備、靜音通道和更改通道的音量。QAudioInput類的成員函數(shù)及信號函數(shù)與QAudioOutput類基本類似,參見表10.3所示。下面給出一段簡單的示例代碼:構(gòu)建并運(yùn)行上述示例代碼項(xiàng)目,程序會(huì)在電腦的“音樂”目錄下生成一個(gè)名為“test.m4a”的音頻文件,用播放軟件播放該文件進(jìn)行測試。4、QAudioSource類該類用于自定義QAudioDevice

設(shè)備,其部分成員函數(shù)及功能如表10.4所示。下面是一段簡單的示例代碼:上述示例代碼運(yùn)行后,會(huì)在f:\temp子目錄中創(chuàng)建一個(gè)名為test.raw的音頻文件。5、QAudioFormat類QAudioFormat類對象用于設(shè)置音頻格式。該類有3個(gè)公有屬性,即:AudioChannelPosition、ChannelConfig和SampleFormat,分別用于表示通道位置、通道配置和采樣格式。其取值如下:10.2.2音頻播放在Qt中,音頻的播放可以使用多種方式。1、使用QSoundEffect類QSoundEffect類以低延遲方式播放未壓縮的音頻文件(通常為WAV文件);特別適用于響應(yīng)用戶操作的“反饋”類型聲音,例如虛擬鍵盤聲音、彈出對話框的正反饋或負(fù)反饋或游戲聲音等?!纠?0.1】使用QSoundEffect類播放音頻。(1)啟動(dòng)QtCreator集成開發(fā)環(huán)境,創(chuàng)建一個(gè)名為examp10_1的Qt應(yīng)用程序。程序主窗口基類設(shè)置為QWidget。(2)雙擊項(xiàng)目中的界面文件widget.ui,打開QtDesigner界面設(shè)計(jì)工具,設(shè)計(jì)如圖10.2所示的程序主窗口界面。其中,“播放”和“停止”按鈕的對象名稱分別是playBtn和stopBtn。(3)為程序主窗口中的2個(gè)按鈕添加clicked()信號槽函數(shù),分別為:

voidon_playBtn_clicked();

voidon_stopBtn_clicked();(4)打開項(xiàng)目文件examp10_1.pro,添加如下代碼,將Qt的多媒體模塊引入到項(xiàng)目中。

QT+=multimedia(5)打開widget.h文件,添加一個(gè)名為effect的QSoundEffect對象指針,并添加QSoundEffect類的前導(dǎo)聲明。代碼如下陰影部分所示。(6)打開widget.cpp文件,在Widget類的構(gòu)造函數(shù)中添加如下代碼。(7)在按鈕的槽函數(shù)中添加代碼,如下所示。(8)構(gòu)建并運(yùn)行程序。2、使用QAudioSink類QAudioSink類提供了一個(gè)接口,用于將音頻數(shù)據(jù)發(fā)送到音頻輸出設(shè)備。其部分成員函數(shù)及功能如表10.7所示。【例10.2】使用QAudioSink類播放音頻。(1)啟動(dòng)QtCreator集成開發(fā)環(huán)境,創(chuàng)建一個(gè)名為examp10_2的Qt應(yīng)用程序。程序主窗口基類設(shè)置為QWidget。(2)雙擊項(xiàng)目中的界面文件widget.ui,打開QtDesigner界面設(shè)計(jì)工具,設(shè)計(jì)如圖10.3所示的程序主窗口界面。(3)打開項(xiàng)目文件examp10_2.pro,添加如下代碼,將Qt的多媒體模塊引入到項(xiàng)目中。

QT+=multimedia(4)在widget.h文件中添加代碼,聲明Widget類的成員變量及成員函數(shù)。下面是部分代碼。(5)在widget.cpp文件中添加代碼,實(shí)現(xiàn)程序功能。下面是部分代碼。(6)構(gòu)建并運(yùn)行程序。3、使用QMediaPlayer類QMediaPlayer類用于播放媒體文件,包括音頻與視頻。該類是一個(gè)高級媒體播放類,可以使用它來播放視頻媒體文件中的音頻。其部分成員函數(shù)及功能如表10.8所示?!纠?0.3】使用QMediaPlayer類播放音頻。(1)啟動(dòng)QtCreator集成開發(fā)環(huán)境,創(chuàng)建一個(gè)名為examp10_3的Qt應(yīng)用程序。程序主窗口基類設(shè)置為QWidget。(2)雙擊項(xiàng)目中的界面文件widget.ui,打開QtDesigner界面設(shè)計(jì)工具,設(shè)計(jì)如圖10.5所示的程序主窗口界面。(3)打開項(xiàng)目文件examp10_3.pro,添加如下代碼,將Qt的多媒體模塊引入到項(xiàng)目中。QT+=multimedia(4)在widget.h文件中添加代碼,聲明Widget類的成員變量及成員函數(shù)。下面是部分代碼。(5)在widget.cpp文件中添加代碼,實(shí)現(xiàn)程序功能。下面是部分代碼。(6)構(gòu)建并運(yùn)行程序。10.2.3音頻輸入在Qt中,音頻輸入一般使用QMediaRecorder類來實(shí)現(xiàn)。QMediaRecorder類是高層次的實(shí)現(xiàn),輸入的音頻數(shù)據(jù)直接保存為文件。QMediaRecorder類

是用于編碼和記錄QMediaCaptureSession

中生成的媒體數(shù)據(jù)的類??梢詫?shí)現(xiàn)音頻的錄制。其部分成員函數(shù)及功能如表10.9所示?!纠?0.4】示例QMediaRecorder類的簡單使用。(1)啟動(dòng)QtCreator集成開發(fā)環(huán)境,創(chuàng)建一個(gè)名為examp10_4的Qt應(yīng)用程序。程序主窗口基類設(shè)置為QWidget。(2)雙擊項(xiàng)目中的界面文件widget.ui,打開QtDesigner界面設(shè)計(jì)工具,設(shè)計(jì)如圖10.6所示的程序主窗口界面。其中“錄音”和“暫停”按鈕為QPushButton對象,對象名分別為recordButton和pauseButton。(3)打開項(xiàng)目文件examp10_4.pro,添加如下代碼,將Qt的多媒體模塊引入到項(xiàng)目中。QT+=multimedia(4)在widget.h文件中添加代碼,聲明Widget類的成員變量及成員函數(shù)。下面是部分代碼。(5)在widget.cpp文件中添加代碼,實(shí)現(xiàn)程序功能。下面是部分代碼。(6)構(gòu)建并運(yùn)行程序。10.3視頻播放在Qt中播放視頻一般使用QMediaPlayer類來完成,該類可以進(jìn)行視頻文件的解碼。Qt提供了QVideoWidget和QGraphicsVideoItem

兩種視頻顯示組件。也可以從這兩個(gè)類繼承,來自定義個(gè)性化的視頻顯示組件。10.3.1相關(guān)Qt類QtMultimedia模塊提供了用于播放和操作視頻數(shù)據(jù)的高級和低級C++類,主要有:QMediaCaptureSession、QMediaPlayer、QMediaRecorder、QVideoFrame、QVideoFrameFormat、QVideoSink和QVideoWidget

等。視頻播放涉及到媒體播放器QMediaPlayer類,以及顯示組件類QVideoWidget

和QGraphicsVideoItem1、QVideoWidget類QVideoWidget類是一個(gè)用于顯示媒體對象生成視頻或圖像的界面組件,若將其附加到QMediaPlayer或QCamera對象上,可以顯示這些媒體對象生成的視頻或圖像。該類包含在QtMultimediaWidgets模塊內(nèi),使用時(shí)需要在項(xiàng)目的配置文件中添加如下語句:

QT+=multimediawidgets將其加載到項(xiàng)目中。QVideoWidget類繼承自QWidget,擁有眾多的屬性及函數(shù)。與其父類QWidget相比較,該類增加了2個(gè)屬性,它們是:Qt::AspectRatioModeaspectRatioMode;和boolfullScreen;其中,aspectRatioMode表示屏幕的縱橫比;fullScreen表示全屏屬性。與上述2個(gè)新增屬性相對應(yīng),添加了2個(gè)公有成員函數(shù),如下所示:Qt::AspectRatioModeaspectRatioMode()constboolisFullScreen()const分別用于獲取屏幕縱橫比和判斷是否全屏。與2個(gè)新增屬性相對應(yīng),又添加了2個(gè)信號函數(shù):voidaspectRatioModeChanged(Qt::AspectRatioModemode)voidfullScreenChanged(boolfullScreen)前者當(dāng)屏幕縱橫比發(fā)生變化時(shí)發(fā)射,后者當(dāng)全屏狀態(tài)發(fā)生改變時(shí)發(fā)射。QVideoWidget類的使用非常簡單,只需要將其對象與媒體播放器關(guān)聯(lián),并顯示組件即可。下面是一段示例代碼。2、QGraphicsVideoItem類QGraphicsVideoItem類提供一個(gè)圖形項(xiàng),用于顯示QMediaPlayer或Qcamera生成的視頻。該類繼承自QGraphicsObject類,是適用于Graphics/View(圖形/視圖)模式的圖形顯示組件。在使用QGraphicsVideoItem顯示視頻時(shí),可以在顯示場景中和其他圖形組件同時(shí)顯示,也可以使用該類的放大、縮小、拖動(dòng)和旋轉(zhuǎn)等功能。QGraphicsVideoItem類的繼承關(guān)系如下圖所示:10.3.2視頻播放在Qt應(yīng)用程序中播放視頻非常容易,只需要將媒體播放器對象與視頻顯示組件進(jìn)行關(guān)聯(lián)即可。1、使用QVideoWidget顯示組件下面的實(shí)例使用QMediaPlayer和QVideoWidget實(shí)現(xiàn)視頻的播放?!纠?0.5】編寫一個(gè)Qt應(yīng)用程序,示例在QVideoWidget

上播放視頻。(1)啟動(dòng)QtCreator集成開發(fā)環(huán)境,創(chuàng)建一個(gè)名為examp10_5的Qt應(yīng)用程序。程序主窗口基類設(shè)置為QWidget。(2)雙擊項(xiàng)目中的界面文件widget.ui,打開QtDesigner界面設(shè)計(jì)工具,設(shè)計(jì)如上圖所示的程序主窗口界面。(3)打開項(xiàng)目文件examp10_5.pro,添加如下代碼,將Qt的多媒體模塊引入到項(xiàng)目中。QT+=multimediaQT+=multimediawidgets(4)在widget.h文件中添加代碼,聲明Widget類的成員變量及成員函數(shù)。下面是部分代碼。(5)在widget.cpp文件中添加代碼,實(shí)現(xiàn)程序功能。下面是部分代碼。(6)構(gòu)建并運(yùn)行程序。2、使用QGraphicsVideoItem顯示組件下面的實(shí)例使用QMediaPlayer

和QGraphicsVideoItem

實(shí)現(xiàn)視頻的播放?!纠?0.6】編寫程序,示例在QGraphicsVideoItem

上播放視頻。(1)啟動(dòng)QtCreator集成開發(fā)環(huán)境,創(chuàng)建一個(gè)名為examp10_6的Qt應(yīng)用程序。程序主窗口基類設(shè)置為QWidget。(2)雙擊項(xiàng)目中的界面文件widget.ui,打開QtDesigner界面設(shè)計(jì)工具,設(shè)計(jì)如圖10.10所示的程序主窗口界面。(3)打開項(xiàng)目文件examp10_6.pro,添加如下代碼,將Qt的多媒體模塊引入到項(xiàng)目中。QT+=multimediaQT+=multimediawidgets(4)在widget.h文件中添加代碼,聲明Widget類的成員變量及成員函數(shù)。下面是部分代碼。(5)在widget.cpp文件中添加代碼,實(shí)現(xiàn)程序功能。下面是部分代碼。(6)構(gòu)建并運(yùn)行程序。QtMultimedia模塊提供了幾個(gè)用于控制照相設(shè)備的類,通過它們可以進(jìn)行照相設(shè)備信息的獲取、靜態(tài)圖像的拍攝以及視頻的錄制等操作。10.4視頻操作10.4.1相關(guān)Qt類在Qt中對照相設(shè)備操作涉及到很多的類,其中主要

溫馨提示

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

評論

0/150

提交評論