版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 圖形圖像課程設(shè)計(jì)---圖像銳化
- 圖形圖像處理課程設(shè)計(jì)報(bào)告
- 圖形圖像處理綜合課程設(shè)計(jì)題目
- 基于PHOTOSHOP圖形圖像操作課程考試系統(tǒng)的研究.pdf
- 圖形圖像論文處理
- 圖形圖像處理圖像分割
- 基于空間教學(xué)的《圖形圖像處理》課程改革的初探
- 專題十五圖形圖像專題
- 圖形圖像處理matlab
- 圖形圖像界面中的圖標(biāo)設(shè)計(jì).pdf
- 激光直寫機(jī)圖形圖像軟件設(shè)計(jì)
- 單元七圖形圖像處理
- ps圖形圖像處理教案
- 幾種圖形圖像壓縮方法.pdf
- ps圖形圖像處理教案
- 基于圖形圖像技術(shù)的鞋類造型仿真設(shè)計(jì)的研究.pdf
- 《photoshop圖形圖像處理》課程教學(xué)改革方案
- 圖形圖像廣告平面設(shè)計(jì)畢業(yè)論文
- 圖形圖像廣告平面設(shè)計(jì)畢業(yè)論文
- 激光直寫機(jī)圖形圖像軟件設(shè)計(jì).pdf
評(píng)論
0/150
提交評(píng)論