Qt 2D painting Demo 的翻译
目錄名字
- Qt 2D painting Demo 的翻譯
- Helper Class 定義
- Helper Class 的實現
- Widget Class 定義
- Widget Class 實現
- GLWidget Class 定義
- GLWidget Class 實現
- Window Class 定義
- Window Class 實現
Qt 2D painting Demo 的翻譯
2D Painting 示例簡介:
該示例描述了怎樣使用QPainter 和QGLWidget 來顯示2D圖像。
QPainter類是實現2D圖形的繪制。
QGLWidget類可以實現圖形的加速,如果硬件支持的話。
該示例分別用兩種方式來實現繪制,一個是在QWiget抗鋸齒的方式繪制,另一個是在QGLWidget上抗鋸齒的方式繪制。
為了能夠比較這兩種方式繪圖的結果,我們單獨創建一個Help 類供使用。
Helper Class 定義
在示例中,繪圖部分的功能是通過Help類來實現,該類非常簡短。
class Helper{public:Helper();public:void paint(QPainter *painter, QPaintEvent *event, int elapsed);private:QBrush background;QBrush circleBrush;QFont textFont;QPen circlePen;QPen textPen;};除了構造函數,這里只有一個paint()函數共widget的子類調用。
Helper Class 的實現
該類的構造函數,初始化了繪圖所需要的一些參數資源。
Helper::Helper(){QLinearGradient gradient(QPointF(50, -20), QPointF(80, 20));gradient.setColorAt(0.0, Qt::white);gradient.setColorAt(1.0, QColor(0xa6, 0xce, 0x39));background = QBrush(QColor(64, 32, 64));circleBrush = QBrush(gradient);circlePen = QPen(Qt::black);circlePen.setWidth(1);textPen = QPen(Qt::white);textFont.setPixelSize(50);}繪圖的操作是通過paint()函數。通常的做法是:
1、創建QPainter 的一個對象,將圖繪制到QWidget或者QGLWidget 上;
2、QPaintEvent提供了一個可供繪制的區域。,一個elapsed time用來描述了界面刷新的時間間隔。
我們一開始填充了一個背景,然后平移坐標系到繪圖設備的中心(這里圖的大小是200x200)進行下面的繪制。
我們繪制一個螺旋形的一些圓。通過參數elapset time 來繪制從坐標原點向外逐漸外移的圓。
painter->save();
painter->setBrush(circleBrush);
painter->setPen(circlePen);
painter->rotate(elapsed * 0.030);
qreal r = elapsed / 1000.0;
int n = 30;
for (int i = 0; i < n; ++i) {
painter->rotate(30);
qreal factor = (i + r) / n;
qreal radius = 0 + 120.0 * factor;
qreal circleRadius = 1 + factor * 20;
painter->drawEllipse(QRectF(radius, -circleRadius,
circleRadius * 2, circleRadius * 2));
}
painter->restore();
由于這里坐標系統經過多次旋轉變換,這里我們用到save() 和restore() 的方法 來回到變換之前的坐標系。
painter->setPen(textPen);painter->setFont(textFont);painter->drawText(QRect(-50, -50, 100, 100), Qt::AlignCenter, QStringLiteral("Qt"));}最后我們在坐標系的中心繪制文字“Qt”。
Widget Class 定義
該類個性化了窗體的顯示,通過調用Help類的繪制來實現動畫的功能。
class Helper;
可以看到,除了構造函數外,這里包含了:
一個paintEvent() 函數,該函數使我們能后自定義圖形的繪制。
一個槽函數animate() 來實現動畫。
一個成員指針變量,指向Help類的成員對象。
一個記錄刷新時間的變量
Widget Class 實現
構造函數:
1、建立并保存一個helper對象;
2、將刷新時間設為0;
3、將窗體大小設為200x200
The animate() 槽函數實現了定時刷新界面的功能
void Widget::animate(){elapsed = (elapsed + qobject_cast<QTimer*>(sender())->interval()) % 1000;update();}這里我們,這里我們決定了一個elapsed時間變化的快慢的處理方法。
通過paintEvent 事件來繪圖。
void Widget::paintEvent(QPaintEvent *event){QPainter painter;painter.begin(this);painter.setRenderHint(QPainter::Antialiasing);helper->paint(&painter, event, elapsed);painter.end();}GLWidget Class 定義
GLWIDget類與widget類定義類似,唯一不同點是它繼承自QOpenGLWidget.
class Helper;
GLWidget Class 實現
構造函數:
GLWidget::GLWidget(Helper *helper, QWidget *parent): QOpenGLWidget(parent), helper(helper){elapsed = 0;setFixedSize(200, 200);setAutoFillBackground(false);}animate() 槽函數與 Widget 類中雷同:
void GLWidget::animate(){elapsed = (elapsed + qobject_cast<QTimer*>(sender())->interval()) % 1000;update();}paintEvent() 與與 Widget 類中雷同:
void GLWidget::paintEvent(QPaintEvent *event){QPainter painter;painter.begin(this);painter.setRenderHint(QPainter::Antialiasing);helper->paint(&painter, event, elapsed);painter.end();}Window Class 定義
The Window class has a basic, minimal definition:
class Window : public QWidget{Q_OBJECTpublic:Window();private:Helper helper;};Window Class 實現
構造函數做了所有的工作,創建窗體和控件、創建一個定時器,
沒過50ms 會 update(),從而回調paintEvent函數,從而實現20幀每秒的刷新率
本篇翻譯完畢,本人翻譯純粹是項目應用和學習的需要,如有不妥,懇請朵朵指正。
總結
以上是生活随笔為你收集整理的Qt 2D painting Demo 的翻译的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt Dock Widgets 官方示例
- 下一篇: Qt 视图框架示例 Colliding