仿 遥控器 摇杆控件

1,项目中 需要对遥控器的 控制进行PC端展示,因此 自己封装了一个 widget。用于摇杆数值的实时展示,效果如下

 

2,思路

利用  paintEvent(QPaintEvent *)   事件,进行实时绘制,具体实现 如下

头文件

 

#ifndef JOYSTICK_H
#define JOYSTICK_H
#include <QWidget>
#include "pvgauge_global.h"
 
class GAUGE_EXPORT Joystick: public QWidget
{
    Q_OBJECT
public:
    explicit Joystick(QWidget *parent = nullptr);
    ~Joystick();
 
    /**
     * @brief 设置遥控器 量程,默认1000
     * @param range
     */
    void setRange(int range);
 
    /**
     * @brief 设置垂直位置
     * @param vValue
     */
    void setVValue(int vValue);
 
    /**
     * @brief 设置水平位置
     * @param hValue
     */
    void setHValue(int hValue);
 
protected:
    void paintEvent(QPaintEvent *);
    void resizeEvent(QResizeEvent *);
    void drawCircle(QPainter *painter);
    void drawHVLine(QPainter *painter);
    void drawHVPoint(QPainter *painter);
 
private:
    int m_radius;
    int m_centerX;
    int m_centerY;
 
    int m_range;  //遥控器量程
    int m_hValue;
    int m_vValue;
 
    int m_circleOffset;
    int m_pointOffset;
 
private:
    void initData();
 
};
#endif // JOYSTICK_H
 

 源文件

 

#include "joystick.h"
#include <QPainter>
#include <QDebug>
 
Joystick::Joystick(QWidget *parent):QWidget(parent),m_range(1000)
  ,m_hValue(500),m_vValue(-500)
{
    initData();
}
 
Joystick::~Joystick()
{
 
}
 
void Joystick::resizeEvent(QResizeEvent *)
{
    initData();
    update();
}
 
void Joystick::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.translate(width() / 2, height() / 2);	/* 坐标变换为窗体中心 */
 
    drawCircle(&painter);//圆
    drawHVLine(&painter);//水平 垂直线
    drawHVPoint(&painter);//线上 点
}
 
void Joystick::drawCircle(QPainter *painter)
{
    painter->save();
    painter->setPen(Qt::NoPen);
 
    /* 外边框 */
    int tempRadius=m_radius;
    QLinearGradient lg1(0, -tempRadius, 0, tempRadius);
    //lg1.setColorAt(0, QColor(255, 255, 255));
    //lg1.setColorAt(1, QColor(166, 166, 166));
    lg1.setColorAt(0, QColor(111, 111,111));
    lg1.setColorAt(1, QColor(111, 111, 111));
    painter->setBrush(lg1);
    painter->drawEllipse(-tempRadius, -tempRadius, tempRadius << 1, tempRadius << 1);
 
    /* 内边框 */
    tempRadius -= m_circleOffset;
    QLinearGradient lg2(0, -tempRadius, 0, tempRadius);
    // lg2.setColorAt(0, QColor(166, 166, 166));
    // lg2.setColorAt(1, QColor(255, 255, 255));
 
    lg2.setColorAt(0, QColor(255, 255, 255));
    lg2.setColorAt(1, QColor(255, 255, 255));
    painter->setBrush(lg2);
    painter->drawEllipse(-tempRadius, -tempRadius, tempRadius << 1, tempRadius << 1);
 
    /* 内部指示颜色 */
    tempRadius -= 4;
    QRadialGradient rg(0, 0, tempRadius);
    //    rg.setColorAt(0, QColor(0, 245, 0));
    //    rg.setColorAt(0.6, QColor(0, 210, 0));
    //    rg.setColorAt(1, QColor(0, 166, 0));
    rg.setColorAt(0, QColor(0, 0, 0,50));
    rg.setColorAt(1, QColor(0, 0, 0,50));
 
    painter->setBrush(rg);
    painter->drawEllipse(-tempRadius, -tempRadius, tempRadius << 1, tempRadius << 1);
 
    painter->restore();
}
 
void Joystick::drawHVLine(QPainter *painter)
{
    painter->save();
    painter->setPen(QColor(100,0,0));
    painter->setPen(Qt::DashLine);
 
    int hlineStartX = m_centerX-m_radius+m_circleOffset;
    int hlineStartY = m_centerY;
    int hlineStopX= m_centerX+m_radius-m_circleOffset;
    int hlineStopY= m_centerY;
    painter->drawLine(QPoint(hlineStartX+m_circleOffset+m_pointOffset,hlineStartY),QPoint(hlineStopX-m_circleOffset-m_pointOffset,hlineStopY));
 
    int vlineStartX = m_centerX ;
    int vlineStartY = m_centerY-m_radius+m_circleOffset;
    int vlineStopX=m_centerX;
    int vlineStopY=m_centerY+m_radius-m_circleOffset;
    painter->drawLine(QPoint(vlineStartX,vlineStartY+m_circleOffset+m_pointOffset),QPoint(vlineStopX,vlineStopY-m_circleOffset-m_pointOffset));
 
    painter->restore();
}
 
void Joystick::drawHVPoint(QPainter *painter)
{
    painter->save();
    int circleRadius=m_pointOffset*2;//圆点半径
 
    QBrush brush(QColor(0,255,255));
    painter->setBrush(brush);
    //水平点
    int hx=(m_hValue*(m_radius-m_circleOffset*2))/m_range;
    painter->drawEllipse(QPoint(hx,m_centerY),circleRadius,circleRadius);
 
    QBrush brush2(QColor(0,255,64));
    painter->setBrush(brush2);
    //垂直点
    int vY=(m_vValue*(m_radius-m_circleOffset*2))/m_range;
    painter->drawEllipse(QPoint(m_centerX,vY),circleRadius,circleRadius);
 
    painter->setPen(QColor(0,0,0));
    //水平文字
    painter->drawText(QPoint(hx-circleRadius,m_centerY+circleRadius*2+m_pointOffset),QString::number(m_hValue));
    //垂直文字
    painter->drawText(QPoint(m_centerX+circleRadius+m_pointOffset,vY+m_pointOffset),QString::number(-m_vValue));
    painter->restore();
}
 
void Joystick::setHValue(int hValue)
{
    m_hValue = hValue;
    update();
}
 
void Joystick::setVValue(int vValue)
{
    m_vValue = -vValue;
    update();
}
 
void Joystick::setRange(int range)
{
    m_range = range;
}
 
void Joystick::initData()
{
    m_radius = qMin(width()/2, height()/2);//半径
    //圆心
    m_centerX = 0;
    m_centerY = 0;
 
    m_circleOffset= m_radius/20+2;// 13;//内外圆 之差
    m_pointOffset=m_radius/50+2;// 5;//点 与文字的偏移
}
 

关注微信,以免错过更多精彩内容:

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于QGroundControl(QGC)软件的使用,可以通过遥控器进行仿真操作。下面是一些使用遥控器进行QGC仿真的步骤: 1. 首先,确保你已经安装并正确配置了QGroundControl软件。你可以从官方网站(https://qgroundcontrol.com/)下载最新版本的软件,并按照说明进行安装和设置。 2. 确保你的遥控器已经连接到计算机,并且被正确识别。你可以在计算机的设备管理器中查看遥控器是否被正确识别。 3. 打开QGroundControl软件,并通过菜单栏中的“设置(Settings)”选项进入“遥控器(Joystick)”设置页面。 4. 在“遥控器(Joystick)”设置页面中,你可以选择遥控器的类型和连接方式。选择适用于你的遥控器类型,并确保选择了正确的连接方式(例如,通过USB连接或无线连接)。 5. 在设置页面中,你可以进行校准和测试遥控器。按照软件提供的指示进行校准和测试,确保遥控器可以正确地与QGroundControl软件进行通信。 6. 一旦遥控器被成功连接和校准,你可以在QGroundControl软件中使用遥控器来模拟飞行器的操作。根据你的需求,你可以进行飞行器的制、导航和其他操作。 请注意,具体的操作步骤可能会因为遥控器的型号和QGroundControl软件的版本而有所差异。在使用遥控器进行仿真之前,建议你参考QGroundControl软件的官方文档或者用户手册,以获取更详细的指导和说明。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

土拨鼠不是老鼠

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值