QT中UI按钮动画停滞及非指针方式获取控件引用问题
问题解答
动画无法移动的原因及解决方法
你的动画对象anim是on_pButton_clicked函数内的局部变量,函数执行完毕后,anim会被立即销毁,动画还未开始执行就终止了,因此按钮只会跳转到起始位置后停止。
有两种可行的解决方式:
将动画声明为类成员变量
在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; }堆上创建动画并设置自动销毁
直接在函数内用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
相关产品推荐
相关产品推荐

