QT 仪表控件的设计与实现

实物图

本设计实现对程序的鼠标拖动,点击右键实现关闭应用程序,并且含有扫描余晖
动态仪表盘

部分关键代码

void Widget::paintEvent(QPaintEvent *ev)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);// 抗锯齿

    float scale = qMin(width(),height());         // 获取窗口最小值

    //设置缩放比例和原点的先后顺序很重要
    painter.scale(scale/m_refSize,scale/m_refSize);//缩放坐标系,使其收缩自如
    painter.translate(m_refSize/2,m_refSize/2);    //定义坐标原点

    drawFrame(painter);
    drawDivding(painter);
    drawNumberIndicator(painter);
    drawIndicator(painter);
    drawNumberSpeed(painter);

    m_wgt_mileage->setGeometry((width() - m_wgt_mileage->width()) / 2 + 30,
                               height() - m_wgt_mileage->height() - 60,m_wgt_mileage->width(),
                               m_wgt_mileage->height());
}

//绘制边框
void Widget::drawFrame(QPainter &p)
{
    p.save();//保存当前的画家状态(将状态推入堆栈)。save()后面必须跟着相应的restore();函数的作用是:释放堆栈。
    p.setPen(Qt::NoPen);

    QLinearGradient lg1(-m_radius,-m_radius,m_radius,m_radius);//渐变区域
    lg1.setColorAt(0.1,QColor(127,128,214,255));
    lg1.setColorAt(1,QColor(255,22,72,255));

    p.setBrush(lg1);
    p.drawEllipse(-m_radius,-m_radius,m_refSize,m_refSize);   //矩形定义的椭圆,左上角为起始点

    p.setBrush(Qt::black);
    p.drawEllipse(QPoint(0,0),90,90);                         //半径rx和ry绘制位于中心的椭圆。
    p.restore();                                              //恢复当前的绘制器状态(从堆栈中弹出保存的状态)
}

//绘制刻度
void Widget::drawDivding(QPainter &p)
{
    p.save();
    p.rotate(m_startAngle); //顺时针旋转坐标系(150°)
    int step = (m_maxSpeed - m_minSpeed)/5;
    double AngleStep = (360.0 - (m_startAngle - m_endAngle))/step;
    QPen pen(Qt::white);
    for(int i = m_minSpeed; i <= m_maxSpeed; i += 5)
    {
        if(i >= 140)
        {
            pen.setColor(Qt::red);
        }
        if(i % 20 == 0)
        {
            pen.setWidth(2);
            p.setPen(pen);
            p.drawLine(75,0,88,0);
        }
        else if(i % 10 == 0)
        {
            pen.setWidth(1);
            p.setPen(pen);
            p.drawLine(80,0,88,0);
        }
        else if(i % 5 == 0)
        {
            pen.setWidth(0);
            p.setPen(pen);
            p.drawLine(80,0,83,0);
        }
        p.rotate(AngleStep);
    }
    p.restore();
}

//绘制指示数字
void Widget::drawNumberIndicator(QPainter &p)
{
    p.save();
    QFontMetricsF fm(this->font());//获取字体
    QPen pen(Qt::white);
    p.setPen(pen);
    double x,y;
    double angle,angleArc;
    double w,h;
    QString speed;
    for(int i = 0; i <= m_maxSpeed; i +=20)
    {
        angle    = m_startAngle + i * m_anglePerVel;
        angleArc = angle * 3.14 / 180; //角度转换为弧度,因为c语言强调sin(弧度)
        x        = 65 * cos(angleArc);
        y        = 65 * sin(angleArc);
        speed    = QString::number(i);
        w        = fm.width(speed);
        h        = fm.height();
        p.drawText(QPointF(x-w/2,y+h/4),speed);
    }

    p.restore();
}

//显示数字速度
void Widget::drawNumberSpeed(QPainter &p)
{
    p.save();
    p.setPen(Qt::white);
    QString speed = QString("%1Km/h").arg(m_curSpeed);
    QFontMetricsF fm(this->font());//获取字体
    qreal w = fm.size(Qt::TextSingleLine,speed).width();
    p.drawText(-w/2,-20,speed);
    p.restore();
}

//绘制速度指针
void Widget::drawIndicator(QPainter &p)
{
    p.save();
    //画指针
    double curAngle = m_startAngle + m_curSpeed *m_anglePerVel;
    p.rotate(curAngle); //顺时针旋转坐标系(150°)

    QRadialGradient haloGradient(0, 0, 60, 0, 0);  //辐射渐变
    haloGradient.setColorAt(0, QColor(216,107,115));
    haloGradient.setColorAt(1, QColor(216,6,25)); //灰
    p.setBrush(haloGradient);//刷子定义形状如何填满 填充后的颜色

    p.setPen(Qt::NoPen);

    static const QPointF points[4] = {
        QPointF(-10, 1),
        QPointF(70, 1),
        QPointF(70, -1),
        QPointF(-10,-1)
    };
    p.drawPolygon(points,4);
    p.restore();
    p.save();
    //画中心点
    QRadialGradient rg(0,0,10); //指定远点和半径
    rg.setColorAt(0.0,Qt::darkGray);
    rg.setColorAt(0.5,Qt::white);
    rg.setColorAt(1.0,Qt::darkGray);
    QBrush brush(rg);
    p.setBrush(brush);
    p.setPen(Qt::NoPen);
    p.drawEllipse(QPoint(0,0),3,3);
    p.restore();
}

源码链接

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt是一种跨平台的C++开发框架,它提供了丰富的GUI组件库,使得开发者可以轻松地设计和创建各种控件和界面。自定义控件从一定程度上方便了程序的编写,让程序更加直观,使用得当的自定义控件可以让程序增添不少精彩细节。仪表盘是一种比较常见的自定义控件,它可以用来显示实时数据,例如速度,油量,温度等等。下面来简单介绍一下用Qt自定义一个仪表盘的一些步骤。 首先要构思好仪表盘的外观和功能,比如可以考虑盘的大小,采用什么颜色,显示哪些数据等等。 其次,需要用Qt中提供的基础控件(如QPainter、QPoint、QRect)来构建自定义控件的各个部分,包括盘表、指针、刻度等,然后为这些部分设置合适的属性(如颜色、位置、宽度等)。 接着,需要实现控件的数据传递和刷新。一般情况下,会使用定时器或者事件触发来更新控件显示的数据。考虑到仪表盘是一种实时显示数据的控件,所以在设计数据刷新时需要保证刷新频率足够高,否则会出现卡顿、显示延迟等问题。 最后,为了方便其他的开发者使用该自定义控件,可以将其打包成独立的Qt插件,或者直接将自定义控件的源代码公开发布。 以上就是简单的Qt自定义控件仪表盘的一些步骤,开发者可以根据自己的需求进行相应更改和优化。总之自定义控件并不是一件简单的事情,但是如果能够掌握好最基本的知识,就能够创造出更加精美、实用的自定义控件。 ### 回答2: Qt自定义控件仪表盘可以用于需要展示数据的界面设计。通过自定义仪表盘,可以实现不同样式和功能的展示,并且能够满足不同场景下的需求。 在Qt中,仪表盘设计可以通过绘图、圆弧、指针和动画实现,使得界面更加直观、美观,也更加容易被用户理解和操作。可以通过Qt提供的QPainter绘图工具绘制圆弧,也可以通过QTimer控制指针的动画效果。 另外,仪表盘也是可以与其他控件进行绑定的。通过信号与槽的机制,可以将仪表盘的数值与其他控件进行绑定,实现更加复杂的界面功能。 需要特别注意的是,仪表盘设计需要考虑到不同屏幕分辨率的适配性。通过使用Qt提供的屏幕适配机制,可以实现不同分辨率下的仪表盘展示效果。 总之,Qt自定义控件仪表盘是一个非常实用、优雅的设计元素,可以帮助开发者快速开发出漂亮的界面,并且提高用户体验。 ### 回答3: Qt是一个强大的C++跨平台框架,自带了很多常用的UI控件,但是有时候我们也需要自定义一些控件来满足我们的需求。今天我们来介绍一下如何使用Qt自定义一个仪表盘控件。 首先我们需要继承QWidget类,命名为Dashboard。然后我们需要在Dashboard的构造函数中初始化一些常量,比如外部圆弧的宽度、内部圆弧的半径等等。接着我们需要重写paintEvent函数,绘制仪表盘的外部圆弧、刻度、指针等等,具体绘制方式可以根据需求灵活设置。 为了使仪表盘可以在Qt Designer中拖拽使用,我们需要在Dashboard类中加入QIB_DESIGNER_EXPORT_WIDGETS宏。最后在.pro文件中添加如下代码: ``` QT += designer TARGET = Dashboard TEMPLATE = lib HEADERS += Dashboard.h SOURCES += Dashboard.cpp QIB_DESIGNER_EXPORT_WIDGETS(Dashboard) ``` 这样我们就可以在Qt Designer中使用Dashboard自定义控件了。当然,使用自定义控件也需要相应的信号槽机制来进行交互操作。 总的来说,自定义控件可以更好地满足我们的需求,同时也可以提高界面的美观度。在自定义控件的过程中,我们要考虑到控件的可扩展性、易用性以及代码的可维护性等方面,并在不断地改进和优化中,不断提高自己的技术水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值