2016-09-14 135 views
0

我想使用QPropertyAnimation增加小部件的高度,當小部件用QVboxLayout排列時。 問題是,當我打開多個小部件時,他們開始在動畫過程中移動/搖動。Qt QPropertyAnimation爲佈局中的小部件 - 小部件搖晃

我已經準備了最低工作示例,這裏tar gz project 當你點擊「打開」按鈕,第一,第二,然後第三配件出現問題,你可以看到這時,他們都在顫抖,移動過程中略帶上下「開放「 動畫。

有人想法該怎麼做才能避免這種情況? 我可以在主佈局上設置setSizeConstraint(QLayout :: SetFixedSize),它們不晃動,但是然後調整大小和其他不起作用。

問候

馬立克

+0

您設置動畫'minimumHeight'財產。這是錯誤的!埃維改變這個屬性導致完全重新計算佈局。你應該動畫'幾何圖形'或類似的東西。當我到達機器時,我會給你完整的例子,我正確地做了這件事(需要大約8小時)。 –

+0

感謝您的回覆。當我動畫「幾何」時,佈局並沒有重新排列。其他項目遮擋了動畫幀,所以有人給了我這個提示。但也許有其他解決方案。在此先感謝 – user2018761

+0

請最小化您的代碼 - 它應該全部位於一個'main.cpp'文件中,這是一個非常簡單的項目。您不需要'.ui'文件,您不需要'.qss'文件中的樣式等。移除**不需要的所有內容**以證明問題。然後你應該把它編輯成問題本身 - 到那時候它會少於75行。使用非現場文件下載服務是不必要的,這些**總是**變成斷開的鏈接。你的問題將永遠留在這個網站上,如果它變得沒用,因爲關鍵的下載鏈接停止工作,它就沒有任何好處。 –

回答

0

前一段時間我寫了蓬勃生機含有小部件位置的佈局。 你應該以這樣的方式建立你的佈局,每個應動畫控件應該是這個佈局(一個AnimLayout每小部件應動畫)內:

#include <QLayout> 

QT_FORWARD_DECLARE_CLASS(QPropertyAnimation) 

class AnimLayout : public QLayout 
{ 
    Q_OBJECT 

    Q_PROPERTY(QPoint delta 
       READ delta 
       WRITE setDelta 
       NOTIFY deltaChanged) 

    Q_PROPERTY(QRect widgetRect 
       READ widgetRect 
       WRITE setWidgetRect 
       NOTIFY widgetRectChanged) 

    Q_PROPERTY(bool active 
       READ isDeltaActive 
       WRITE setDeltaActive 
       NOTIFY deltaActiveChanged) 

public: 
    explicit AnimLayout(QWidget *parent = 0); 
    ~AnimLayout(); 

    QPoint delta() const; 
    void setDelta(const QPoint &value); 

    QSize sizeHint() const; 
    void setGeometry(const QRect &); 
    QSize minimumSize() const; 
    int count() const; 
    QSize deltaSize() const; 

    QRect widgetRect() const; 
    void setWidgetRect(const QRect &value); 

    bool isDeltaActive() const; 
    void setDeltaActive(bool active = true); 

    void updateItemPosition(); 
private: 
    void addItem(QLayoutItem *item); 
    QLayoutItem *itemAt(int index) const; 
    QLayoutItem *takeAt(int index); 

signals: 
    void deltaChanged(const QPoint &value); 
    void widgetRectChanged(const QRect &value); 
    void deltaActiveChanged(bool active); 

public slots: 
    void testIt(); 

private: 
    QLayoutItem *item; 
    QPropertyAnimation *animation; 
    QPoint mDelta; 
    bool mDeltaActive; 
}; 
/////////////////////////////////////////////////////////// 
#include "animlayout.h" 
#include <QPropertyAnimation> 

AnimLayout::AnimLayout(QWidget *parent) : 
    QLayout(parent) , 
    item(0) 
{ 
    animation = new QPropertyAnimation(this); 
    animation->setPropertyName("widgetRect"); 
    animation->setDuration(400); 
    animation->setTargetObject(this); 
    mDeltaActive = false; 
} 

AnimLayout::~AnimLayout() 
{ 
    delete item; 
} 

QPoint AnimLayout::delta() const 
{ 
    return mDelta; 
} 

void AnimLayout::setDelta(const QPoint &value) 
{ 
    if (mDelta != value) { 
     mDelta = value; 
     emit deltaChanged(mDelta); 
     invalidate(); 
    } 
} 

void AnimLayout::addItem(QLayoutItem *newItem) 
{ 
    Q_ASSERT(!item); 
    animation->stop(); 
    item =newItem; 
    emit widgetRectChanged(item->geometry()); 
    invalidate(); 
} 

QSize AnimLayout::sizeHint() const 
{ 
    if (!item) 
     return QSize(); 
    QSize result(item->sizeHint()); 
    result += deltaSize(); 

    int m = 2*margin(); 
    result += QSize(m,m); 

    return result; 
} 

void AnimLayout::updateItemPosition() 
{ 
    QRect dest = contentsRect(); 

    QPoint d = delta(); 
    if (isDeltaActive()) { 
     d = -d; 
    } 

    if (d.x()!=0) { 
     if (d.x()>0) { 
      dest.setLeft(dest.left()+d.x()); 
     } else { 
      dest.setRight(dest.right()+d.x()); 
     } 
    } 

    if (d.y()) { 
     if (d.y()>0) { 
      dest.setTop(dest.top()+d.y()); 
     } else { 
      dest.setBottom(dest.bottom()+d.y()); 
     } 
    } 

    animation->setEndValue(dest); 
    if (widgetRect()!=dest) { 
     animation->start(); 
    } 
} 

void AnimLayout::setGeometry(const QRect &rect) 
{ 
    QLayout::setGeometry(rect); 

    updateItemPosition(); 
} 

QLayoutItem *AnimLayout::itemAt(int i) const 
{ 
    return i==0?item:0; 
} 

QLayoutItem *AnimLayout::takeAt(int i) 
{ 
    Q_ASSERT(i==0); 
    QLayoutItem *r = item; 
    item = 0; 
    return r; 
} 

void AnimLayout::testIt() 
{ 
    setDeltaActive(!isDeltaActive()); 
} 

QRect AnimLayout::widgetRect() const 
{ 
    if (item) 
     return item->geometry(); 
    return QRect(); 
} 

void AnimLayout::setWidgetRect(const QRect &value) 
{ 
    if (item && item->geometry()!=value) { 
     item->setGeometry(value); 
     emit widgetRectChanged(item->geometry()); 
    } 
} 

bool AnimLayout::isDeltaActive() const 
{ 
    return mDeltaActive; 
} 

void AnimLayout::setDeltaActive(bool active) 
{ 
    if (active!=mDeltaActive) { 
     mDeltaActive = active; 
     animation->stop(); 
     updateItemPosition(); 
     emit deltaActiveChanged(active); 
    } 
} 

QSize AnimLayout::minimumSize() const 
{ 
    QSize result(deltaSize()); 
    if (item) { 
     result += item->minimumSize(); 
    } 
    int m = 2*margin(); 
    result += QSize(m,m); 
    return result; 
} 

int AnimLayout::count() const 
{ 
    return item?1:0; 
} 

QSize AnimLayout::deltaSize() const 
{ 
    return QSize(qAbs(mDelta.x()), qAbs(mDelta.y())); 
} 

它一些額外的功能,你不需要( mDelta)。

+0

我今天會檢查這個,讓你知道它是如何工作的。謝謝 – user2018761

+0

不知道發生了什麼,昨天我發佈了我的答案,它是可見的,現在不是,我也編輯了我原來的帖子,它是以前的形式? – user2018761

0

對不起,花了我這麼久;) 我已經測試它,它的工程很棒。

