HMI设计九-cybertruck-QPainter复杂油门刹车滑动块设计

  • 要实现的目标

    • 点击刹车片图片进入 复杂油门刹车滑动块
    • 滑动块浮现等待状态会有上下阴影块分别向上向下运行
    • 向上向下切换滑块后,滑块中部隔一定时间(车机检测后)显现停车控制按钮
    • 向上向下切换滑块后,滑块不再支持中间节点,只能向上或者向下切换
    • 鼠标长按中部停车控制按钮后切换回首页3D模型

  • 难点

    • 如何构建图示 点阵背景
    • 如何重构slider滑动块显示控件

  • 如何构建图示 点阵背景

    • 使用QPainter进行手绘
    • 使用QRegion和xored构建掩模板,用setClipRegion设置绘画图层对象
    •  brush.setStyle 设定点阵画刷Qt::Dense7Pattern进行绘制


void DirControlWidget::paint(QPainter *painter)
{

    painter->setRenderHint(QPainter::Antialiasing);


    QColor borderColor = Qt::transparent;
    QColor fillColor = QColor(255, 255, 255);

    QPen pen;
    pen.setColor(borderColor);
    pen.setStyle(Qt::DotLine);
    painter->setPen(pen);

    QBrush brush;
    brush.setColor(fillColor);
    brush.setStyle(Qt::Dense7Pattern);
    painter->setBrush(brush);


    QRegion r1(QRect(m_x,m_y,m_w,m_h));
    QRegion r2(QRect(m_x+m_dt,m_y+m_dt,m_w-m_dt*2,m_w-m_dt*2));
    QRegion r3(QRect(m_x+m_dt,m_y+m_h-m_w+m_dt,m_w-m_dt*2,m_w-m_dt*2));
    QRegion r4 = r1.xored(r2);
    QRegion r5 = r4.xored(r3);
    QRegion r6;
    QRegion r7;
    if(m_isStopShow)
    {
        r6 = QRegion(QRect(m_x+m_dt,m_y+m_h/2-m_w/2+m_dt,m_w-m_dt*2,m_w-m_dt*2));
        r7 = r5.xored(r6);
    }
    else{
        r7 = r5;
    }



    painter->setClipRegion(r7,Qt::ReplaceClip);
    painter->drawRect(m_x,m_y,m_w,m_h);

    painter->setClipRegion(r7,Qt::NoClip);

}

  • 通过设定特定函数进行update刷新
void DirControlWidget::setDirControlWidgetData(int x, int y, int w, int h,bool isStopShow)
{
    m_x = x;
    m_y = y;
    m_w = w;
    m_h = h;
    m_dt = 4;
    m_isStopShow = isStopShow;
    update();
}

  • 如何实现长按停车按钮实现切换

    • 使用了Timer 进行时间限定设计,时间到了检测按钮是否仍然press
    • 结合onPressed和onReleased 设计 实现最终效果

   Button{
        id:dirControlQuitBut
        x:winDesktop.dirControlQuitButX
        y:winDesktop.dirControlQuitButY
        width:winDesktop.dirControlQuitButWidth
        height:winDesktop.dirControlQuitButHeight
        icon.color: "transparent"
        checkable:false
        display:AbstractButton.IconOnly
        visible:(winDesktop.pageIsActive()  && (!winDesktop.brakeControlIsBrake()))?true:false

        property bool _value:false
        background:Rectangle{
            color:"transparent"
        }
        onPressed: {
            if(!_value){
                _value = true
                dircontrolLongPressTimer.restart()
            }
        }
        onReleased: {
            dircontrolLongPressTimer.stop()
            _value = false
        }
    }

    Timer{
        id: dircontrolLongPressTimer
        interval: 1000
        running:false
        repeat:false
        onTriggered:{
            if(dirControlQuitBut._value == true)
            {
                dirControlQuitBut._value = false
                brakeControlBut.checked = false
                dircontrolslider._value = 2
                if(cameraModel_1.isOpened == true)cameraModel_1.isClosed = true
                if(cameraWindow.isOpened = true)cameraWindow.isClosed = true
                brakeControl.setBrakeData(winDesktop.brakeControlX,winDesktop.brakeControlY,winDesktop.brakeControlRoundRectWidth,winDesktop.brakeControlRoundRectHeight,winDesktop.brakeControlRoundRectXRadius,winDesktop.brakeControlRoundRectYRadius,true)
            }
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

william_myq

你的鼓励是我继续的动力!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值