基于linuxqt圖形圖像課程設(shè)計(jì)_第1頁
已閱讀1頁,還剩22頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p><b>  QT課程設(shè)計(jì)</b></p><p>  題 目 制作畫圖工具 </p><p>  學(xué)生姓名 </p><p>  專業(yè)班級(jí) </p><p>  學(xué) 號(hào) </p><p&

2、gt;  所 在 系 </p><p>  指導(dǎo)教師 </p><p>  完成時(shí)間 年 月日 </p><p><b>  目 錄</b></p><p>  1概述………………………………………………………………………………1</p>

3、<p>  1.1 項(xiàng)目名稱…………………………………………………………………1</p><p>  1.2 畫圖工具基本框架……………………………………………………1</p><p>  1.3 畫圖工具功能介紹……………………………………………………2</p><p>  1.3.1菜單…………………………………………………………………2</

4、p><p>  1.3.2線型選擇……………………………………………………………3</p><p>  1.3.3畫筆寬度……………………………………………………………3</p><p>  1.3.4畫筆顏色……………………………………………………………3</p><p>  1.3.5清空畫板……………………………………………………………3&

5、lt;/p><p>  1.3.6繪制圖形……………………………………………………………3</p><p>  1.3.7橡皮擦………………………………………………………………3</p><p>  1.3.8坐標(biāo)定位……………………………………………………………3</p><p>  1.4 制作畫圖工具使用的編程語言…………………………………

6、…4</p><p>  1.5 編譯環(huán)境………………………………………………………………4</p><p>  1.6 使用QT編程語言制作畫圖工具的優(yōu)勢(shì)………………………4</p><p>  1.7 項(xiàng)目制作過程中應(yīng)用到的QT知識(shí)………………………………4</p><p>  1.7.1信號(hào)與槽………………………………………………………

7、……4</p><p>  1.7.2對(duì)話框………………………………………………………………4</p><p>  1.7.3創(chuàng)建主窗口…………………………………………………………4</p><p>  1.7.4自定義窗口部件……………………………………………………4</p><p>  1.7.5布局管理……………………………………………

8、………………5</p><p>  1.7.6 QT中的事件機(jī)制……………………………………………………5</p><p>  1.7.7二維圖形的繪制……………………………………………………5</p><p>  1.8 項(xiàng)目中建立的類…………………………………………………………5</p><p>  1.9 類之間的相互關(guān)系…………………

9、……………………………………5</p><p>  2 總體設(shè)計(jì)…………………………………………………………………………6</p><p>  2.1 主窗口……………………………………………………………………6</p><p>  2.1.1創(chuàng)建主窗口…………………………………………………………6</p><p>  2.1.2添加菜單……

10、………………………………………………………6</p><p>  2.1.3添加子菜單…………………………………………………………6</p><p>  2.1.4創(chuàng)建狀態(tài)欄…………………………………………………………7</p><p>  2.2 懸浮窗……………………………………………………………………7</p><p>  2.2.1線

11、型選項(xiàng)……………………………………………………………7</p><p>  2.2.2畫筆寬度調(diào)節(jié)………………………………………………………8</p><p>  2.1.3畫筆顏色選擇………………………………………………………8</p><p>  2.2.4清空畫板……………………………………………………………9</p><p>  2.

12、2.5繪制圖形……………………………………………………………9</p><p>  2.2.6橡皮擦……………………………………………………………9</p><p>  2.3 畫板………………………………………………………………………10</p><p>  2.3.1畫布的創(chuàng)建…………………………………………………………10</p><p&g

13、t;  2.3.2畫布的顏色初始化…………………………………………………10</p><p>  2.3.3畫板大小……………………………………………………………10</p><p>  3 詳細(xì)設(shè)計(jì)………………………………………………………………………10</p><p>  3.1 子菜單功能的實(shí)現(xiàn)……………………………………………………10</p>

14、<p>  3.1.1 New功能的實(shí)現(xiàn)……………………………………………………10</p><p>  3.1.2 Open 功能的實(shí)現(xiàn)…………………………………………………11</p><p>  3.1.3 Save 功能的實(shí)現(xiàn)…………………………………………………11</p><p>  3.1.4 SaveAs 功能的實(shí)現(xiàn)…………………………

15、……………………12</p><p>  3.2 懸浮窗內(nèi)各個(gè)功能的實(shí)現(xiàn)…………………………………………13</p><p>  3.2.1 Style功能的實(shí)現(xiàn)…………………………………………………13</p><p>  3.2.2 Width 功能的實(shí)現(xiàn)…………………………………………………14</p><p>  3.2.3 Colo

16、r 功能的實(shí)現(xiàn)…………………………………………………14</p><p>  3.2.4 Clear 功能的實(shí)現(xiàn)…………………………………………………16</p><p>  3.2.5 繪圖功能的實(shí)現(xiàn)…………………………………………………16</p><p>  3.2.6 eraser 功能的實(shí)現(xiàn)………………………………………………17</p>&

17、lt;p>  3.3 鼠標(biāo)形狀設(shè)置……………………………………17</p><p>  3.4 坐標(biāo)位置顯示功能的實(shí)現(xiàn)……………………17</p><p>  結(jié)束語………………………………………………………………………18</p><p>  致謝……………………………………………………………………19</p><p>  參考文獻(xiàn)…