但是,當我使用我以前的代碼時,我已經使其工作而沒有晃動。我做的更改是將QWidget添加到QScrollArea中,然後在該小部件上設置QVBoxLayout。 無論如何,非常感謝您的幫助。 下面是一個main.cpp中的示例,並且有變量「animatedLayout」可以打開或關閉AnimLayout。

 

    #include 
    #include 

    class AnimLayout : public QLayout 
    { 
     Q_OBJECT 

     Q_PROPERTY(QRect widgetRect 
        READ widgetRect 
        WRITE setWidgetRect 
        NOTIFY widgetRectChanged) 

    public: 
     explicit AnimLayout(QWidget *parent = 0); 
     ~AnimLayout(); 

     QSize sizeHint() const; 
     void setGeometry(const QRect &); 
     QSize minimumSize() const; 
     int count() const; 

     QRect widgetRect() const; 
     void setWidgetRect(const QRect &value); 

     void updateItemPosition(); 
    private: 
     void addItem(QLayoutItem *item); 
     QLayoutItem *itemAt(int index) const; 
     QLayoutItem *takeAt(int index); 

    signals: 
     void widgetRectChanged(const QRect &value); 

    public slots: 
    private: 
     QLayoutItem *item; 
     QPropertyAnimation *animation; 
    }; 

    struct FrameDataStruct { 
     QFrame  *mainFrame; 
     QFrame  *upFrame; 
     QFrame  *downFrame; 
     QPushButton *button; 
     QVBoxLayout *upFrameLayout; 
     QLabel  *text; 
     QVBoxLayout *downFrameLayout; 
     QVBoxLayout *frameLayout; 
     QPropertyAnimation *animation; 
     int   frame_id; 
     int   basic_height; 
     bool  expanded; 
     AnimLayout *animLayout; 
    }; 

    class Proptest : public QMainWindow 
    { 
     Q_OBJECT 

    public: 
     explicit Proptest(); 
     ~Proptest(); 
    private slots: 
     void setDataStruct(); 
     void startAnimation(int frame_id); 
     void animFinished(int frame_id); 
    private: 
     QMap frameMap; 
     QSignalMapper *animStartMapper; 
     QSignalMapper *animFinishedMapper; 
     bool   initialized; 
     QWidget   *scrollWidget; 
     QVBoxLayout  *main_layout; 
     QWidget   *widget; 
     QScrollArea  *scrollArea; 
     QVBoxLayout  *central_layout; 
     bool   layoutAnimated; 
    }; 

    Proptest::Proptest() 
     : widget(new QWidget) 
    { 
     setCentralWidget(widget); 
     this->setGeometry(200,200,300,600); 
     central_layout=new QVBoxLayout(widget); 
     scrollArea=new QScrollArea(widget); 
     central_layout->addWidget(scrollArea); 


     animStartMapper=new QSignalMapper(this); 
     connect(animStartMapper,SIGNAL(mapped(int)),this,SLOT(startAnimation(int))); 

     animFinishedMapper=new QSignalMapper(this); 
     connect(animFinishedMapper,SIGNAL(mapped(int)),this,SLOT(animFinished(int))); 

     scrollWidget=new QWidget(widget); 
     scrollArea->setWidget(scrollWidget); 
     main_layout=new QVBoxLayout(scrollWidget); 
     main_layout->setSizeConstraint(QLayout::SetMinAndMaxSize); 
     scrollArea->setWidgetResizable(true); 
     scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); 

     layoutAnimated=true; 

     this->setDataStruct(); 
    } 
    void Proptest::setDataStruct() { 
     for(int i=0;iexpanded=false; 
      r->frame_id=i; 
      r->mainFrame=new QFrame(scrollWidget); 
      r->upFrame=new QFrame(r->mainFrame); 
      r->upFrame->setMinimumHeight(40); 
      r->button=new QPushButton(QString("open"),r->upFrame); 
      r->upFrameLayout=new QVBoxLayout(r->upFrame); 
      r->upFrameLayout->addWidget(r->button); 
      r->downFrame=new QFrame(r->mainFrame); 
      r->text=new QLabel(QString("some text SOME TEXT some text"),r->downFrame); 
      r->downFrameLayout=new QVBoxLayout(r->downFrame); 
      r->downFrameLayout->addWidget(r->text); 
      r->frameLayout=new QVBoxLayout(r->mainFrame); 
      r->frameLayout->addWidget(r->upFrame); 
      r->frameLayout->addItem(new QSpacerItem(10,10)); 
      r->frameLayout->addWidget(r->downFrame); 
      r->frameLayout->setStretch(0,0); 
      r->frameLayout->setStretch(1,1); 
      r->frameLayout->setStretch(2,0); 

      r->downFrame->setVisible(false); 

      r->animation=new QPropertyAnimation(r->mainFrame,"minimumHeight"); 
      r->animation->setDuration(500); 
      connect(r->button,SIGNAL(clicked(bool)),animStartMapper,SLOT(map())); 
      animStartMapper->setMapping(r->button,r->frame_id); 
      connect(r->animation,SIGNAL(finished()),animFinishedMapper,SLOT(map())); 
      animFinishedMapper->setMapping(r->animation,r->frame_id); 


      if(layoutAnimated) { 
       r->animLayout=new AnimLayout(); 
       r->animLayout->addWidget(r->mainFrame); 
       main_layout->addItem(r->animLayout); 
      } 
      else { 
       main_layout->addWidget(r->mainFrame); 
      } 

      frameMap.insert(r->frame_id,r); 
     } 
     main_layout->addItem(new QSpacerItem(10,10,QSizePolicy::Minimum,QSizePolicy::Expanding)); 
     main_layout->setStretch(main_layout->count()-1,1); 
    } 
    void Proptest::startAnimation(int frame_id) { 
     FrameDataStruct *r=frameMap[frame_id]; 
     if(r->expanded) { 
      r->expanded=false; 
      if(layoutAnimated) { 
       r->downFrame->hide(); 
      } 
      else { 
       r->downFrame->setVisible(false); 
       r->animation->setStartValue(r->mainFrame->geometry().height()); 
       r->animation->setEndValue(r->basic_height); 
      } 

     } else { 
      r->expanded=true; 
      if(layoutAnimated) { 
       r->downFrame->show(); 
      } 
      else { 
       r->basic_height=r->mainFrame->geometry().height(); 
       r->animation->setStartValue(r->basic_height); 
       r->animation->setEndValue(r->basic_height*2); 
       r->upFrame->setMinimumHeight(r->upFrame->height()); 
      } 
     } 
     if(!layoutAnimated) 
      r->animation->start(); 
    } 
    void Proptest::animFinished(int frame_id) { 
     FrameDataStruct *r=frameMap[frame_id]; 
     if(r->expanded) 
      r->downFrame->setVisible(true); 
    } 
    Proptest::~Proptest() { 

    } 

    AnimLayout::AnimLayout(QWidget *parent) : 
     QLayout(parent) , 
     item(0) 
    { 
     animation = new QPropertyAnimation(this); 
     animation->setPropertyName("widgetRect"); 
     animation->setDuration(400); 
     animation->setTargetObject(this); 
    } 

    AnimLayout::~AnimLayout() 
    { 
     delete item; 
    } 
    void AnimLayout::addItem(QLayoutItem *newItem) 
    { 
     Q_ASSERT(!item); 
     animation->stop(); 
     item =newItem; 
     emit widgetRectChanged(item->geometry()); 
     invalidate(); 
    } 

    QSize AnimLayout::sizeHint() const 
    { 
     if (!item) 
      return QSize(); 
     QSize result(item->sizeHint()); 

     int m = 2*margin(); 
     result += QSize(m,m); 

     return result; 
    } 

    void AnimLayout::updateItemPosition() 
    { 
     QRect dest = contentsRect(); 

     animation->setEndValue(dest); 
     if (widgetRect()!=dest) { 
      animation->start(); 
     } 
    } 

    void AnimLayout::setGeometry(const QRect &rect) 
    { 
     QLayout::setGeometry(rect); 

     updateItemPosition(); 
    } 

    QLayoutItem *AnimLayout::itemAt(int i) const 
    { 
     return i==0?item:0; 
    } 

    QLayoutItem *AnimLayout::takeAt(int i) 
    { 
     Q_ASSERT(i==0); 
     QLayoutItem *r = item; 
     item = 0; 
     return r; 
    } 

    QRect AnimLayout::widgetRect() const 
    { 
     if (item) 
      return item->geometry(); 
     return QRect(); 
    } 

    void AnimLayout::setWidgetRect(const QRect &value) 
    { 
     if (item && item->geometry()!=value) { 
      item->setGeometry(value); 
      emit widgetRectChanged(item->geometry()); 
     } 
    } 

    QSize AnimLayout::minimumSize() const 
    { 
     QSize result(item->minimumSize()); 

     int m = 2*margin(); 
     result += QSize(m,m); 
     return result; 
    } 

    int AnimLayout::count() const 
    { 
     return item?1:0; 
    } 

    int main(int argc, char *argv[]) 
    { 

     QApplication a(argc, argv); 

     Proptest w; 
     w.show(); 

     return a.exec(); 
    } 

    #include "main.moc" 

