在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ C/ QPainter
Qt 容器和算法拾遺
自定義 model 之一
反走樣
Hello, world!
Qt 容器類之關(guān)聯(lián)存儲容器
QStringListModel
拖放技術(shù)之一
狀態(tài)欄
QTreeWidget
拖放技術(shù)之二
通用算法
event()
Qt 學(xué)習(xí)之路(18): Qt 標(biāo)準(zhǔn)對話框之 QInputDialog
Qt 容器類之遍歷器和隱式數(shù)據(jù)共享
QListWidget
Meta-Object 系統(tǒng)
事件接收與忽略
Qt 學(xué)習(xí)之路(tip): parent 參數(shù)
Qt 標(biāo)準(zhǔn)對話框之 QColorDialog
QPainter(續(xù))
國際化(下)
漸變填充
自定義委托
創(chuàng)建 shared library
model-view 架構(gòu)
Graphics View Framework
自定義拖放數(shù)據(jù)對象
QSortFilterProxyModel
國際化(上)
組件布局
自定義 Model 之三
事件過濾器
QDirModel
Hello, world!(續(xù))
Qt 標(biāo)準(zhǔn)對話框之 QFileDialog
自定義 model 之二
深入了解信號槽
坐標(biāo)變換
剪貼板操作
QTableWidget
QByteArray 和 QVariant
創(chuàng)建一個對話框(下)
Qt 學(xué)習(xí)之路(32): 一個簡易畫板的實(shí)現(xiàn)(Graphics View)
文本文件讀寫
自定義事件
編寫跨平臺的程序
MainWindow
初探信號槽
Qt 學(xué)習(xí)之路(17): Qt 標(biāo)準(zhǔn)對話框之 QMessageBox
繪圖設(shè)備
菜單和工具條(續(xù))
二進(jìn)制文件讀寫
QString
事件(event)
菜單和工具條
QPainter
Qt 容器類之順序存儲容器
進(jìn)程間交互
API 文檔的使用
創(chuàng)建一個對話框(上)
一個簡易畫板的實(shí)現(xiàn)(QWidget)

QPainter

多些大家對我的支持啊!有朋友也提出,前面的幾節(jié)有關(guān) event 的教程缺少例子。因?yàn)?event 比較難做例子,也就沒有去寫,只是把大概寫了一下。今天帶來的是新的部分,有關(guān) Qt 的2D 繪圖。這部分不像前面的內(nèi)容,還是比較好理解的啦!所以,例子也會增加出來。

有人問豆子拿 Qt 做什么,其實(shí),豆子就是在做一個 Qt 的畫圖程序,努力朝著 Photoshop 和 GIMP的方向發(fā)展。但這終究要經(jīng)過很長的時間、很困難的路程的,所以也放在網(wǎng)上開源,有興趣的朋友可以來試試的呀…

好了,閑話少說,來繼續(xù)我們的學(xué)習(xí)吧!

Qt 的繪圖系統(tǒng)允許使用相同的 API 在屏幕和打印設(shè)備上進(jìn)行繪制。整個繪圖系統(tǒng)基于 QPainter,QPainterDevice 和 QPaintEngine 三個類。

QPainter 用來執(zhí)行繪制的操作;QPaintDevice 是一個二維空間的抽象,這個二維空間可以由QPainter 在上面進(jìn)行繪制;QPaintEngine 提供了畫筆 painter 在不同的設(shè)備上進(jìn)行繪制的統(tǒng)一的接口。QPaintEngine 類用在 QPainter 和 QPaintDevice 之間,并且通常對開發(fā)人員是透明的,除非你需要自定義一個設(shè)備,這時候你就必須重新定義 QPaintEngine 了。

下圖給出了這三個類之間的層次結(jié)構(gòu)(出自 Qt API 文檔):

http://wiki.jikexueyuan.com/project/learn-road-qt/images/34.png" alt="" />