18、………………………………………………………………20</p><p><b>  1 概述</b></p><p><b>  1.1 項(xiàng)目名稱</b></p><p>  制作畫圖工具 </p><p>  1.2 畫圖工具基本框架</p><p><b>

19、  運(yùn)行結(jié)果如下圖:</b></p><p><b>  圖1.1</b></p><p><b>  圖1.2</b></p><p><b>  圖1.3</b></p><p><b>  圖1.4</b></p><

20、p>  1.3 畫圖工具功能介紹</p><p><b>  1.3.1 菜單</b></p><p><b>  圖1.2</b></p><p><b>  File</b></p><p><b>  New(新建)</b></p>

21、<p>  Open(打開一個(gè)圖片)</p><p><b>  Save(保存)</b></p><p>  SaveAs(另存為)</p><p><b>  Exit(退出)</b></p><p><b>  圖1.3</b></p><

22、;p><b>  Help</b></p><p>  A.About(查看有關(guān)本工具的信息)</p><p>  1.3.2 線型選擇</p><p><b>  Solidline</b></p><p><b>  Dotline</b></p>&l

23、t;p><b>  Dashline</b></p><p>  1.3.3 畫筆寬度</p><p>  Width:可手動(dòng)調(diào)節(jié)畫筆寬度</p><p>  1.3.4 畫筆顏色</p><p>  Color:可手動(dòng)選擇畫筆顏色</p><p>  1.3.5 清空畫板</p>

24、;<p>  Clear:手動(dòng)清空整個(gè)畫板</p><p>  1.3.6 繪制圖形</p><p>  矩形rectangle</p><p>  圓角矩形roundrectangle</p><p>  橢圓ellipse(當(dāng)按著Shift鍵繪制時(shí)為圓形)</p><p><b>  弦ch

25、ord</b></p><p><b>  線line</b></p><p><b>  1.3.7 橡皮擦</b></p><p>  Eraser:寬度可選</p><p>  1.3.8 坐標(biāo)定位</p><p>  狀態(tài)欄:可以顯示鼠標(biāo)所在位置坐標(biāo)(圖1

26、.4)狀態(tài)欄</p><p>  1.4 制作畫圖工具使用的編程語言</p><p>  基于Linux的嵌入式QT</p><p><b>  1.5 編譯環(huán)境</b></p><p>  Qt Creator</p><p>  1.6使用QT編程語言制作畫圖工具的優(yōu)勢(shì)</p>

27、<p>  QT具有可以讓編程人員靈活運(yùn)用而且獨(dú)特于其他編程語言的信號(hào)—槽機(jī)制,尤其是在本項(xiàng)目制作過程當(dāng)中遇到的一些棘手問題,當(dāng)我們使用信號(hào)—槽機(jī)制來解決的時(shí)候,很容易發(fā)現(xiàn),那些原本復(fù)雜的問題將變得如此簡(jiǎn)單。</p><p>  1.7 項(xiàng)目制作過程中應(yīng)用到的QT知識(shí)</p><p>  1.7.1 信號(hào)與槽</p><p><b>  信號(hào)與槽

28、的定義</b></p><p><b>  信號(hào)與槽的關(guān)聯(lián)</b></p><p><b>  需要注意的問題</b></p><p><b>  1.7.2 對(duì)話框</b></p><p><b>  Qt消息框</b></p>

29、<p>  1.7.3 創(chuàng)建主窗口</p><p>  QMain Window 類</p><p>  創(chuàng)建主窗口的方法和流程</p><p><b>  菜單和子菜單的創(chuàng)建</b></p><p>  1.7.4 自定義窗口部件</p><p><b>  QWidget

30、類</b></p><p>  從QWidget中派生</p><p>  1.7.5 布局管理</p><p><b>  垂直布局</b></p><p><b>  水平布局</b></p><p><b>  網(wǎng)格布局</b><

31、/p><p>  1.7.6 QT中的事件機(jī)制</p><p><b>  鼠標(biāo)事件</b></p><p><b>  鍵盤事件</b></p><p>  1.7.7 二維圖形的繪制</p><p>  QPainter類的應(yīng)用</p><p><

32、;b>  圖像的裝載</b></p><p><b>  圖像的保存</b></p><p><b>  坐標(biāo)變換</b></p><p><b>  QImage類應(yīng)用</b></p><p><b>  QT打印圖形</b></

33、p><p>  1.8 項(xiàng)目中建立的類</p><p>  Controlbox類</p><p>  Drawwidget類</p><p>  MainWindow類</p><p>  1.9 類之間的相互關(guān)系</p><p>  Controlbox類:創(chuàng)建懸浮窗內(nèi)的各個(gè)控件(線寬、畫筆顏色

34、、清空等等)</p><p>  Drawwidget類:創(chuàng)建畫板</p><p>  MainWindow類:主窗口</p><p>  主窗口調(diào)用Controlbox類和Drawwidget類設(shè)定整個(gè)畫圖工具的外部框架。</p><p>  運(yùn)用信號(hào)-槽機(jī)制關(guān)聯(lián)Controlbox類和Drawwidget類中的函數(shù)以及MainWindow

35、類和Controlbox類中的函數(shù)。</p><p><b>  事件機(jī)制的實(shí)現(xiàn)</b></p><p><b>  2 總體設(shè)計(jì)</b></p><p><b>  2.1 主窗口</b></p><p>  2.1.1創(chuàng)建主窗口</p><p>  

