2013-03-22 65 views
4

我想在Qt桌面應用程序中測試動畫。我剛剛從幫助中複製了一個例子點擊按鈕後,新的按鈕只出現在左上角沒有動畫(甚至結束位置是錯誤的)。我錯過了什麼嗎?QPropertyAnimation不起作用

的Qt 5.0.1,Linux Mint的64位,GTK

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include <QPropertyAnimation> 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

void MainWindow::on_pushButton_clicked() 
{ 
    QPushButton *button = new QPushButton("Animated Button", this); 
    button->show(); 

    QPropertyAnimation animation(button, "geometry"); 
    animation.setDuration(10000); 
    animation.setStartValue(QRect(0, 0, 100, 30)); 
    animation.setEndValue(QRect(250, 250, 100, 30)); 

    animation.start(); 
} 

編輯:解決。動畫對象必須作爲全局引用。例如在私人QPropertyAnimation *動畫部分。然後QPropertyAnimation = New(....);

回答

4

你剛纔沒有複製這個例子,你也做了一些改變,打破了它。您的animation變量現在是一個局部變量,在on_pushButton_clicked函數結束時被銷燬。使QPropertyAnimation實例的主窗口類的成員變量和使用它像這樣:

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow), mAnimation(0) 
{ 
    ui->setupUi(this); 
    QPropertyAnimation animation 
} 

MainWindow::~MainWindow() 
{ 
    delete mAnimation; 
    delete ui; 
} 

void MainWindow::on_pushButton_clicked() 
{ 
    QPushButton *button = new QPushButton("Animated Button", this); 
    button->show(); 

    mAnimation = new QPropertyAnimation(button, "geometry"); 
    mAnimation->setDuration(10000); 
    mAnimation->setStartValue(QRect(0, 0, 100, 30)); 
    mAnimation->setEndValue(QRect(250, 250, 100, 30)); 

    mAnimation->start(); 
} 
+0

是的。我在你的答案之前編輯了我的帖子;)但是你是對的,這是解決方案 – Dibo 2013-03-22 22:10:04

+0

這個解決方案並不好:每次你點擊按鈕** pushButton **,你就會動態地創建一個動畫,當你關閉應用程序時,在刪除析構函數中'mAnimation'指向的動畫時最多隻能刪除一個動畫。所以如果你點擊很多次就會出現內存泄漏。問題的最佳答案是[@ ville-lukka]提到的(http://stackoverflow.com/a/15584232/2775917) – 2016-03-20 20:28:54

9

你不需要做一個插槽專爲刪除mAnimation變量。 Qt可以爲你做,如果你使用QAbstractAnimation::DeleteWhenStopped

QPropertyAnimation *mAnimation = new QPropertyAnimation(button, "geometry"); 
mAnimation->setDuration(10000); 
mAnimation->setStartValue(QRect(0, 0, 100, 30)); 
mAnimation->setEndValue(QRect(250, 250, 100, 30)); 

mAnimation->start(QAbstractAnimation::DeleteWhenStopped);