一、前言直方动态图类似于音乐播放时候的柱状图展示,顶部提供一个横线条,当柱状上升的时候,该线条类似于帽子的形式冲到顶端,相当于柱状顶上去的感觉,给人一种动态的感觉,听音乐的同时更加赏心悦目,原理
比较简单,就是用2个定时器,一个定时器间隔比较短,负责快速把柱状图从底部冲到设置的值,同时横线条跟随一起冲上去,一个定时器负责慢慢的跌落值到0,然后横线条缓慢下降,下降速度比柱状图的速度要慢一些,产生一种对比的效果,看起来更像是跌落的感觉。
二、实现的功能 * 1:可设置最大值/最小值/当前值
* 2:可设置顶部滑块高度
* 3:可设置每次变动的步长
* 4:可设置item之间的间隔
* 5:可设置渐变的背景
颜色 * 6:可设置柱状条颜色
三、效果图
四、头文件代码五、核心代码- void WaveBar::paintEvent(QPaintEvent *)
- {
- //绘制准备工作,启用反锯齿
- QPainter painter(this);
- painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
- //绘制渐变背景
- drawBg(&painter);
- //绘制柱状条块
- drawBar(&painter);
- //绘制顶部条块
- drawHead(&painter);
- }
- void WaveBar::drawBg(QPainter *painter)
- {
- painter->save();
- painter->setPen(Qt::NoPen);
- QLinearGradient bgGradient(QPointF(0, 0), QPointF(0, height()));
- bgGradient.setColorAt(0.0, bgColorStart);
- bgGradient.setColorAt(1.0, bgColorEnd);
- painter->setBrush(bgGradient);
- painter->drawRect(rect());
- painter->restore();
- }
- void WaveBar::drawBar(QPainter *painter)
- {
- painter->save();
- QRectF barRect(QPointF(space, barY), QPointF(width() - space, height() - space));
- painter->setPen(Qt::NoPen);
- painter->setBrush(barColor);
- painter->drawRect(barRect);
- painter->restore();
- }
- void WaveBar::drawHead(QPainter *painter)
- {
- painter->save();
- QRectF headRect(QPointF(space, headY), QPointF(width() - space, headY - headHeight));
- painter->setPen(Qt::NoPen);
- painter->setBrush(barColor);
- painter->drawRect(headRect);
- painter->restore();
- }
- void WaveBar::updateBar()
- {
- barY += step;
- //超过底部则停止
- int bottomY = height() - space - headHeight;
- if (barY >= bottomY) {
- if (barTimer->isActive()) {
- barTimer->stop();
- }
- barY = bottomY;
- }
- this->update();
- }
- void WaveBar::updateHead()
- {
- headY += step;
- //超过底部则停止
- int bottomY = height() - space;
- if (headY >= bottomY) {
- if (headTimer->isActive()) {
- headTimer->stop();
- }
- headY = bottomY;
- }
- this->update();
- }