36、一般情況下,建立一個(gè)QT工程必須要有一個(gè)主窗口,而且僅有一個(gè)主窗口,所有需要實(shí)現(xiàn)的功能,在交互界面中必須在此窗口的基礎(chǔ)上來實(shí)現(xiàn),這樣才使得整個(gè)工程的建立得以實(shí)現(xiàn)其自身價(jià)值。</p><p>  一個(gè)最簡(jiǎn)單的主窗口,沒有菜單欄,沒有工具欄,沒有狀態(tài)欄。在此我們首先創(chuàng)建一個(gè)最簡(jiǎn)單的主窗口。</p><p>  2.1.2 添加菜單</p><p>  僅僅創(chuàng)建一個(gè)最簡(jiǎn)單

37、的主窗口除了它所存在的基本框架以外沒有任何其他的意義,所以要想實(shí)現(xiàn)畫圖工具所有的功能,接下來就要為主窗口添加菜單項(xiàng),這是為下一步的循序漸進(jìn)做鋪墊。</p><p>  添加兩個(gè)菜單項(xiàng):1.File 2.Help</p><p>  File是文件菜單,任何一個(gè)關(guān)于事物的操作無非都是面向文件,所以文件菜單是一個(gè)必不可少的菜單項(xiàng)。</p><p>  fileMenu=

38、menuBar()->addMenu(tr("&File"));</p><p>  Help菜單項(xiàng)是關(guān)于軟件版本的相關(guān)信息。</p><p>  helpMenu=menuBar()->addMenu(tr("&help"));</p><p>  2.1.3 添加子菜單</p>&

39、lt;p>  單單添加菜單項(xiàng)是無法完成任何操作的,在QT里面,每一個(gè)事件的完成要么是依靠信號(hào)-槽機(jī)制進(jìn)行關(guān)聯(lián),要么是通過事件機(jī)制來連接。在這里,我們首先添加子菜單,以方便之后借著信號(hào)-槽機(jī)制實(shí)現(xiàn)相應(yīng)的功能。</p><p><b>  添加五個(gè)子菜單:</b></p><p><b>  New</b></p><p&g

40、t;  newAct=newQAction(QIcon(":/new/prefix1/image/new.PNG"),tr("&New"),this);</p><p><b>  Open</b></p><p>  openAct=newQAction(QIcon(":/images/open.png&qu

41、ot;),tr("&Open..."),this);</p><p><b>  Save </b></p><p>  saveAct=newQAction(QIcon(":/new/prefix1/image/save.PNG"),tr("&Save"),this);</p>

