Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2019, 01:03   #1
TSwallow
Пользователь
 
Регистрация: 13.11.2018
Сообщений: 29
Вопрос QPropertyAnimation

Сделал анимацию отображения и закрытия для виджета. При открытии все отлично работает, но когда закрываю анимация не проигрывается, но убрав hide все будет работать нормально. Очень странно приоритет работает. Как можно пофиксить?
Код:
void MainWindow::on_Settings_clicked() // Слот для отображения/скрытия меню настроек
{
    QPropertyAnimation * animation = new QPropertyAnimation(ui->pnlSettings, "geometry" );
    if(ui->pnlSettings->isVisible()) // Если открыт то закрываем, иначе отображаем
    {
        animation->setDuration(300);
        animation->setStartValue(QRect(ui->Settings->x()+16, ui->Settings->y()+76,  280, ui->pnlChat->geometry().size().height()));
        animation->setEndValue(QRect(ui->Settings->x()+50, ui->Settings->y()+20, 0 , 0 ));
        animation->start();

        ui->pnlSettings->hide(); // если убрать то заработает
    }
    else
    {
        ui->pnlSettings->show();

        animation->setDuration(300);
        animation->setStartValue(QRect(ui->Settings->x()+50, ui->Settings->y()+20, 0, 0));
        animation->setEndValue(QRect(ui->Settings->x()+16, ui->Settings->y()+76, 280 , ui->pnlChat->geometry().size().height()));

        animation->start ();
    }
}
TSwallow вне форума Ответить с цитированием
Старый 09.11.2019, 04:44   #2
TSwallow
Пользователь
 
Регистрация: 13.11.2018
Сообщений: 29
По умолчанию

Сделал ;З. Просто отказался от hide и show)
TSwallow вне форума Ответить с цитированием
Старый 09.11.2019, 07:40   #3
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 947
По умолчанию

TSwallow, когда порядок инструкций такой

Код:
//начали анимацию
animation->start();

<в этой строке нет обработки сообщений!>

//скрыли виджет. Анимацию не будет видно
ui->pnlSettings->hide();
то сразу после start ты скрываешь виджет. Это ты и наблюдаешь. Hide не нужно вызывать в том месте, его нужно вызвать по окончанию анимации

последовательность нужна такая
Код:
//начали анимацию
animation->start();

<тут нужна обработка сообщений, показывающих анимацию>

//по окончанию анимации скрыли виджет
ui->pnlSettings->hide();
как этого добиться?

Вариант 1 (сложный). Это можно сделать не выходя из MainWindow:: on_Settings_clicked () при помощи QEventLoop. После запуска анимации в цикле вызываем обработку сообщений в течение времени, достаточного для проигрывания анимации (либо по ещё какому-то определённому признаку). Затем скрываем виджет и выходим из цикла.

Вариант 2 (простой). Сигнал анимации finished() соединить с hide() виджета (это при условии, что анимация действительно закончится, ведь из-за какой-то ошибки в логике этого может и не быть)

Вариант 3 (простой). Статическая функция QTimer::singleShot - на время, необходимое для отыгрывания анимации. Соединить со слотом hide виджета. Цикл не нужен - вызвали и забыли

-----------
ещё обрати внимание на удаление анимации. Если создаёшь динамически, то в start лучше указать QAbstractAnimation:: DeleteWhenStopped, иначе каждую анимацию будет утечка

Последний раз редактировалось Алексей1153; 09.11.2019 в 07:46.
Алексей1153 вне форума Ответить с цитированием
Старый 09.11.2019, 09:53   #4
TSwallow
Пользователь
 
Регистрация: 13.11.2018
Сообщений: 29
По умолчанию

Спасибо за информацию)
TSwallow вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск