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

QPainter

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

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

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

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

QPainter 用來執(zhí)行繪制的操作;QPaintDevice 是一個二維空間的抽象,這個二維空間可以由QPainter 在上面進行繪制;QPaintEngine 提供了畫筆 painter 在不同的設(shè)備上進行繪制的統(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="" />

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

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

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

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

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

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

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

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

我們關(guān)心的是 paintEvent()函數(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); 
}

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

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

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

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

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

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

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

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

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

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

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