42、<p><b>  SaveAs</b></p><p>  saveAsAct=newQAction(tr("Save&As..."),this);</p><p><b>  Exit</b></p><p>  exitAct=newQAction(tr("E&

43、;xit"),this);</p><p>  2.1.4 創(chuàng)建狀態(tài)欄</p><p>  狀態(tài)欄是為了顯示用戶當(dāng)前操作時(shí)的信息,使機(jī)器更加人性化。</p><p>  void MainWindow::setMousePosDisplay(int x, int y)</p><p><b>  {</b>&l

44、t;/p><p>  QString str = "(" + QString::number(x) + "," +QString::number(y) + ")";</p><p>  statusBar()->showMessage(str);</p><p><b>  }</b>

45、;</p><p><b>  2.2 懸浮窗</b></p><p>  懸浮窗只是一個(gè)外部的架構(gòu),只有通過信號(hào)-槽機(jī)制將控件與槽函數(shù)相關(guān)聯(lián)才能夠達(dá)到真正的目的。</p><p>  2.2.1 線型選項(xiàng)</p><p>  Style:是一個(gè)標(biāo)簽,用于表明右邊的ComboBox是一個(gè)關(guān)于線型選擇的組合框。</p

46、><p>  ComboBox里添加有子項(xiàng),各種線型,比如Solidline 、Dotline、Dashline等等。只需要手動(dòng)選擇其中的一個(gè)類型即可實(shí)現(xiàn)一種不同線型繪制圖形。</p><p><b>  實(shí)現(xiàn)代碼如下:</b></p><p>  styleLabel=newQLabel("style");</p>

47、<p>  gridLayout->addWidget(styleLabel,0,0); </p><p>  styleComboBox=newQComboBox; styleComboBox->addItem(tr("SolidLine"),static_cast<int>(Qt::SolidLine)); styleCom

48、boBox->addItem("DashLine",static_cast<int>(Qt::DashLine)); styleComboBox->addItem("DotLine",static_cast<int>(Qt::DotLine)); styleComboBox->addItem("DashDotLine"

49、,static_cast<int>(Qt::DashDotLine)); styleComboBox->addItem("DashDotDotLine",static_cast<int>(Qt::DashDotDotLine));</p><p>  gridLayout->addWidget(styleComboBox,0,1,1,2);<

50、;/p><p>  2.2.2 畫筆寬度調(diào)節(jié)</p><p>  Width是一個(gè)標(biāo)簽,用于表明它的右邊是一個(gè)關(guān)于線寬調(diào)節(jié)的QSpinBox??梢酝ㄟ^點(diǎn)擊QSpinBox上下箭來實(shí)現(xiàn)畫筆寬度的調(diào)節(jié)。</p><p><b>  代碼實(shí)現(xiàn)如下:</b></p><p>  widthLabel = new QLabel(&qu

51、ot;Width");</p><p>  widthSpinBox = new QSpinBox;</p><p>  widthSpinBox->setValue(1);</p><p>  gridLayout->addWidget(widthLabel,1,0);</p><p>  gridLayout->

52、;addWidget(widthSpinBox,1,1,1,2);</p><p>  2.2.3 畫筆顏色選擇</p><p><b>  圖2.1</b></p><p>  通過單擊Color右側(cè)的快速存取按鈕彈出圖2.1對(duì)話框,選擇其中的顏色之后,單擊OK即可選擇有效畫筆顏色。</p><p><b>

53、  實(shí)現(xiàn)代碼:</b></p><p>  colorBtn = new QToolButton;</p><p>  QPixmap pixmap(20,20);</p><p>  pixmap.fill(Qt::black);</p><p>  colorBtn->setIcon(QIcon(pixmap));<

54、;/p><p>  gridLayout->addWidget(colorBtn,2,1);</p><p>  2.2.4 清空畫板</p><p>  單擊Clear按鈕即可清除畫板上的所有內(nèi)容。</p><p><b>  實(shí)現(xiàn)代碼如下:</b></p><p>  clearBtn =

55、new QToolButton();</p><p>  clearBtn->setText("clear");</p><p>  gridLayout->addWidget(clearBtn,3,0);</p><p>  2.2.5 繪制圖形</p><p>  接下來是五個(gè)按鈕,單擊其中一個(gè)即可選擇你想

56、要繪制的基本圖形,比如矩形、橢圓、直線等等。</p><p><b>  實(shí)現(xiàn)代碼如下:</b></p><p>  rectangle=new QPushButton(QIcon(":/new/prefix1/image/qpainter-rectangle.png"),tr("rectangle"),0);</p>

57、;<p>  roundrect=new QPushButton(QIcon(":/new/prefix1/image/qpainter-roundrect.png"),tr("roundrect"),0);</p><p>  ellipse=new QPushButton(QIcon(":/new/prefix1/image/qpainter-e

58、llipse.png"),tr("ellipse "),0);</p><p>  chord=new QPushButton(QIcon(":/new/prefix1/image/qpainter-chord.png"),tr("chord "),0);</p><p>  line=newQPushButto

59、n(QIcon(":/new/prefix1/image/Line(2).png"),tr("line "),0);</p><p><b>  2.2.6 橡皮擦</b></p><p>  想要去除某些冗余部分時(shí)可以單擊選擇橡皮擦對(duì)冗余部分進(jìn)行擦除。</p><p><b>  實(shí)現(xiàn)

60、代碼如下:</b></p><p>  erasor=newQPushButton(QIcon(":/new/prefix1/image/cursor_erasor.png"),tr("eraser "),0);</p><p>  gridLayout->addWidget(erasor,10,0);</p><

61、;p><b>  2.3 畫板</b></p><p>  2.3.1 畫布的創(chuàng)建</p><p>  創(chuàng)建一張新的畫布,等待用戶繪制圖片。</p><p><b>  實(shí)現(xiàn)代碼如下:</b></p><p>  pix=newQPixmap(this->size());</p&g

62、t;<p>  2.3.2 畫布的顏色初始化</p><p>  初始化畫布的顏色,使它擁有一個(gè)初始背景顏色。</p><p><b>  實(shí)現(xiàn)代碼如下:</b></p><p>  pix->fill(Qt::white);</p><p>  2.3.3 畫板大小</p><p

63、>  初始化畫布的大小,使它能適合畫板控件。</p><p><b>  實(shí)現(xiàn)代碼如下:</b></p><p>  pix=newQPixmap(this->size());</p><p>  setMinimumSize(600,400);</p><p><b>  3 詳細(xì)設(shè)計(jì)</b

64、></p><p>  3.1子菜單功能的實(shí)現(xiàn)</p><p>  3.1.1 New功能的實(shí)現(xiàn)</p><p><b>  步驟如下:</b></p><p>  新建一個(gè)QAction,,并將此子菜單項(xiàng)命名為New</p><p>  newAct=newQAction(QIcon(&q

65、uot;:/new/prefix1/image/new.PNG"),tr("&New"),this);</p><p>  添加快捷鍵:newAct->setShortcuts(QKeySequence::New); Ctrl+N</p><p>  當(dāng)鼠標(biāo)指向此子菜單項(xiàng)的時(shí)候,在狀態(tài)欄顯示信息為:Create a new file</p

66、><p>  newAct->setStatusTip(tr("Createanewfile"));</p><p>  當(dāng)此子菜單項(xiàng)被觸發(fā)(單擊子菜單項(xiàng))的時(shí)候,激活newFile 槽函數(shù)。</p><p>  connect(newAct,SIGNAL(triggered()),this,SLOT(newFile()));</p>

67、;<p>  在此應(yīng)用到信號(hào)-槽機(jī)制,這是QT里面極為重要的特色內(nèi)容,當(dāng)一個(gè)QAction被觸發(fā)的時(shí)候,系統(tǒng)會(huì)自動(dòng)調(diào)用與此信號(hào)相關(guān)聯(lián)的槽函數(shù),newFile()是自定義的一個(gè)實(shí)現(xiàn)新建圖片文件的槽函數(shù)。</p><p>  將此QAction添加到File 菜單中:</p><p>  fileMenu->addAction(newAct);</p><

68、;p>  3.1.2 Open 功能的實(shí)現(xiàn)</p><p><b>  步驟如下:</b></p><p>  新建一個(gè)QAction,,并將此子菜單項(xiàng)命名為Open</p><p>  openAct=newQAction(QIcon(":/images/open.png"),tr("&Open..

69、."),this);添加快捷鍵:openAct->setShortcuts(QKeySequence::Open); Ctrl+O</p><p>  當(dāng)鼠標(biāo)指向此子菜單項(xiàng)的時(shí)候,在狀態(tài)欄顯示信息為:Open an existing file</p><p>  openAct->setStatusTip(tr("Openanexistingfile&qu

70、ot;));</p><p>  當(dāng)此子菜單項(xiàng)被觸發(fā)(單擊子菜單項(xiàng))的時(shí)候,激活Open() 槽函數(shù)。</p><p>  connect(openAct,SIGNAL(triggered()),this,SLOT(open()));</p><p>  在此應(yīng)用到信號(hào)-槽機(jī)制,這是QT里面極為重要的特色內(nèi)容,當(dāng)一個(gè)QAction被觸發(fā)的時(shí)候,系統(tǒng)會(huì)自動(dòng)調(diào)用與此信號(hào)

71、相關(guān)聯(lián)的槽函數(shù),open()是自定義的一個(gè)實(shí)現(xiàn)打開一個(gè)圖片文件的槽函數(shù)。</p><p>  將此QAction添加到File 菜單中:</p><p>  fileMenu->addAction(openAct);</p><p>  3.1.3 Save 功能的實(shí)現(xiàn)</p><p><b>  步驟如下:</b>

72、;</p><p>  新建一個(gè)QAction,,并將此子菜單項(xiàng)命名為Save</p><p>  saveAct=newQAction(QIcon(":/new/prefix1/image/save.PNG"),tr("&Save"),this);</p><p>  添加快捷鍵:saveAct->setSho

73、rtcuts(QKeySequence::Save);Ctrl+s</p><p>  當(dāng)鼠標(biāo)指向此子菜單項(xiàng)的時(shí)候,在狀態(tài)欄顯示信息為:</p><p>  Save the document to disk</p><p>  saveAct->setStatusTip(tr("Save the document to disk"));&

74、lt;/p><p>  當(dāng)此子菜單項(xiàng)被觸發(fā)(單擊子菜單項(xiàng))的時(shí)候,激活Save() 槽函數(shù)。</p><p>  connect(saveAct, SIGNAL(triggered()), this, SLOT(save()));</p><p>  在此應(yīng)用到信號(hào)-槽機(jī)制,這是QT里面極為重要的特色內(nèi)容,當(dāng)一個(gè)QAction被觸發(fā)的時(shí)候,系統(tǒng)會(huì)自動(dòng)調(diào)用與此信號(hào)相關(guān)聯(lián)的

75、槽函數(shù),Save()是自定義的一個(gè)實(shí)現(xiàn)保存圖片文件的槽函數(shù)。</p><p>  將此QAction添加到File 菜單中:</p><p>  fileMenu->addAction(saveAct);</p><p>  3.1.4 SaveAs 功能的實(shí)現(xiàn)</p><p><b>  步驟如下:</b><

76、;/p><p>  新建一個(gè)QAction,,并將此子菜單項(xiàng)命名為SaveAs</p><p>  saveAsAct=newQAction(tr("Save&As..."),this);</p><p>  添加快捷鍵:saveAsAct->setShortcuts(QKeySequence::SaveAs);Ctrl+s+a<

77、/p><p>  當(dāng)鼠標(biāo)指向此子菜單項(xiàng)的時(shí)候,在狀態(tài)欄顯示信息為:</p><p>  Save the document under a new name</p><p>  saveAsAct->setStatusTip(tr("Save the document under a new name"));</p><p&

78、gt;  當(dāng)此子菜單項(xiàng)被觸發(fā)(單擊子菜單項(xiàng))的時(shí)候,激活saveAs() 槽函數(shù)。</p><p>  connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAs()));</p><p>  在此應(yīng)用到信號(hào)-槽機(jī)制,這是QT里面極為重要的特色內(nèi)容,當(dāng)一個(gè)QAction被觸發(fā)的時(shí)候,系統(tǒng)會(huì)自動(dòng)調(diào)用與此信號(hào)相關(guān)聯(lián)的槽函數(shù),saveAs(

79、)是自定義的一個(gè)實(shí)現(xiàn)將圖片文件另存為一個(gè)新文件的槽函數(shù)。</p><p>  將此QAction添加到File 菜單中:</p><p>  fileMenu->addAction(saveAsAct);</p><p>  3.1.5 Exit 功能的實(shí)現(xiàn)</p><p><b>  步驟如下:</b></

80、p><p>  新建一個(gè)QAction,,并將此子菜單項(xiàng)命名為Exit</p><p>  exitAct=newQAction(tr("E&xit"),this);</p><p>  添加快捷鍵:exitAct->setShortcuts(QKeySequence::Quit);</p><p>  當(dāng)鼠標(biāo)指

81、向此子菜單項(xiàng)的時(shí)候,在狀態(tài)欄顯示信息為:</p><p>  Exit the application</p><p>  exitAct->setStatusTip(tr("Exit the application"));</p><p>  當(dāng)此子菜單項(xiàng)被觸發(fā)(單擊子菜單項(xiàng))的時(shí)候,激活close() 槽函數(shù)。</p>&

82、lt;p>  connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));</p><p>  在此應(yīng)用到信號(hào)-槽機(jī)制,這是QT里面極為重要的特色內(nèi)容,當(dāng)一個(gè)QAction被觸發(fā)的時(shí)候,系統(tǒng)會(huì)自動(dòng)調(diào)用與此信號(hào)相關(guān)聯(lián)的槽函數(shù),close()是系統(tǒng)內(nèi)部的一個(gè)實(shí)現(xiàn)關(guān)閉或者退出一個(gè)應(yīng)用程序的槽函數(shù)。</p><p>  將此QActi

83、on添加到File 菜單中:</p><p>  fileMenu->addAction(exitAct);</p><p>  3.2 懸浮窗內(nèi)各個(gè)功能的實(shí)現(xiàn)</p><p>  3.2.1 Style功能的實(shí)現(xiàn)</p><p>  在組合框中添加線型:</p><p>  styleComboBox->

84、addItem(tr("SolidLine"),static_cast<int>(Qt::SolidLine));</p><p>  styleComboBox->addItem("DashLine",static_cast<int>(Qt::DashLine));</p><p>  styleComboBox-&g

85、t;addItem("DotLine",static_cast<int>(Qt::DotLine));</p><p>  styleComboBox->addItem("DashDotLine",static_cast<int>(Qt::DashDotLine));</p><p>  styleComboBox-&g

86、t;addItem("DashDotDotLine",static_cast<int>(Qt::DashDotDotLine));</p><p>  這些線型都是QT 內(nèi)部自定義。</p><p><b>  關(guān)聯(lián)信號(hào)與槽</b></p><p>  connect(controlBox->styleCo

87、mboBox,SIGNAL(activated(int)),this,SLOT(ShowStyle()));</p><p>  將組合框內(nèi)子項(xiàng)的觸發(fā)與主窗口類中的ShowStyle()槽函數(shù)進(jìn)行關(guān)聯(lián)。單擊某個(gè)線型的時(shí)候就會(huì)自動(dòng)調(diào)用ShowStyle()槽函數(shù)。</p><p>  ShowStyle()槽函數(shù)的實(shí)現(xiàn)內(nèi)容是:</p><p>  void MainW

88、indow::ShowStyle()</p><p><b>  {</b></p><p>  drawArea->setStyle(controlBox->styleComboBox->itemData(</p><p>  controlBox->styleComboBox->currentIndex(),Q

89、t::UserRole).toInt());</p><p>  }即:給畫板的setStyle()函數(shù)傳遞一個(gè)線型參數(shù),下面為setStyle()函數(shù):</p><p>  void DrawWidget::setStyle(int s)</p><p><b>  {</b></p><p>  style = s;

90、</p><p>  }這樣style就獲得一個(gè)整型值。再通過執(zhí)行下面的這條語句就完成了畫筆線型的選擇:pen.setStyle((Qt::PenStyle)style);</p><p>  3.2.2 Width 功能的實(shí)現(xiàn)</p><p>  添加寬度框widthSpinBox:</p><p>  widthSpinBox = new

91、 QSpinBox;</p><p>  widthSpinBox->setValue(1);</p><p>  給了它一個(gè)默認(rèn)寬度。</p><p><b>  信號(hào)與槽關(guān)聯(lián)</b></p><p>  connect(controlBox->widthSpinBox,SIGNAL(valueChange

92、d(int)),drawArea,SLOT(setWidth(int)));那么,當(dāng)widthSpinBox的值被改變的時(shí)候,將調(diào)用畫板的setWidth()方法,setWidth()方法內(nèi)容如下:</p><p>  void DrawWidget::setWidth(int w)</p><p><b>  {</b></p><p>  

93、weight = w;</p><p><b>  }</b></p><p>  這時(shí)便將widthSpinBox中的索引值作為參數(shù)傳遞給變量weight,再通過pen.setWidth(weight);這條語句的執(zhí)行就完成了畫筆寬度的調(diào)節(jié)。</p><p>  3.2.3 Color 功能的實(shí)現(xiàn)</p><p>  

94、添加顏色colorBtn </p><p>  colorBtn=new QToolButton;</p><p><b>  信號(hào)與槽關(guān)聯(lián)</b></p><p>  connect(controlBox->colorBtn,SIGNAL(clicked()),this,SLOT(ShowColor()));</p>&l

95、t;p>  單擊colorBtn將調(diào)用主窗口類的ShowColor(),ShowColor()槽函數(shù)內(nèi)容如下:</p><p>  void MainWindow::ShowColor()</p><p><b>  {</b></p><p>  QColor = QColorDialog::getColor(Qt::black,th

96、is);</p><p>  if(color.isValid())</p><p><b>  {</b></p><p>  drawArea->setColor(color);</p><p>  QPixmap p(20,20);</p><p>  p.fill(color);&l

97、t;/p><p>  controlBox->colorBtn->setIcon(QIcon(p));</p><p><b>  }</b></p><p><b>  }</b></p><p>  Color用于獲得用戶選擇的某種顏色值,畫板類中的setColor(color):<

98、;/p><p>  void DrawWidget::setColor(QColor c)</p><p><b>  {</b></p><p>  color = c;</p><p><b>  }</b></p><p>  將顏色參數(shù)傳遞過來,再執(zhí)行畫板類中pen.se

99、tColor(color);語句,即完成畫筆顏色選擇。</p><p>  3.2.4 Clear 功能的實(shí)現(xiàn)</p><p>  添加clearBtn按鈕</p><p>  clearBtn->setText("clear");</p><p><b>  信號(hào)與槽關(guān)聯(lián)</b></p&

100、gt;<p>  connect(controlBox->clearBtn,SIGNAL(clicked()),drawArea,SLOT(clear()));</p><p>  在主窗口類中將其關(guān)聯(lián),單擊clearBtn的時(shí)候,調(diào)用畫板類中槽函數(shù)clear():</p><p>  void DrawWidget::clear()</p><p&

101、gt;<b>  {</b></p><p>  pix->fill(Qt::white);</p><p>  this->update();</p><p>  }即可清除畫布上的所有內(nèi)容。</p><p>  3.2.5 繪圖功能的實(shí)現(xiàn)</p><p><b>  添加

102、各個(gè)按鈕</b></p><p>  rectangle-line,逐個(gè)添加并且為它們布局。</p><p><b>  信號(hào)與槽相關(guān)聯(lián)</b></p><p>  connect(controlBox->rectangle,SIGNAL(clicked()),drawArea,SLOT(drawrectangle()));&

103、lt;/p><p>  connect(controlBox->roundrect,SIGNAL(clicked()),drawArea,SLOT(drawroundrect()));</p><p>  connect(controlBox->ellipse,SIGNAL(clicked()),drawArea,SLOT(drawellipse()));</p>&

104、lt;p>  connect(controlBox->chord,SIGNAL(clicked()),drawArea,SLOT(drawchord()));</p><p>  connect(controlBox->line,SIGNAL(clicked()),drawArea,SLOT(drawline()));</p><p>  由上面的代碼可見,其中任意一個(gè)按

105、鈕被單擊的時(shí)候?qū)?huì)調(diào)用與此按鈕信號(hào)相關(guān)聯(lián)的槽函數(shù),它們的繪圖方法都極為相似,我們拿drawrectangle()進(jìn)行解析:</p><p>  void DrawWidget::drawrectangle()</p><p><b>  {</b></p><p>  shape=Rectangle;</p><p> 

106、 this->setCursor(Qt::CrossCursor);</p><p>  }其中shape 是枚舉類型,這時(shí)通過判斷shape的值執(zhí)行相應(yīng)的繪圖語句,如果是Rectangle,則執(zhí)行繪制矩形語句。</p><p>  3.2.6 eraser 功能的實(shí)現(xiàn)</p><p>  添加eraser按鈕</p><p><

