Я попытался запустить свое окно таким образом:
#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();
}
Но окно так и не стало видимым, я бы хотел, чтобы оно было инициализировано с эффектом затухания.
Каков правильный способ добиться этого?
@G.M. Я тестировал с opacity, продолжает то же самое.





Я вижу две проблемы. Во-первых, как изначально было написано, ваша основная функция будет закрыта сразу после открытия окна. Добавьте 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);
Извините, это была опечатка, я исправил. Окно по-прежнему не выполняет анимацию и не становится видимым.
Вы хотите изменить свойство виджета, поэтому я думаю, вам понадобится QPropertyAnimation(this, "windowOpacity"). Как написано, связи между анимацией и окном нет.
Работает ли анимация на вашей стороне?
У меня есть очень похожий на вас код, который работает. Однако, как указано в моем последнем комментарии, мой QPropertyAnimation напрямую анимирует свойство windowOpacity виджета. Я не использую QGraphicsOpacityEffect.
Дин, не мог бы ты привести пример? я не понимаю, какое свойство я должен использовать.
Я добавил больше информации в свой ответ, который должен немного прояснить ситуацию.
Когда я использую анимацию, окно не отображается в центре моего экрана, нужно ли мне пересчитывать положение XY, где оно будет отображаться?
QGraphicsOpacityEffectне имеет свойства с именем windowOpacity. Вы имели в видуopacityвместо этого?