問候

馬立克

0

我的回答再次,不知道爲什麼,但previosu被刪除。

我已經使用Your AnimLayout,它工作的很棒。 下面是main.cpp中的例子,用「layoutAnimated」變量來打開和關閉AnimLayout。

#include <QApplication> 
#include <QtWidgets> 

class AnimLayout : public QLayout 
{ 
    Q_OBJECT 

    Q_PROPERTY(QRect widgetRect 
       READ widgetRect 
       WRITE setWidgetRect 
       NOTIFY widgetRectChanged) 

public: 
    explicit AnimLayout(QWidget *parent = 0); 
    ~AnimLayout(); 

    QSize sizeHint() const; 
    void setGeometry(const QRect &); 
    QSize minimumSize() const; 
    int count() const; 

    QRect widgetRect() const; 
    void setWidgetRect(const QRect &value); 

    void updateItemPosition(); 
private: 
    void addItem(QLayoutItem *item); 
    QLayoutItem *itemAt(int index) const; 
    QLayoutItem *takeAt(int index); 

signals: 
    void widgetRectChanged(const QRect &value); 

public slots: 
private: 
    QLayoutItem *item; 
    QPropertyAnimation *animation; 
}; 

struct FrameDataStruct { 
    QFrame  *mainFrame; 
    QFrame  *upFrame; 
    QFrame  *downFrame; 
    QPushButton *button; 
    QVBoxLayout *upFrameLayout; 
    QLabel  *text; 
    QVBoxLayout *downFrameLayout; 
    QVBoxLayout *frameLayout; 
    QPropertyAnimation *animation; 
    int   frame_id; 
    int   basic_height; 
    bool  expanded; 
    AnimLayout *animLayout; 
}; 