107、b>  信號(hào)與槽相關(guān)聯(lián)</b></p><p>  connect(controlBox->erasor,SIGNAL(clicked()),drawArea,SLOT(erasor()));橡皮擦的實(shí)現(xiàn)和畫筆是同樣的原理,只不過將畫筆的顏色設(shè)置為白色,可以涂去畫板上的內(nèi)容。</p><p>  pen.setColor(Qt::white);</p>

108、<p>  添加eraser寬度組合框</p><p>  eraser寬度信號(hào)與槽相關(guān)聯(lián)</p><p>  connect(controlBox->erasorComboBox,SIGNAL(currentIndexChanged(int)),drawArea,SLOT(setErasorWidth(int)));</p><p>  槽函數(shù)獲

109、得一個(gè)索引值賦給erasorWith,執(zhí)行pen.setWidth(erasorWidth);可設(shè)置橡皮擦寬度。</p><p>  3.3 鼠標(biāo)形狀設(shè)置</p><p><b>  第一種:</b></p><p>  this->setCursor(Qt::CrossCursor);內(nèi)部鼠標(biāo)形狀。</p><p&g

110、t;<b>  第二種:</b></p><p>  QCursor*cursor=newQCursor(QPixmap(":/new/prefix1/image/10mm.png"),-1,-1);</p><p>  this->setCursor(*cursor);自定義鼠標(biāo)形狀。</p><p>  3.4坐標(biāo)

111、位置顯示功能的實(shí)現(xiàn)</p><p>  這里涉及到鼠標(biāo)移動(dòng)事件以及信號(hào)—槽機(jī)制。</p><p>  在畫板類中的鼠標(biāo)移動(dòng)事件中發(fā)射一個(gè)信號(hào):</p><p>  Emit signalMousePos(e->pos().x(),e->pos().y());</p><p>  意思是將獲得的當(dāng)前鼠標(biāo)位置坐標(biāo)作為信號(hào)的參數(shù)進(jìn)行發(fā)送

112、。</p><p>  在主窗口類中定義一個(gè)槽函數(shù)如下:</p><p>  void MainWindow::setMousePosDisplay(int x, int y)</p><p><b>  {</b></p><p>  QString str = "(" + QString::num

113、ber(x) + "," +QString::number(y) + ")";</p><p>  statusBar()->showMessage(str);</p><p>  }用以得到當(dāng)前鼠標(biāo)的坐標(biāo)位置。</p><p><b>  將信號(hào)和槽相關(guān)聯(lián)</b></p><p

114、>  connect(drawArea,SIGNAL(signalMousePos(int,int)),this,SLOT(setMousePosDisplay(int,int)));</p><p>  本項(xiàng)目的內(nèi)容以及畫圖工具功能的實(shí)現(xiàn)基本如上所述。</p><p><b>  結(jié)束語</b></p><p>  通過本次項(xiàng)目的制作,

115、我學(xué)到了很多的知識(shí),這些知識(shí)不僅僅是關(guān)于QT方面的理論和技術(shù),更重要的是在制作項(xiàng)目的過程中,我學(xué)會(huì)了建立工程的思想,以及解決所遇到的調(diào)試問題的方法。</p><p>  就本次的項(xiàng)目而言,它只是一個(gè)簡(jiǎn)單的畫圖軟件,在建立工程的初期,只能去參照別人制作的標(biāo)準(zhǔn)畫圖軟件,了解它的大致結(jié)構(gòu),比如它的功能以及各個(gè)功能的運(yùn)行次序、交互界面框架。根據(jù)這些基本的參考,去設(shè)計(jì)數(shù)據(jù)間結(jié)構(gòu),類與類之間的調(diào)用關(guān)系,并形成初步的思想。&l

116、t;/p><p>  QT是一門基于嵌入式的語言,使用QT編寫的軟件便于移植和修改。QT有一個(gè)非常的特色,經(jīng)過以上的陳述已經(jīng)很清楚,那就是,QT所擁有的信號(hào)-槽機(jī)制,從上面的程序中可以看到,在很多功能的實(shí)現(xiàn)過程中幾乎都用到了信號(hào)-槽機(jī)制,這種機(jī)制有點(diǎn)類似事件機(jī)制,但是很大的不同是,信號(hào)-槽機(jī)制要比事件機(jī)制運(yùn)用起來靈活方便。</p><p>  同樣的,QT也有著和其它語言相似之處,比如,它也有

117、事件機(jī)制,如:鍵盤事件、鼠標(biāo)事件等等。</p><p>  經(jīng)過這樣的練習(xí),并自己動(dòng)手來操作,在編程方面使我有了很大的提高。尤其是一向不太擅長(zhǎng)動(dòng)手的我,在指導(dǎo)老師的鼓勵(lì)和幫助下,開始對(duì)軟件的編程有了一定的門路。</p><p><b>  致謝</b></p><p>  一段緊張而又充實(shí)的課程設(shè)計(jì)即將結(jié)束之時(shí),我終于把畫圖工具做好了。這一過程

118、使我真正明白了功夫不負(fù)有心人。這是我學(xué)業(yè)發(fā)展過程當(dāng)中一次寶貴的體驗(yàn)。</p><p>  本項(xiàng)目剛開始時(shí)我都不知道怎么著手,而且還存在一種恐懼的心態(tài),總覺得讓我去實(shí)現(xiàn)這樣的一個(gè)畫圖工具是萬萬不可能的,這樣的心態(tài)也成了項(xiàng)目制作過程中的一個(gè)阻礙,不過感到慶幸的是,指導(dǎo)老師用耐心和認(rèn)真不斷地做引導(dǎo)和鼓勵(lì)的工作,雖然在這其間遇到很多的挫折和難題,但在老師的幫助下,經(jīng)過一番努力,自己也漸漸開始有了一點(diǎn)頭緒。接下來,自己重新

119、去翻看課本知識(shí),再加上老師提供的一些資料,設(shè)計(jì)思路逐漸清晰,一步一步地完成了軟件的功能分析、數(shù)據(jù)的結(jié)構(gòu),同時(shí)也品嘗到了付出汗水之后換來的一點(diǎn)小小成功的喜悅。</p><p>  接著我們開始著手來建立工程,在構(gòu)造主窗口外部框架的時(shí)候,稍微遇到一點(diǎn)問題,但在同學(xué)的幫助下,之后總算將基本的外部框架構(gòu)造完成,但是這還遠(yuǎn)遠(yuǎn)不夠,在上面的描述當(dāng)中可以看到,除了主窗口以外,還有懸浮窗,以及畫板,所以這樣一來就需要?jiǎng)?chuàng)建三個(gè)類。

120、</p><p>  這時(shí)我遇到了問題,因?yàn)槲抑皬膩矶紱]有做過像這樣的工程,在同一個(gè)工程里面同時(shí)創(chuàng)建三個(gè)類,而且它們之間還要相互調(diào)用,信號(hào)與槽相互關(guān)聯(lián)。所以非常感謝我的指導(dǎo)老師,是他幫助和引導(dǎo)我來學(xué)習(xí)這門課程,最終教會(huì)了我怎樣使用類似這么復(fù)雜的調(diào)用和對(duì)類的定義。</p><p>  這次項(xiàng)目的完成,讓我對(duì)軟件工程有了更深層次的認(rèn)識(shí),并且明白了實(shí)際的設(shè)計(jì)經(jīng)驗(yàn)對(duì)于做好軟件的必要性。課本上的理

121、論知識(shí)聯(lián)系實(shí)際之后更能體現(xiàn)出知識(shí)的價(jià)值。在課本理論知識(shí)的基礎(chǔ)之上聯(lián)系實(shí)際,多搜集資料,多動(dòng)手才能真正的做到學(xué)以致用,才能在未來的工作中,在激烈的社會(huì)競(jìng)爭(zhēng)中立于不敗之地。</p><p>  最后,再次忠心的感謝所有幫助過我的同學(xué)們,尤其是我的指導(dǎo)老師,謝謝你們!</p><p><b>  參考文獻(xiàn)</b></p><p>  基于嵌入式Lin

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(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)論