проблема с QPropertyAnimation в Qt - PullRequest
0 голосов
/ 17 мая 2010

У меня проблема с QPropertyAnimation в Qt

мой код:

QString my_text = "Hello Animation";
        ui->textBrowser->setText((quote_text));
        ui->textBrowser->show();
        QPropertyAnimation animation2(ui->textBrowser,"geometry");
        animation2.setDuration(1000);
        animation2.setStartValue(QRect(10,220/4,1,1));
        animation2.setEndValue(QRect(10,220,201,71));
        animation2.setEasingCurve(QEasingCurve::OutBounce);
        animation2.start();

до сих пор это кажется очень хорошим, но проблема в том, что я могу видеть эту анимацию только тогда, когда я показываю окно сообщения после нее.

        QMessageBox m;
        m.setGeometry(QRect(100,180,100,50));
        m.setText("close quote");
        m.show();
        m.exec();

когда я удаляю код этого окна сообщения, я больше не вижу анимацию. функциональность программы вообще не требует показа этого MessageBox. Кто-нибудь может помочь?

Ответы [ 3 ]

0 голосов
/ 18 мая 2010

Я предполагаю, что код для анимации, который вы представляете, находится внутри большей части кода, где элемент управления не возвращается к циклу событий (или цикл событий еще не начался). Это означает, что когда вызывается exec-функция MessageBox, цикл событий снова начинает работать и начинается анимация. Если бы вы отклонили окно сообщения в середине анимации, оно, вероятно, также зависло бы и в этот момент.

0 голосов
/ 08 марта 2019

animation2 объявлено как локальная переменная. Когда включающая функция выходит, он больше не находится в области видимости и удаляется. Анимация никогда не запускается как он не существует, когда Qt возвращается в цикл обработки событий и, как отмечено в QAbstractAnimation Документация (QPropertyAnimation наследует QAbstractAnimation), для выполнения QPropertyAnmiation он должен существовать, когда Qt возвращается в цикл обработки событий.

Когда элемент управления достигает цикла обработки событий, анимация запускается сама по себе, периодически вызывая updateCurrentTime () во время анимации.

Решение состоит в том, чтобы динамически распределять animation2, а не объявлять его как локальная переменная.

QPropertyAnimation *animation2 = new QPropertyAnimation(ui->textBrowser,"geometry");
animation2->setDuration(1000);
animation2->setStartValue(QRect(10,220/4,1,1));
animation2->setEndValue(QRect(10,220,201,71));
animation2->setEasingCurve(QEasingCurve::OutBounce);
animation2->start();

Обратите внимание, что это тот же метод, который используется в C ++ пример предоставлен в QPropertyAnmiation Документация

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

animation->start();

Оригинальные примечания к вопросу:

я могу видеть эту анимацию, только когда я показываю окно сообщения после нее

Это интересный побочный эффект работы QMessageBox. exec() Метод выполняет цикл обработки событий. Поскольку цикл событий выполняется в области видимости функции, включающей animation2, animation2, все еще существует, и желаемая анимация выполняется.

По умолчанию animation2 будет удалено, когда родитель, ui->textBrowser в оригинальный вопрос, удален. Если вы хотите, чтобы анимация была удаляется по завершении выполнения, QAbstractAnimation предоставляет свойство это контролирует, когда анимация удаляется. Чтобы автоматически удалить animation2 когда он завершит выполнение, измените метод start() на:

animation2->start(QAbstractAnimation::DeleteWhenStopped);
0 голосов
/ 17 мая 2010

Может быть, это проблема обновления.Не могли бы вы попытаться подключить сигнал valueChanged () QPropertyAnimation к вызову update () в графическом интерфейсе?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...