QStyleOptionGraphicsItem实现自绘按钮悬浮按下状态
Qt官方自帶的例子animatedtiles,該工程存放在Qt安裝目錄下的
Examples\Qt-XX.XX.XX\widgets\animation\animatedtiles 目錄
其中XX.XX.XX為Qt的版本號,如:5.14.1。有如下代碼:
class Button : public QGraphicsWidget {Q_OBJECT public:...... // 該部分代碼略,請參見Qt官方自帶的例子查看void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *) override{bool down = option->state & QStyle::State_Sunken;QRectF r = boundingRect();QLinearGradient grad(r.topLeft(), r.bottomRight());grad.setColorAt(down ? 1 : 0, option->state & QStyle::State_MouseOver ? Qt::white : Qt::lightGray);grad.setColorAt(down ? 0 : 1, Qt::darkGray);painter->setPen(Qt::darkGray);painter->setBrush(grad);painter->drawEllipse(r);QLinearGradient grad2(r.topLeft(), r.bottomRight());grad.setColorAt(down ? 1 : 0, Qt::darkGray);grad.setColorAt(down ? 0 : 1, Qt::lightGray);painter->setPen(Qt::NoPen);painter->setBrush(grad);if (down)painter->translate(2, 2);painter->drawEllipse(r.adjusted(5, 5, -5, -5));painter->drawPixmap(-_pix.width()/2, -_pix.height()/2, _pix);}...... // 該部分代碼略,請參見Qt官方自帶的例子查看 };第9行代碼:判斷按鈕是否被鼠標按下了,如果按鈕被按下,則:
ption->state & QStyle::State_Sunken即down就為true,否則就會false。
第10-16行:創建一個漸變畫刷和一個Qt::darkGray顏色的畫筆。并利用該畫刷、畫筆在按鈕所在最小外包圍矩形中繪制了一個圓形。創建畫刷的思路是:
- 從按鈕最小外包圍矩形左上角到右下角進行漸變。
- 如果鼠標將按鈕按下 了,則設置漸變的起點顏色為Qt::darkGray、終點顏色為Qt::white。
? ? ? ? 此時第12、13行代碼變為:
grad.setColorAt(1, Qt::white); grad.setColorAt(0, Qt::darkGray);此時繪制出的按鈕如下(注意:17行后的代碼都注釋掉了,這里僅僅顯示的是17行之前的代碼效果):
?可以看到從左上角的深灰漸變到右下角的白色。
- 如果鼠標沒將按鈕按下,僅僅是懸浮在按鈕上面,則此時第12、13行代碼變為:
此時繪制出來的效果如下(注意:17行后的代碼都注釋掉了,這里僅僅顯示的是17行之前的代碼效果):
?可以看到從左上角的白色漸變到右下角的深灰色。
- 如果鼠標既沒按下按鈕也沒懸浮在按鈕上面,則第12、13行代碼如下:
效果如下(注意:17行后的代碼都注釋掉了,這里僅僅顯示的是17行之前的代碼效果):
?
?可以看到從左上角的淺灰色漸變到右下角的深灰色。
第17-21行:如果鼠標被按下,則創建淺灰到深灰漸變畫刷;如果鼠標沒按下按鈕,則創建深灰到淺灰漸變畫刷。注:第20行畫筆一定要是Qt::NoPen,否則第24行創建的圓形和第16行創建的圓形有畫筆留下的痕跡,進而明顯可以看出不是一個整體的圓形。
第24行:因為15行設置的漸變畫刷和21行設置的漸變畫刷不一樣,再加上本行將按鈕最小外包矩形寬高縮小10個單位,這樣創建的兩個圓形有顯著的凸凹視覺效果,更逼真,如下(注釋掉了第25行代碼后的效果):
第22-23行:如果按鈕被按下了,就將坐標系向右、向下平移2個單位,這樣就會給人造成按下的逼真視覺效果。?
至此,本函數分析完畢!
總結
以上是生活随笔為你收集整理的QStyleOptionGraphicsItem实现自绘按钮悬浮按下状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工行公账自助打印回单手续费 360人民币
- 下一篇: 学生电脑哪个牌子好_常亮补光灯哪个牌子好