-
UID:110085
-
- 注册时间2010-12-21
- 最后登录2024-04-26
- 在线时间3538小时
-
- 发帖2742
- 搜Ta的帖子
- 精华2
- 金钱32733
- 威望3371
- 贡献值589
- 好评度3389
-
访问TA的空间加好友用道具
|
一、前言这个控件是近期定制的控件,还是比较实用的控件之一,用户主要是提了三点需求,一点是切换焦点的时候控件放大突出 显示,一点是可直接输入或者编辑值,还有一点是支持上下键及翻页键和鼠标滚轮来动态修改值,类似于qspinbox控件。要能够支持直接输入首先想到的就是qlineedit控件,在原有的仪表盘控件上中间 部分,放置一个qlineedit控件用来输入值,采用正则表达式来限制只能输入数字,为了使得qlinedit和自定义绘制的仪表盘完全融为一体,必须设置qlineedit的样式为背景透明,至于输入框的位置,有个小技巧就是直接将输入框设置为控件的大小,这样输入的焦点永远在控件的中间,完全混合,丝毫看不出是一个输入框控件插在那里,至于上下键及翻页键和鼠标滚轮,直接 安装事件过滤器即可识别到,进行对应的处理即可。 二、实现的功能 * 1:可设置范围值,支持负数值 * 2:可设置开始旋转角度/结束旋转角度 * 3:可设置是否启用动画效果以及动画效果每次移动的步长 * 4:可设置外圆背景/内圆背景/进度颜色/空余颜色/文字颜色 * 5:自适应窗体拉伸,文字自动缩放 * 6:支持tab及鼠标按下切换焦点 * 7:支持直接输入值立即应用 * 8:获取焦点控件自动变大 * 9:支持键盘上下键步长为1修改值 * 10:支持上下翻页键步长为10修改值 * 11:支持鼠标滚轮步长为1修改值 三、效果图四、头文件代码五、核心代码- void GaugeEdit::paintEvent(QPaintEvent *)
- {
- int width = this->width();
- int height = this->height();
- int side = qMin(width, height);
- //绘制准备工作,启用反锯齿,平移坐标轴中心,等比例缩放
- QPainter painter(this);
- painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
- painter.translate(width / 2, height / 2);
- painter.scale(side / 200.0, side / 200.0);
- //绘制外圆
- drawOuterCircle(&painter);
- //绘制内圆
- drawInnerCircle(&painter);
- //绘制当前进度
- drawProgress(&painter);
- //绘制中心圆
- drawCenterCircle(&painter);
- //绘制单位
- drawUnit(&painter);
- }
- void GaugeEdit::drawOuterCircle(QPainter *painter)
- {
- int radius = 91 + offset;
- painter->save();
- painter->setPen(Qt::NoPen);
- painter->setBrush(outerCircleColor);
- painter->drawEllipse(-radius, -radius, radius * 2, radius * 2);
- painter->restore();
- }
- void GaugeEdit::drawInnerCircle(QPainter *painter)
- {
- int radius = 80 + offset;
- painter->save();
- painter->setPen(Qt::NoPen);
- painter->setBrush(innerCircleColor);
- painter->drawEllipse(-radius, -radius, radius * 2, radius * 2);
- painter->restore();
- }
- void GaugeEdit::drawProgress(QPainter *painter)
- {
- int radius = 75 + offset;
- painter->save();
- painter->setPen(Qt::NoPen);
- QRectF rect(-radius, -radius, radius * 2, radius * 2);
- //计算总范围角度,当前值范围角度,剩余值范围角度
- double angleAll = 360.0 - startAngle - endAngle;
- double angleCurrent = angleAll * ((currentValue - minValue) / (maxValue - minValue));
- double angleOther = angleAll - angleCurrent;
- //绘制当前值饼圆
- painter->setBrush(usedColor);
- painter->drawPie(rect, (270 - startAngle - angleCurrent) * 16, angleCurrent * 16);
- //绘制剩余值饼圆
- painter->setBrush(freeColor);
- painter->drawPie(rect, (270 - startAngle - angleCurrent - angleOther) * 16, angleOther * 16);
- painter->restore();
- }
- void GaugeEdit::drawCenterCircle(QPainter *painter)
- {
- int radius = 60 + offset;
- painter->save();
- painter->setPen(Qt::NoPen);
- painter->setBrush(centerCircleColor);
- painter->drawEllipse(-radius, -radius, radius * 2, radius * 2);
- painter->restore();
- }
- void GaugeEdit::drawUnit(QPainter *painter)
- {
- int radius = 100;
- painter->save();
- painter->setPen(textColor);
- QFont font;
- font.setPixelSize(30);
- painter->setFont(font);
- int offsetY = 110;
- QRectF unitRect(-radius, -radius + offsetY, radius * 2, radius * 2 - offsetY);
- painter->drawText(unitRect, Qt::AlignCenter, unit);
- painter->restore();
- }
|