Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
3 / 3 / 0
Регистрация: 17.12.2016
Сообщений: 20
1

Анимация закрытия QMainWidget

04.06.2017, 15:57. Показов 1678. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
=============================================================================
= Доброго времени суток, подскажите как реализвать анимацию закрытия окна QMainWidget? =
=============================================================================
Я понимаю что код мало кто любит смотреть, но без него не смогу объяснить свои попытки решить проблему, пожалуйста ознакомьтесь с ним, если у вас есть на это время.
Привожу минимальные куски кода, показывающие что попытался сделать я, а так же описание.

1. Есть некий класс AtmSplashScreen, унаследованный от QMainWidget, в нем по нажатию клавиши Enter или Return испускается сигнал EnterIsPressed():

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
class AtmSplashScreen : public QMainWindow {
  Q_OBJECT
 public:
  explicit AtmSplashScreen(QWidget* parent = nullptr);
  ~AtmSplashScreen();
 
 signals:
  void EnterIsPressed();
 
 protected:
  void keyPressEvent(QKeyEvent* event);
 
};
2. Есть некий класс WidgetHider, у него есть метод SetWidgetForHideAnimation(QWidget *widget), собственно он как бы обертка для QPropertyAnimation

задача класса:
- получить виджет, над которым будет совершаться анимация
- настроить свойства анимации (время, вид анимации)
- испустить сигнал, мол все, все сделал, виджет скрыт

Привожу .h file :

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class WidgetHider : public QObject {
  Q_OBJECT
 public:
  ~WidgetHider();
 
  void SetWidgetForHideAnimation(QWidget* widget);
 
 signals:
  void IsAlreadyHidden();
 
 public slots:
  void Hide();
 
 private:
  void SetStartHideValue(const QRect& start_value);
  void SetEndHideValue();
 
  QPropertyAnimation* hide_animation_ = nullptr;
};
Практически полная реализация, не считая #include файлов:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
WidgetHider::~WidgetHider() { delete hide_animation_; }
 
void WidgetHider::SetWidgetForHideAnimation(QWidget* widget) {
  if (hide_animation_ != nullptr) {
    delete hide_animation_;
  }
 
  hide_animation_ = new QPropertyAnimation(widget, "geometry");
  SetStartHideValue(widget->geometry());
  SetEndHideValue();
  hide_animation_->setDuration(5000);
  hide_animation_->setEasingCurve(QEasingCurve::Linear);
}
 
void WidgetHider::Hide() {
  hide_animation_->start();
  emit IsAlreadyHidden();
}
 
void WidgetHider::SetStartHideValue(const QRect& start_value) {
  hide_animation_->setStartValue(start_value);
}
 
void WidgetHider::SetEndHideValue() {
  int x = QApplication::desktop()->width() / 2;
  int y = QApplication::desktop()->height() / 2;
 
  hide_animation_->setEndValue(QRect(x, y, 0, 0));
}
3. И есть класс, который содержит в себе перечисленные выше 2 класса, а в конструкторе происходит connect этих 2 классов.

задача:
- запустить заставку ( т.е. класс унаследованный от QMainWidget)
- произвести настройку сигналов и слотов 2-ух классов. типа когда нажал клавишу, запустить анимацию закрытия.

Привожу только реализацию, класс небольшой:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <gui_mode.h>
 
#include <QObject>
 
gui::GuiMode::GuiMode() : splash_screen_(new AtmSplashScreen) {
  hider_.SetWidgetForHideAnimation(&splash_screen_);
  QObject::connect(&splash_screen_, SIGNAL(EnterIsPressed()), &hider_,
                   SLOT(Hide()));
  QObject::connect(&hider_, SIGNAL(IsAlreadyHidden()), &splash_screen_,
                   SLOT(close()));
}
 
void gui::GuiMode::RunInitialScreen() {
  SetSplashScreen();
  splash_screen_.show();
}
 
void gui::GuiMode::SetSplashScreen() {
  splash_screen_.SetCompanyName("North Star");
  splash_screen_.SetSplashScreenAppearance("#00FFFF", "#001933", "#009999");
  splash_screen_.SetAtmBlinkColor("#00FFFF", "#009999");
  splash_screen_.SetBackgroundColor();
}
Далее последний класс GuiMode вызывается в консоли и показывает унаследованный от QMainWIdget класс, но к сожалению результат не тот что мне нужен - класс унаследованный от QMainWidget просто закрывается по нажатию указанных клавиш Enter и Return. Мне же нужна плавная анимация закрытия.

Если я что-то не так написал, пожалуйста разъясните где я ошибся или чего не знаю и в какую сторону необходимо грести. Спасибо за внимание.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.06.2017, 15:57
Ответы с готовыми решениями:

Анимация закрытия фотки
Как реализовать такое закрытие фотки как в приложении вконтакте. Ну когда я смотрю свои фотки или...

Есть анимация Открытия и Закрытия панели, нужно что бы все это происходило по нажатию на саму панель
Вот код XAML &lt;Storyboard x:Key=&quot;Open&quot;&gt; &lt;DoubleAnimationUsingKeyFrames...

Закрытия первого окна формы без закрытия всей программы
Прошу помочь: в программе два окна, в начале открывается первое, после нажатия кнопки открывается...

Анимация в OpenGL, а где собсно, анимация?
// Bounce.cpp // Demonstrates a simple animated rectangle program with GLUT // OpenGL SuperBible,...

2
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
04.06.2017, 17:09 2
Лучший ответ Сообщение было отмечено Ordinary Mind как решение

Решение

void WidgetHider::Hide() {
hide_animation_->start();
emit IsAlreadyHidden();
}
Вероятно, тут нужен таймер типа следующего:

C++ (Qt)
1
2
3
4
5
6
7
void WidgetHider::AnimationTimeout() {
  emit IsAlreadyHidden();
}
void WidgetHider::Hide() {
  hide_animation_->start();
  QTimer::singleShot(1000, this, SLOT(AnimationTimeout()));
}
1
3 / 3 / 0
Регистрация: 17.12.2016
Сообщений: 20
04.06.2017, 17:36  [ТС] 3
Спасибо большое за ответ. Куча косяков было исправлено и ваш код был использован. Все заработало. Спасибо.
0
04.06.2017, 17:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.06.2017, 17:36
Помогаю со студенческими работами здесь

Подтверждение закрытия
почему при закрытии формы order требуется несколько раз нажать &quot;Да&quot; и как это исправить на одно...

Закрытия MessageBox
Добрый день как программно можно закрыть окно MessageBox без нажатия кнопки OK

Закрытия подключения к бд
Добрый вечер! Изучаю ООП и вот столкнулся с пробелом в моих познаниях, открыл соединение и не...

Дата закрытия
Прошу помощи, в базе &quot;банковские вклады&quot; существуют несколько типов вкладов, которые хранятся...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru