QT简单实现控件运动代码

1 篇文章 0 订阅

原始图像和控件是这样的,绿色的为图片。红色的为一个label或者button,要实现的功能就是按下键盘的按键,控制红色向绿色的4个角落运动,类似摇杆的功能,然后还带有松开键盘自动回弹效果。

演示视频如下

又来学习QT啦

要实现这个效果主要有下面几个关键点:

        1.监听键盘

        2.控制控件运动

        3.键盘松开后控件自动回位

首先是监听键盘操作,

参考QT窗体[widgets]使用keyPressEvent获取键盘输入_qt 捕获键盘输入-CSDN博客

// 键盘按下事件
void car_ctrl::keyPressEvent(QKeyEvent * event)
{
    // 普通键
    switch (event->key())
    {
    // ESC键
    case Qt::Key_Escape:
        qDebug() <<"ESC";
        temp_str="esc";
        break;
    // 回车键
    case Qt::Key_Return:
        qDebug() <<"Enter";
        temp_str="ent";
        break;
    // F1键
    case Qt::Key_F1:
        temp_str="f1";
        qDebug() <<"F1";
        break;
    case Qt::Key_W:
        qDebug() <<"w";
    }
}

然后控制控件移动

pAnimation->setStartValue(QPoint(ui->label->geometry().x()+70,ui->label->geometry().y()+57)/*QPoint(140, 688)*/); // 初始值,这里我获取的那张固定图片坐标作为参考坐标

pAnimation->setEndValue(QPoint(ui->label->geometry().x()+70,ui->label->geometry().y()+110)); // 结束值

pAnimation->start();

松开后自动回位,这个功能是通过定时器定时判断键盘状态实现的(也包含长按键盘的处理,若不处理,会出现动画反复播放)

大部分代码

    pAnimation = new QPropertyAnimation(ui->pushButton_7, "pos");
    pAnimation->setDuration(300); // 设置动画执行时间,单位毫秒
    timer = new QTimer(this);//加入对象树
    timer->start(500);
    connect(timer,SIGNAL(timeout()),this,SLOT(timer_cbk()));
    上面这部分代码放在初始化时


void car_ctrl::timer_cbk(){//定时器
    if(((QTime::currentTime().msec()+QTime::currentTime().second()*1000-keyboard_time)>600))
    {
        qDebug() << "timer release ";
        temp_str="}none";
        pAnimation->stop();
        ui->pushButton_7->move(QPoint(ui->label->geometry().x()+70,ui->label->geometry().y()+57));
        timer->stop();
    }
}
// 键盘按下事件
void car_ctrl::keyPressEvent(QKeyEvent * event)
{
    keyboard_time=QTime::currentTime().msec()+QTime::currentTime().second()*1000;
    // 普通键
    switch (event->key())
    {
    // ESC键
    case Qt::Key_Escape:
        qDebug() <<"ESC";
        temp_str="esc";
        break;
    // 回车键
    case Qt::Key_Return:
        qDebug() <<"Enter";
        temp_str="ent";
        break;
    // F1键
    case Qt::Key_F1:
        temp_str="f1";
        qDebug() <<"F1";
        break;
    case Qt::Key_W:
        qDebug() <<"w";
        if(strncmp(temp_str,"w",1)){
//            keyboard_time=QTime::currentTime().msec()+QTime::currentTime().second()*1000;
            pAnimation->setStartValue(QPoint(ui->label->geometry().x()+70,ui->label->geometry().y()+57)/*QPoint(140, 688)*/); // 初始值
            pAnimation->setEndValue(QPoint(ui->label->geometry().x()+70,ui->label->geometry().y()+4)); // 结束值

            pAnimation->start();
        }
        temp_str="w";
        break;
    case Qt::Key_S:
        qDebug() <<"s";

        if(strncmp(temp_str,"s",1)){
//            keyboard_time=QTime::currentTime().msec()+QTime::currentTime().second()*1000;
            pAnimation->setStartValue(QPoint(ui->label->geometry().x()+70,ui->label->geometry().y()+57)/*QPoint(140, 688)*/); // 初始值
            pAnimation->setEndValue(QPoint(ui->label->geometry().x()+70,ui->label->geometry().y()+110)); // 结束值

            pAnimation->start();
        }
        temp_str="s";
        break;
    case Qt::Key_A:
        qDebug() <<"a";

        if(strncmp(temp_str,"a",1)){
//            keyboard_time=QTime::currentTime().msec()+QTime::currentTime().second()*1000;
            pAnimation->setStartValue(QPoint(ui->label->geometry().x()+70,ui->label->geometry().y()+57)/*QPoint(140, 688)*/); // 初始值
            pAnimation->setEndValue(QPoint(ui->label->geometry().x()+15,ui->label->geometry().y()+57)); // 结束值

            pAnimation->start();
        }
        temp_str="a";
        break;
    case Qt::Key_D:
        qDebug() <<"d";
        if(strncmp(temp_str,"d",1)){

            pAnimation->setStartValue(QPoint(ui->label->geometry().x()+70,ui->label->geometry().y()+57)/*QPoint(140, 688)*/); // 初始值
            pAnimation->setEndValue(QPoint(ui->label->geometry().x()+125,ui->label->geometry().y()+57)); // 结束值
            pAnimation->start();

        }
        temp_str="d";
        break;
    default:

        break;
    }
    if(ser_port->isOpen()&&strncmp(temp_str,"}",1)){
        ser_port->write(temp_str);
    }
    if(!timer->isActive()) timer->start(500);
    qDebug() <<QTime::currentTime().msec();
}
// 键盘释放事件
void car_ctrl::keyReleaseEvent(QKeyEvent *event)
{
    qDebug() <<QTime::currentTime().msec();
    // 方向UP键
    if(((QTime::currentTime().msec()+QTime::currentTime().second()*1000-keyboard_time)>600)&&(event->key() == Qt::Key_W||event->key() == Qt::Key_A||event->key() == Qt::Key_S||event->key() == Qt::Key_D))
    {
        qDebug() << "release: "<< "W/A/S/D";
//        ui->pushButton_7->geometry().setX(60);
//        ui->pushButton_7->geometry().setY(57);
        temp_str="}none";
        pAnimation->stop();
        ui->pushButton_7->move(QPoint(ui->label->geometry().x()+70,ui->label->geometry().y()+57));

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

山间朝暮-CanEve

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

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

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

打赏作者

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

抵扣说明:

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

余额充值