class Proptest : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit Proptest(); 
    ~Proptest(); 
private slots: 
    void setDataStruct(); 
    void startAnimation(int frame_id); 
    void animFinished(int frame_id); 
private: 
    QMap<int,FrameDataStruct*> frameMap; 
    QSignalMapper *animStartMapper; 
    QSignalMapper *animFinishedMapper; 
    bool   initialized; 
    QWidget   *scrollWidget; 
    QVBoxLayout  *main_layout; 
    QWidget   *widget; 
    QScrollArea  *scrollArea; 
    QVBoxLayout  *central_layout; 
    bool   layoutAnimated; 
}; 

Proptest::Proptest() 
    : widget(new QWidget) 
{ 
    setCentralWidget(widget); 
    this->setGeometry(200,200,300,600); 
    central_layout=new QVBoxLayout(widget); 
    scrollArea=new QScrollArea(widget); 
    central_layout->addWidget(scrollArea); 


    animStartMapper=new QSignalMapper(this); 
    connect(animStartMapper,SIGNAL(mapped(int)),this,SLOT(startAnimation(int))); 

    animFinishedMapper=new QSignalMapper(this); 
    connect(animFinishedMapper,SIGNAL(mapped(int)),this,SLOT(animFinished(int))); 

    scrollWidget=new QWidget(widget); 
    scrollArea->setWidget(scrollWidget); 
    main_layout=new QVBoxLayout(scrollWidget); 
    main_layout->setSizeConstraint(QLayout::SetMinAndMaxSize); 
    scrollArea->setWidgetResizable(true); 
    scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); 

    layoutAnimated=true; 

    this->setDataStruct(); 
} 
void Proptest::setDataStruct() { 
    for(int i=0;i<5;i++) { 
     FrameDataStruct *r=new FrameDataStruct; 
     r->expanded=false; 
     r->frame_id=i; 
     r->mainFrame=new QFrame(scrollWidget); 
     r->upFrame=new QFrame(r->mainFrame); 
     r->upFrame->setMinimumHeight(40); 
     r->button=new QPushButton(QString("open"),r->upFrame); 
     r->upFrameLayout=new QVBoxLayout(r->upFrame); 
     r->upFrameLayout->addWidget(r->button); 
     r->downFrame=new QFrame(r->mainFrame); 
     r->text=new QLabel(QString("some text SOME TEXT some text"),r->downFrame); 
     r->downFrameLayout=new QVBoxLayout(r->downFrame); 
     r->downFrameLayout->addWidget(r->text); 
     r->frameLayout=new QVBoxLayout(r->mainFrame); 
     r->frameLayout->addWidget(r->upFrame); 
     r->frameLayout->addItem(new QSpacerItem(10,10)); 
     r->frameLayout->addWidget(r->downFrame); 
     r->frameLayout->setStretch(0,0); 
     r->frameLayout->setStretch(1,1); 
     r->frameLayout->setStretch(2,0); 

     r->downFrame->setVisible(false); 

     r->animation=new QPropertyAnimation(r->mainFrame,"minimumHeight"); 
     r->animation->setDuration(500); 
     connect(r->button,SIGNAL(clicked(bool)),animStartMapper,SLOT(map())); 
     animStartMapper->setMapping(r->button,r->frame_id); 
     connect(r->animation,SIGNAL(finished()),animFinishedMapper,SLOT(map())); 
     animFinishedMapper->setMapping(r->animation,r->frame_id); 


     if(layoutAnimated) { 
      r->animLayout=new AnimLayout(); 
      r->animLayout->addWidget(r->mainFrame); 
      main_layout->addItem(r->animLayout); 
     } 
     else { 
      main_layout->addWidget(r->mainFrame); 
     } 

     frameMap.insert(r->frame_id,r); 
    } 
    main_layout->addItem(new QSpacerItem(10,10,QSizePolicy::Minimum,QSizePolicy::Expanding)); 
    main_layout->setStretch(main_layout->count()-1,1); 
} 
void Proptest::startAnimation(int frame_id) { 
    FrameDataStruct *r=frameMap[frame_id]; 
    if(r->expanded) { 
     r->expanded=false; 
     if(layoutAnimated) { 
      r->downFrame->hide(); 
     } 
     else { 
      r->downFrame->setVisible(false); 
      r->animation->setStartValue(r->mainFrame->geometry().height()); 
      r->animation->setEndValue(r->basic_height); 
     } 

    } else { 
     r->expanded=true; 
     if(layoutAnimated) { 
      r->downFrame->show(); 
     } 
     else { 
      r->basic_height=r->mainFrame->geometry().height(); 
      r->animation->setStartValue(r->basic_height); 
      r->animation->setEndValue(r->basic_height*2); 
      r->upFrame->setMinimumHeight(r->upFrame->height()); 
     } 
    } 
    if(!layoutAnimated) 
     r->animation->start(); 
} 
void Proptest::animFinished(int frame_id) { 
    FrameDataStruct *r=frameMap[frame_id]; 
    if(r->expanded) 
     r->downFrame->setVisible(true); 
} 
Proptest::~Proptest() { 

} 

AnimLayout::AnimLayout(QWidget *parent) : 
    QLayout(parent) , 
    item(0) 
{ 
    animation = new QPropertyAnimation(this); 
    animation->setPropertyName("widgetRect"); 
    animation->setDuration(400); 
    animation->setTargetObject(this); 
} 

AnimLayout::~AnimLayout() 
{ 
    delete item; 
} 
void AnimLayout::addItem(QLayoutItem *newItem) 
{ 
    Q_ASSERT(!item); 
    animation->stop(); 
    item =newItem; 
    emit widgetRectChanged(item->geometry()); 
    invalidate(); 
} 

QSize AnimLayout::sizeHint() const 
{ 
    if (!item) 
     return QSize(); 
    QSize result(item->sizeHint()); 

    int m = 2*margin(); 
    result += QSize(m,m); 

    return result; 
} 

void AnimLayout::updateItemPosition() 
{ 
    QRect dest = contentsRect(); 

    animation->setEndValue(dest); 
    if (widgetRect()!=dest) { 
     animation->start(); 
    } 
} 

void AnimLayout::setGeometry(const QRect &rect) 
{ 
    QLayout::setGeometry(rect); 

    updateItemPosition(); 
} 

QLayoutItem *AnimLayout::itemAt(int i) const 
{ 
    return i==0?item:0; 
} 

QLayoutItem *AnimLayout::takeAt(int i) 
{ 
    Q_ASSERT(i==0); 
    QLayoutItem *r = item; 
    item = 0; 
    return r; 
} 

QRect AnimLayout::widgetRect() const 
{ 
    if (item) 
     return item->geometry(); 
    return QRect(); 
} 

void AnimLayout::setWidgetRect(const QRect &value) 
{ 
    if (item && item->geometry()!=value) { 
     item->setGeometry(value); 
     emit widgetRectChanged(item->geometry()); 
    } 
} 

QSize AnimLayout::minimumSize() const 
{ 
    QSize result(item->minimumSize()); 

    int m = 2*margin(); 
    result += QSize(m,m); 
    return result; 
} 

int AnimLayout::count() const 
{ 
    return item?1:0; 
} 

int main(int argc, char *argv[]) 
{ 

    QApplication a(argc, argv); 

    Proptest w; 
    w.show(); 

    return a.exec(); 
} 

#include "main.moc" 

問候

馬立克