W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
多些大家對我的支持??!有朋友也提出,前面的幾節(jié)有關(guān) event 的教程缺少例子。因為 event 比較難做例子,也就沒有去寫,只是把大概寫了一下。今天帶來的是新的部分,有關(guān) Qt 的2D 繪圖。這部分不像前面的內(nèi)容,還是比較好理解的啦!所以,例子也會增加出來。
有人問豆子拿 Qt 做什么,其實,豆子就是在做一個 Qt 的畫圖程序,努力朝著 Photoshop 和 GIMP的方向發(fā)展。但這終究要經(jīng)過很長的時間、很困難的路程的,所以也放在網(wǎng)上開源,有興趣的朋友可以來試試的呀…
好了,閑話少說,來繼續(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 文檔):
這種實現(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é)果如下所示:
首先,我們聲明了一個 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ù)的實例,本圖來自 C++ GUI Programming with Qt4, 2nd Edition.
好了,今天先到這里,我們將在下面一章中繼續(xù)對這個 paintEvent()函數(shù)進行說明。
本文出自 “豆子空間” 博客,請務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/194031
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: