You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QT中UI按钮动画停滞及非指针方式获取控件引用问题

问题解答

动画无法移动的原因及解决方法

你的动画对象anim是on_pButton_clicked函数内的局部变量,函数执行完毕后,anim会被立即销毁,动画还未开始执行就终止了,因此按钮只会跳转到起始位置后停止。

有两种可行的解决方式:

  1. 将动画声明为类成员变量
    在mainwindow.h中添加成员声明:

    #include <QPropertyAnimation>
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    private slots:
        void on_pButton_clicked();
    private:
        Ui::MainWindow *ui;
        QPropertyAnimation *m_anim; // 新增动画成员
    };
    

    然后修改MainWindow.cpp中的点击事件函数:

    void MainWindow::on_pButton_clicked()
    {
        QPushButton* pb = ui->pButton;
        // 先停止并销毁已有动画,避免重复创建
        if (m_anim) {
            m_anim->stop();
            delete m_anim;
        }
        m_anim = new QPropertyAnimation(pb, "geometry");
        m_anim->setStartValue(QRect(100,100,100,30));
        m_anim->setEndValue(QRect(900,900,100,30));
        m_anim->setDuration(10000);
        m_anim->start();
    }
    

    同时在析构函数中销毁动画对象:

    MainWindow::~MainWindow()
    {
        delete m_anim;
        delete ui;
    }
    
  2. 堆上创建动画并设置自动销毁
    直接在函数内用new创建动画对象,指定动画结束后自动释放内存:

    void MainWindow::on_pButton_clicked()
    {
        QPushButton* pb = ui->pButton;
        QPropertyAnimation *anim = new QPropertyAnimation(pb, "geometry");
        anim->setStartValue(QRect(100,100,100,30));
        anim->setEndValue(QRect(900,900,100,30));
        anim->setDuration(10000);
        anim->start(QAbstractAnimation::DeleteWhenStopped);
    }
    

非指针方式获取UI控件引用的方法

UI设计器生成的控件默认都是指针类型(因为UI框架通过动态分配创建控件实例),无法直接获取原生非指针引用,但可以通过指针取引用的方式实现类似效果:

void MainWindow::on_pButton_clicked()
{
    QPushButton& pb = *ui->pButton; // 通过指针获取引用
    QPropertyAnimation *anim = new QPropertyAnimation(&pb, "geometry");
    anim->setStartValue(QRect(100,100,100,30));
    anim->setEndValue(QRect(900,900,100,30));
    anim->setDuration(10000);
    anim->start(QAbstractAnimation::DeleteWhenStopped);
}

这样就可以用引用pb操作控件,无需重复使用指针语法,但本质仍基于UI生成的指针实例。

内容的提问来源于stack exchange,提问作者proz goret

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 19:54:40