2015-07-26 6 views
0

Предположим, у меня есть QPropertyAnimator анимационный (движущийся), скажем, кнопка - немного влево в течение 10 секунд.Как использовать сигнал для выполнения любой функции с аргументами?

Когда кнопка достигает своего пункта назначения на другой стороне окна, она должна изменить свой текст на «банан», используя функцию QLineEdit::setText().

Если функция QLineEdit::setText() выдается непосредственно после запуска анимации;

QPropertyAnimator *animator = new QPropertyAnimator(someButton, "pos"); 

animator->setDuration(10000); 
animator->setStartValue(*current position of the button*); 
animator->setEndValue(*current position of the button with x-100*); 
animator->start(); 

QLineEdit::setText(QString("Banana")); 

Текстовые изменения, прежде чем он имеет шанс начать двигаться. К счастью, QPropertyAnimator излучает сигнал, когда анимация завершена - метка под названием finished().

Хотелось бы просто быть в состоянии:

connect(animator, SIGNAL(finished()), someButton, SLOT(setText("Banana"))); 

Но так как вы не можете передать аргумент в слот, который не будет работать.

Как изменить текст после завершения анимации без создания различных «прокси» функций (слотов), чтобы сделать это без аргументов?

+2

Если вы используете C++ 11, вы могли бы добиться этого с лямбды. Здесь приведен пример: https://wiki.qt.io/New_Signal_Slot_Syntax#Connecting_in_Qt5 – MrEricSir

+2

Использование необходимо использовать lambdas C++ 11 или вспомогательные слоты, нет прямого способа привязать значения аргументов к вызову слота, когда вы пытаетесь , –

+0

Где бы я «положил» лямбду в приведенном выше примере - как бы я ее использовал? EDIT: Разве это не очень важная функциональность? Неужели люди все это делают намного лучше, чем я полностью теряю? – Quoi

ответ

0

Как уже другие сказали, вы должны использовать лямбда, в вашем случае,

connect(animator, &QPropertyAnimator::finished, [&]() 
    { 
     m_lineEdit->setText(QString("Banana")); 
    });