這種實(shí)現(xiàn)的主要好處是,所有的繪制都遵循著同一種繪制流程,這樣,添加可以很方便的添加新的特性,也可以為不支持的功能添加一個默認(rèn)的實(shí)現(xiàn)方式。另外需要說明一點(diǎn),Qt 提供了一個獨(dú)立的 QtOpenGL模塊,可以讓你在 Qt 的應(yīng)用程序中使用 OpenGL 功能。該模塊提供了一個 OpenGL 的模塊,可以像其他的 Qt 組件一樣的使用。它的不同之處在于,它是使用 OpenGL 作為顯示技術(shù),使用 OpenGL 函數(shù)進(jìn)行繪制。對于這個組件,我們以后會再介紹。

通過前面的介紹我們知道,Qt 的繪圖系統(tǒng)實(shí)際上是說,使用 QPainter 在 QPainterDevice 上面進(jìn)行繪制,它們之間使用 QPaintEngine 進(jìn)行通訊。好了,下面我們來看看怎么使用 QPainter。

首先我們定義一個組件,同前面的定義類似:

class PaintedWidget : public QWidget 
{ 
public: 
        PaintedWidget(); 

protected: 
        void paintEvent(QPaintEvent *event); 
};

這里我們只定義了一個構(gòu)造函數(shù),并且重定義 paintEvent()函數(shù)。從名字就可以看出,這實(shí)際上是一個事件的回調(diào)函數(shù)。請注意,一般而言,Qt 的事件函數(shù)都是 protected的,所以,如果你要重寫事件,就需要繼承這個類了。至于事件相關(guān)的東西,我們在前面的內(nèi)容已經(jīng)比較詳細(xì)的敘述了,這里不再贅述。

構(gòu)造函數(shù)里面主要是一些大小之類的定義,這里不再詳細(xì)說明:

PaintedWidget::PaintedWidget() 
{ 
        resize(800, 600); 
        setWindowTitle(tr("Paint Demo")); 
}

我們關(guān)心的是 paintEvent()函數(shù)的實(shí)現(xiàn):

void PaintedWidget::paintEvent(QPaintEvent *event) 
{ 
        QPainter painter(this); 
        painter.drawLine(80, 100, 650, 500); 
        painter.setPen(Qt::red); 
        painter.drawRect(10, 10, 100, 400); 
        painter.setPen(QPen(Qt::green, 5)); 
        painter.setBrush(Qt::blue); 
        painter.drawEllipse(50, 150, 400, 200); 
}

為了把我們的程序運(yùn)行起來,下面是 main()函數(shù):

int main(int argc, char *argv[]) 
{ 
        QApplication app(argc, argv); 
        PaintedWidget w; 
        w.show(); 
        return app.exec(); 
}

運(yùn)行結(jié)果如下所示:

http://wiki.jikexueyuan.com/project/learn-road-qt/images/35.png" alt="" />

首先,我們聲明了一個 QPainter 對象。注意,我們在這個函數(shù)的棧空間建立了對象,因此不需要delete。

QPainter 接收一個 QPaintDevice*類型的參數(shù)。QPaintDevice 有很多子類,比如 QImage,以及QWidget。注意回憶一下,QPaintDevice 可以理解成要在哪里去畫,而現(xiàn)在我們希望在這個 widget上畫,因此傳入的是 this 指針。

QPainter 有很多以 draw 開頭的函數(shù),用于各種圖形的繪制,比如這里的 drawLine,drawRect 和和 drawEllipse 等。具體的參數(shù)請參閱 API 文檔。下圖給出了 QPainter 的 draw 函數(shù)的實(shí)例,本圖來自 C++ GUI Programming with Qt4, 2nd Edition.

http://wiki.jikexueyuan.com/project/learn-road-qt/images/36.png" alt="" />

好了,今天先到這里,我們將在下面一章中繼續(xù)對這個 paintEvent()函數(shù)進(jìn)行說明。

本文出自 “豆子空間” 博客,請務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/194031

上一篇:event()下一篇:Hello, world!