qt自定义控件摇杆

本文介绍了一个Qt自定义控件——摇杆,该控件能够实时输出横纵坐标,并且可以作为子控件进行大小调节。内容包括handle.h和handle.cpp的代码示例,以及所用到的图片资源,适合Qt开发人员学习参考。

 控件类实时输出横纵坐标,作为子控件使用,大小可调节,借鉴于Qt 模拟安卓虚拟摇杆实现 - 代码先锋网代码,可供大家学习参考

直接上代码:

handle.h

#ifndef HANDLE_H
#define HANDLE_H

#include <QPainter>
#include <QDrag>
#include <QMouseEvent>
#include <QtMath>
#include <QTimer>
#include<QLabel>
#include<QPushButton>
class handle : public QLabel
{
    Q_OBJECT
public:
    explicit handle(QLabel *parent = nullptr,int x=0,double ss=0.0);
protected:
    void paintEvent(QPaintEvent *event)override;
    void mouseMoveEvent(QMouseEvent *event)override;
    void mouseReleaseEvent(QMouseEvent *event)override;
    void mousePressEvent(QMouseEvent *event)override;
signals:
    void pressit();
    void releasit();
private:
    double Pointdis(int a,int b,int x,int y);//两点距离
    bool entermenu(QPoint p,QLabel *l);
private:
    int mouseX=0;
    int mouseY=0;
    int handleX=0;//摇杆
    int handleY=0;
    int handleR=0;
    int padX=0;//底盘
    int padY=0;
    int padR=0;
    double handPadDis=0.0;//两圆圆心距离
    bool mousePressed=false;
    QTimer *tim;
    double xs=0.0;
    double ys=0.0;
private:
    QLabel *lab1;
    QLabel *lab2;
    QPushButton *pusleft;
    QPushButton *pusup;
    QPushButton *pusdown;
    QPushButton *pusright;
private slots:
    void leftu();
    void upu();
    void downu();
    void rightu();

    void getKeyNum();

};

#endif // HANDLE_H

handle.cpp

#include "handle.h"
#include"QDebug"
double scale=0.4;
handle::handle(QLabel *parent,int r,double scale1) : QLabel(parent)
{
   r=300;//测试时给了个值,可调用时给值
   setFixedSize(r,r);
   //setMouseTracking(1);

   //this->setWindowFlags(Qt::Window|Qt::FramelessWindowHint);
   this->setStyleSheet("background:transparent;");
   lab1=new QLabel(this);
   lab1->setGeometry(0,0,this->width(),this->height());
   lab1->setPixmap(QPixmap(":/new/prefix1/di.png"));
   lab1->setScaledContents(1);
   //lab1->setMouseTracking(1);
   lab1->lower();
   lab2=new QLabel(this);
   lab2->setGeometry(this->width()*(1-scale)/2,this->width()*(1-scale)/2,this->width()*scale,this->height()*scale);
   lab2->setPixmap(QPixmap(":/new/prefix1/qiu.png"));
   lab2->setScaledContents(1);
   //lab2->setMouseTracking(1);
   pusleft=new QPushButton(lab1);
   pusleft->setGeometry(r*3/50,r*17/40,r*3/25,r*29/200);
   pusup=new QPushButton(lab1);
   pusup->setGeometry(r*17/40,r*3/50,r*29/200,r*3/25);
   pusdown=new QPushButton(lab1);
   pusdown->setGeometry(r*17/40,r*41/50,r*29/200,r*3/25);
   pusright=new QPushButton(lab1);
   pusright->setGeometry(r*41/50,r*17/40,r*3/25,r*29/200);

   tim=new QTimer(this);
   connect(pusleft,SIGNAL(clicked()),this,SLOT(leftu()));
   connect(pusup,SIGNAL(clicked()),this,SLOT(upu()));
   connect(pusdown,SIGNAL(clicked()),this,SLOT(downu()));
   connect(pusright,SIGNAL(clicked()),this,SLOT(rightu()));

   connect(tim, SIGNAL(timeout()), this, SLOT(getKeyNum()));

}

void handle::paintEvent(QPaintEvent *event)
{

        padR=lab1->width()/2;//底盘圆心
        handleR=lab2->width()/2;//摇杆圆半径
        padX=padR;//底盘圆心
        padY=padR;//底盘圆心
        int handleMaxR=padR-handleR;
        if(!mousePressed){//鼠标没按下则摇杆恢复到底盘中心
            mouseX=padX;
            mouseY=padY;
            lab2->move(mouseX-handleR,mouseY-handleR);
        }
        handPadDis=Pointdis(padR,padR,mouseX,mouseY);
        if(handPadDis<=handleMaxR){
            handleX=mouseX;
            handleY=mouseY;
            lab2->move(handleX-handleR,handleY-handleR);
        }
        else {
            handleX=(int)(handleMaxR*(mouseX-padX)/handPadDis+padX);
            handleY=(int)(handleMaxR*(mouseY-padY)/handPadDis+padY);
            lab2->move(handleX-handleR,handleY-handleR);
        }

}

void handle::mouseMoveEvent(QMouseEvent *event)
{
    static bool r=false;
    mouseX=event->pos().x();
    mouseY=event->pos().y();
    if(r==true){
        update();
        r=false;
    }
    else{
        r=true;
    }
}

void handle::mouseReleaseEvent(QMouseEvent *event)
{
    mouseX=width()*scale;
    mouseY=height()*scale;
    tim->stop();
    mousePressed=false;
    emit releasit();
    update();
    xs=0.0;//应该让释放后横纵坐标归零
    ys=0.0;

}

void handle::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton&&entermenu(event->pos(),lab1))
    {
    mouseX=event->pos().x();
    mouseY=event->pos().y();
    int k=Pointdis(padX,padY,mouseX,mouseY);

    if(k<padR)
    {
        tim->start(100);
        mousePressed=true;
        emit pressit();
        update();
    }
    }

}

double handle::Pointdis(int a, int b, int x, int y)
{
    return sqrt((double)((x-a)*(x-a)+(y-b)*(y-b)));
}

void handle::leftu()
{
    xs=xs-0.01;
    qDebug()<<xs;
}

void handle::upu()
{
    ys=ys+0.01;
    qDebug()<<ys;
}

void handle::downu()
{
    ys=ys-0.01;
    qDebug()<<ys;
}

void handle::rightu()
{
    xs=xs+0.01;
    qDebug()<<xs;
}

void handle::getKeyNum()
{
    if(Pointdis(mouseX,mouseY,padX,padY)<=padR)
    {
        xs=((double)mouseX-(double)padX)/(double)padR;
        ys=((double)padY-(double)mouseY)/(double)padR;
    }
    else
    {
        xs=((double)mouseX-(double)padX)/Pointdis(mouseX,mouseY,padX,padY);
        ys=((double)padY-(double)mouseY)/Pointdis(mouseX,mouseY,padX,padY);
    }
    qDebug()<<xs<<ys;
}
bool handle::entermenu(QPoint p,QLabel *l)
{
    int height = l->height();
    int width = l->width();
    QPoint labMinPos = l->pos();
    QPoint labMaxPos = l->pos();
    labMaxPos.setX(l->pos().x()+width);
    labMaxPos.setY(l->pos().y()+height);
    if(p.x() >= labMinPos.x() && p.y() >= labMinPos.y()
        && p.x() <= labMaxPos.x() && p.y() <= labMaxPos.y())
        return true;
    else
        return false;
}

图片资源

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值