Qt / QPainter、QPen、QBrush 如何理解
之前一直不是很理解上述三個類,直到看到了一篇博客,真的是茅塞頓開啊!下面是該博客的部分內容:
零、介紹
QPen 是畫筆,用來繪制圖形的輪廓線,以及定義輪廓線的顏色、樣式和屬性;
QBrush 是畫刷,用來填充封閉圖形,以及定義填充的顏色、樣式和屬性;
QPainter 是畫家,他手拿畫筆 QPen 和畫刷 QBrush,在畫布(QPaintDevice)上畫文字、圖形、圖片等。
可以充當畫布(QPaintDevice)的類(其子類)有:QWidget、QImage、QOpenGLPaintDevice、?QPagedPaintDevice、QPaintDeviceWindow、QPicture 和?QPixmap。
這么多類型的畫布中,QWidget 和 QPixmap 最常用。
一、QPen
畫筆定義了輪廓線的顏色、樣式和屬性,所謂樣式和屬性就是:
①?輪廓線的線型,如實線、點劃線、雙點劃線、虛線等,當然,虛線、點劃線的間距屬性等也都可以設置。
② 輪廓線端點的樣式,如圓形、方形等。
③ 輪廓線拐點的樣式,如尖角、圓角等。
以上3種樣式分別見以下三圖:
二、QBrush
畫刷定義了對封閉區域填充的顏色、樣式。
??
設置畫刷的類型,一般直接在構造函數形參設置。
上圖中點狀、網狀、斜線狀等基本填充方式,可通過形參 Qt::BrushStyle style 設置;
漸變填充可通過形參 const QGradient &gradient 設置;
紋理(圖片)填充可通過形參 const QPixmap &pixmap 或者 const QImage &image設置。
注意:漸變會同時作用于 R / G / B / A 四個通道,因此我們甚至可以做出由透明變得逐步不透明的效果,下文有例子。
三、示例代碼
void Widget::paintEvent(QPaintEvent *event) {QPainter p(this);//畫家把本this窗體作為畫布。p.setRenderHints(QPainter::HighQualityAntialiasing| QPainter::Antialiasing| QPainter::TextAntialiasing, true);//抗鋸齒以平滑int xLen = width();//畫布大小int yLen = height();//step 1:繪制綠色漸變背景//QRadialGradient(圓形漸變區域中心,漸變區域半徑,聚焦點坐標)QRadialGradient gradient(QPointF(100, 100), 100, QPointF(100,100));gradient.setColorAt(0.5, QColor(170, 255, 127, 255));//淺綠色不透明gradient.setColorAt(1.0, QColor(170, 255, 127, 0));//淺綠色全透明p.setPen(QColor(170, 255, 127, 150));//綠色半透明邊框p.setBrush(QBrush(gradient));//漸變畫刷p.drawRect(this->rect());//step 2:繪制橫豎兩條中心線p.setPen(QColor(255, 0, 0, 255));p.setBrush(QColor(255, 0, 0, 255));p.drawLine(QPoint(xLen / 2, 0), QPoint(xLen / 2, yLen));p.drawLine(QPoint(0, xLen/2), QPoint(yLen, xLen/2));//step 3:繪制3個圓p.save();//移動或旋轉坐標系之前,先備份當前坐標系的設置p.translate(xLen/2, yLen/2);//平移坐標系原點至p.setPen(QColor(255, 0, 0, 80));p.setBrush(QColor(255, 0, 0, 0));p.drawEllipse(QRect(-xLen/2, -yLen/2, xLen, yLen));//繪制p.drawEllipse(QRect(-xLen/4, -yLen/4, xLen/2, yLen/2));p.drawEllipse(QRect(-xLen/8, -yLen/8, xLen/4, yLen/4));//step 4:繪制文字p.setPen(QColor(255, 0, 0, 150));p.setBrush(QColor(255, 0, 0, 150));p.drawText(5, yLen/2, "2m");p.setPen(QColor(255, 0, 0, 150));p.setBrush(QColor(255, 0, 0, 150));p.drawText(xLen/4+ 5, yLen/2, "1m");QWidget::paintEvent(event); }構造函數中加入如下代碼:
this->setAttribute(Qt::WA_DeleteOnClose);this->setFixedSize(200, 200);this->setWindowFlag(Qt::FramelessWindowHint);this->setAttribute(Qt::WA_TranslucentBackground, true);?效果圖:
?
轉載于:QPainter、QPen、QBrush,繪圖、填充、漸變等使用方法_野生猿-群號1025127672-CSDN博客?
?
(SAW:Game Over!)?
?
總結
以上是生活随笔為你收集整理的Qt / QPainter、QPen、QBrush 如何理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt / 窗体设置 Qt::WA_Tra
- 下一篇: Qt / 定时器