Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > [QT4] событие начала выполнения приложения


Автор: JackYF 1.10.2007, 22:01
Суть задачи: у меня есть созданное окно. Наследник QWidget'a.

Окончанию функции main() стандартное:

Код

mainWindow.show();                                                                                                                                                             
return app.exec();   


Но при запуске приложения мне нужно, чтобы окно само по себе, не дожидаясь никаких действий пользователя, медленно изменило свою прозрачность в сторону 0. Функцию я написал, но как ее вызвать автоматически в начале работы приложения? Ведь насколько я понял, эта функция должна выполняться уже после старта приложения...

Официальные доки на мысли не навели, а гуглу проблему сформулировать не смог.

Добавлено через 1 минуту и 19 секунд
Сигналов типа "началось", "создалось" у QApplication, QCoreApplication, QWidget не нашёл...

Автор: archimed7592 1.10.2007, 22:13
К примеру так:
Код

mainWindow.show();                                                                                                                                                             
mainWindow.foo();
return app.exec(); 

// ....
MainWindow::foo()
{
    while (...)
    {
        QApplication::processEvents();
        // ...
    }
}  

Автор: JackYF 1.10.2007, 22:30
archimed7592, гм... не понял задумки.
У меня есть следующее:

Код

#include <QApplication>                                                                                                                                                            
#include <QWidget>                                                                                                                                                                 
#include <QString>                                                                                                                                                                 
                                                                                                                                                                                   
#include <iostream>                                                                                                                                                                
                                                                                                                                                                                   
const unsigned long opacityDelay = 100*1000;                                                                                                                                       
const qreal opacityStep = 0.01f;                                                                                                                                                   
                                                                                                                                                                                   
class OpaqueWidget: public QWidget                                                                                                                                                 
{                                                                                                                                                                                  
 public:                                                                                                                                                                           
    OpaqueWidget(QWidget* parent = NULL)                                                                                                                                           
    {                                                                                                                                                                              
        this->setWindowOpacity(0.0f);                                                                                                                                              
    }                                                                                                                                                                              
                                                                                                                                                                                   
    void beVisible(bool visible)                                                                                                                                                   
    {                                                                                                                                                                              
        qreal currentOpacity = 0.0f;                                                                                                                                               
        while (currentOpacity < 0.98f)                                                                                                                                             
        {                                                                                                                                                                          
            this->setWindowOpacity(visible ? currentOpacity : (1.0f - currentOpacity));                                                                                            
            currentOpacity += opacityStep;                                                                                                                                         
            usleep(opacityDelay);                                                                                                                                                  
            this->repaint();                                                                                                                                                       
        }                                                                                                                                                                          
    }                                                                                                                                                                              
};

int main(int argc, char* argv[])                                                                                                                                                   
{                                                                                                                                                                                  
    // creating the main window                                                                                                                                                    
    QApplication app(argc, argv);                                                                                                                                                  
    OpaqueWidget mainWindow;                                                                                                                                                       
                                                                                                                                                                                   
    mainWindow.show();                                                                                                                                                             
    mainWindow.beVisible(true);                                                                                                                                                    
    //mainWindow.beVisible(false);                                                                                                                                                 
                                                                                                                                                                                   
    return app.exec();                                                                                                                                                             
}                                          


Что и куда вписать?

Автор: archimed7592 1.10.2007, 22:46
Цитата(JackYF @  1.10.2007,  22:30 Найти цитируемый пост)
У меня есть следующее:

JackYF, а ты пробовал этот метод на нажатие кнопки повесить? Работает? Сомневаюсь smile.

Цитата(JackYF @  1.10.2007,  22:30 Найти цитируемый пост)
Что и куда вписать? 

Код

    void beVisible(bool visible)                                                                                                                                                   
    {                                                                                                                                                                              
        qreal currentOpacity = 0.0f;                                                                                                                                               
        while (currentOpacity < 0.98f)                                                                                                                                             
        {
            QApplication::processEvents();            
            this->setWindowOpacity(visible ? currentOpacity : (1.0f - currentOpacity));                                                                                            
            currentOpacity += opacityStep;                                                                                                                                         
            usleep(opacityDelay);                                                                                                                                                  
            this->repaint();                                                                                                                                                       
        }                                                                                                                                                                          
    }    

Автор: JackYF 1.10.2007, 22:59
archimed7592, уже спасибо. Судя по дебаговым меткам, оно таки начало выполняться после начала.
Но ты прав, это не работает - окно остается непрозрачным. Я еще что-то напутал?

Автор: archimed7592 1.10.2007, 23:07
Уже незачто smile.
Цитата(JackYF @  1.10.2007,  22:59 Найти цитируемый пост)
Но ты прав, это не работает - окно остается непрозрачным. Я еще что-то напутал? 

Не знаю smile. Вот это работает как часы:

Код

#include <QApplication>
#include <QWidget>
#include <QString>

#include <iostream>

const qreal opacityStep = 0.01f;

class OpaqueWidget: public QWidget
{
public:
    OpaqueWidget(QWidget* parent = NULL)
    {
        this->setWindowOpacity(0.0f);
    }

    void beVisible(bool visible)
    {
        qreal currentOpacity = 0.0f;
        while (currentOpacity < 0.98f)
        {
            QApplication::processEvents();
            this->setWindowOpacity(visible ? currentOpacity : (1.0f - currentOpacity));
            currentOpacity += opacityStep;
            this->update();
        }
    }
};
int main(int argc, char* argv[])
{
    // creating the main window
    QApplication app(argc, argv);
    OpaqueWidget mainWindow;

    mainWindow.show();
    mainWindow.beVisible(true);
    //mainWindow.beVisible(false);

    return app.exec();
}

Автор: JackYF 1.10.2007, 23:18
Цитата(archimed7592 @  1.10.2007,  23:07 Найти цитируемый пост)
Вот это работает как часы

то есть прозрачность изменяется? у меня нет... менеджер xfce4 вроде бы поддерживает условия, которые были сказаны в доках по QT для обеспечения прозрачности, насколько я нагуглил.

Ладно, буду разбираться. На основной вопрос ответ получен, спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)