Как запустить QMainWindow с замирающей анимацией?

Я попытался запустить свое окно таким образом:

#include "stdafx.h"
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

    setWindowOpacity(0);

    QGraphicsOpacityEffect* eff = new QGraphicsOpacityEffect(this);

    QPropertyAnimation* ani = new QPropertyAnimation(eff, "windowOpacity");
    ani->setDuration(3000);
    ani->setStartValue(0);
    ani->setEndValue(1);
    ani->setEasingCurve(QEasingCurve::OutBack);
    ani->start(QPropertyAnimation::DeleteWhenStopped);
}


#include "mainwindow.h"

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

    MainWindow w;
    w.show();
    return a.exec();
}

Но окно так и не стало видимым, я бы хотел, чтобы оно было инициализировано с эффектом затухания.

Каков правильный способ добиться этого?

QGraphicsOpacityEffect не имеет свойства с именем windowOpacity. Вы имели в виду opacity вместо этого?
G.M. 30.11.2022 16:09

@G.M. Я тестировал с opacity, продолжает то же самое.

Daniela 30.11.2022 16:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я вижу две проблемы. Во-первых, как изначально было написано, ваша основная функция будет закрыта сразу после открытия окна. Добавьте return a.exec(); в конце main.

Далее вы анимируете QGraphicsOpacityEffect. Как написано, ваш пример кода не имеет связи между QGraphicsOpacityEffect и окном. Ваша анимация анимирует свойство класса эффекта, но не распространяется обратно на виджет. Нет необходимости использовать QGraphicsOpacityEffect. Вместо этого просто анимируйте виджет напрямую:

    ui.setupUi(this);

    setWindowOpacity(0);

    // Notice that the first argument passed in is 'this' - the widget.
    // the widget is what you want to animate.
    QPropertyAnimation* ani = new QPropertyAnimation(this, "windowOpacity");
    ani->setDuration(3000);
    ani->setStartValue(0);
    ani->setEndValue(1);
    ani->setEasingCurve(QEasingCurve::OutBack);
    ani->start(QPropertyAnimation::DeleteWhenStopped);

Извините, это была опечатка, я исправил. Окно по-прежнему не выполняет анимацию и не становится видимым.

Daniela 30.11.2022 15:50

Вы хотите изменить свойство виджета, поэтому я думаю, вам понадобится QPropertyAnimation(this, "windowOpacity"). Как написано, связи между анимацией и окном нет.

Dean Johnson 30.11.2022 17:18

Работает ли анимация на вашей стороне?

Daniela 30.11.2022 17:24

У меня есть очень похожий на вас код, который работает. Однако, как указано в моем последнем комментарии, мой QPropertyAnimation напрямую анимирует свойство windowOpacity виджета. Я не использую QGraphicsOpacityEffect.

Dean Johnson 30.11.2022 17:34

Дин, не мог бы ты привести пример? я не понимаю, какое свойство я должен использовать.

Daniela 30.11.2022 17:38

Я добавил больше информации в свой ответ, который должен немного прояснить ситуацию.

Dean Johnson 30.11.2022 17:51

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

Daniela 30.11.2022 18:26

Другие вопросы по теме