Russian Qt Forum
Ноябрь 27, 2024, 01:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Куда поместить код, чтобы он выполнился сразу после qApp->exec()  (Прочитано 6657 раз)
UVV
Гость
« : Сентябрь 24, 2010, 17:31 »

Привет.
Мне нужно показать диалог сразу после qApp->exec(), в котором будет возможность просто выйти из приложения.
Где правильнее разместить этот диалог?
Записан
Sancho_s_rancho
Гость
« Ответ #1 : Сентябрь 24, 2010, 18:11 »

Так в main.cpp вместо QMainWindow вставь класс диалога. Скажи ему show и делай qApp->exec()
Записан
UVV
Гость
« Ответ #2 : Сентябрь 24, 2010, 18:19 »

Так в main.cpp вместо QMainWindow вставь класс диалога. Скажи ему show и делай qApp->exec()

Не пойдёт.
1. MainWindow тоже отображается
2. Хотел разместить его в main.cpp, но у MainWindow должна быть возможность закрыть диалог.
Записан
EhTemka
Гость
« Ответ #3 : Сентябрь 24, 2010, 18:38 »

Возможность закрыть диалог должна быть у пользователя, имхо Подмигивающий

размести этот диалог в MainWindow. И по какому нибудь событию (например closeEvent, или нажатие кнопки(пункта меню) Exit), вызывай у диалога exec() и проверяй результат. Можно воспользоваться стандартным диалогом вопроса StandardButton QMessageBox::question(...)

Сорри не внимательно читал. в твоем случаи можно вызвать диалог в MainWindow::showEvent(...)
« Последнее редактирование: Сентябрь 24, 2010, 18:42 от EhTemka » Записан
UVV
Гость
« Ответ #4 : Сентябрь 24, 2010, 18:47 »

Сорри не внимательно читал. в твоем случаи можно вызвать диалог в MainWindow::showEvent(...)

Насчёт showEvent() тоже думал.. Тогда получается нужно проверять, первый ли это showEvent() или нет.
Это нормальная практика или есть другие решения?
Записан
EhTemka
Гость
« Ответ #5 : Сентябрь 24, 2010, 18:52 »

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

Но чтобы было понятней что надо, поясни этот момент
Цитировать
но у MainWindow должна быть возможность закрыть диалог
Записан
UVV
Гость
« Ответ #6 : Сентябрь 24, 2010, 18:59 »

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

Но чтобы было понятней что надо, поясни этот момент
Цитировать
но у MainWindow должна быть возможность закрыть диалог


Закрыть по сигналу.
Пробую сейчас вариант с showEvent()...
Записан
UVV
Гость
« Ответ #7 : Сентябрь 24, 2010, 19:11 »

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

Таки вариант с конструктором помог, спасибо =)
Записан
Denjs
Гость
« Ответ #8 : Сентябрь 24, 2010, 21:50 »

Я обычно делаю специальный класс signal_sender - у которого есть собственный спец-сигнал, который испускаю при вызове спец-определенного метода. Данный сигнал я перед этим подключаю внутри main() типом соединения Qt::QueuedConnection к классу, который проводит "инициацию приложения и вообще".

Т.к. до того как вы сделаете qApp->exec() цикла событий у нас нет - то и сигнал через Qt::QueuedConnection нифига не будет доставлен.
Но как только мы запускаем qApp - сигнал доставляется и все ок.

Это решение имхо лучше, чем завязываться на графические окошки, потому что у меня напримре может и не быть графических окон в приложении.

я никого не запутал? )))))))))))
« Последнее редактирование: Сентябрь 24, 2010, 21:53 от Denjs » Записан
GraninAS
Гость
« Ответ #9 : Сентябрь 28, 2010, 10:17 »

Привет.
Мне нужно показать диалог сразу после qApp->exec(), в котором будет возможность просто выйти из приложения.
Где правильнее разместить этот диалог?

А какова задача? Может быть, все проще, чем кажется.

Например, в одном моем приложении при запуске программы пользователю показывается диалог подключения к БД, и ничего больше. Если пользователь нажал на "Отмену", тут программа и закрывалась. Если же логинился, ему открывалось главное окно. Оттуда можно еще раз вызвать тот же диалог подключения, чтобы переподключиться. Не составляет труда для диалога создать кнопку, которая бы закрывала программу, и проверять в главном окне, что нажата именно она. Ситуация похожа?
Записан
SASA
Гость
« Ответ #10 : Сентябрь 28, 2010, 16:12 »

А какова задача? Может быть, все проще, чем кажется.

Вот мне тоже так кажется  Подмигивающий
Записан
UVV
Гость
« Ответ #11 : Сентябрь 29, 2010, 08:45 »

А какова задача? Может быть, все проще, чем кажется.

Например, в одном моем приложении при запуске программы пользователю показывается диалог подключения к БД, и ничего больше. Если пользователь нажал на "Отмену", тут программа и закрывалась. Если же логинился, ему открывалось главное окно. Оттуда можно еще раз вызвать тот же диалог подключения, чтобы переподключиться. Не составляет труда для диалога создать кнопку, которая бы закрывала программу, и проверять в главном окне, что нажата именно она. Ситуация похожа?

Что-то типа того...
Записан
GraninAS
Гость
« Ответ #12 : Сентябрь 29, 2010, 08:55 »

Что-то типа того...

Ну тогда вот примерная схема.

Код:
// main.cpp
int main (int argc, char *argv[])
{
    QApplicaiton a(argc, argv);;

    Dialog dlg;
    // Скрывает от пользователя кнопку "Закрыть". По логике ее заменяет сейчас кнопка "Cancel".
    dlg.hideCloseButton();
    if (dlg.exec() == QDialog::Rejected)
    {
        return 0;
    }
   
   
    MainWindow w;
    w.show();
   
    return a.exec();
}


// mainwindow.cpp
void func()
{
    Dialog dlg;
    // Показывает пользователю кнопку "закрыть", поскольку "Cancel" сейчас значит другое.
    dlg.showCloseButton();
    if (dlg.exec() == QDialog::Rejected)
    {
        if (dlg.isCloseButtonPressed())
        {
            this->close();
        }
    }
}

Надеюсь, догадаетесь, что должно быть прописано и продизайнено в вашем диалоге?
Записан
whirlwind
Гость
« Ответ #13 : Сентябрь 29, 2010, 15:55 »

Denjs правильно написал.
Т.е. вам нужен класс со слотом, который будет запускать ваше приложение (делать show() нужному виджету)ю
И еще таймер, singleshot с нулевой задержкой.

Работать оно должно так:
- создали запускающий обьект запускающего класса
- создали таймер
- соединили запускающий обьект  с таймером
- запустили таймер
- app->exec()
Записан
UVV
Гость
« Ответ #14 : Сентябрь 29, 2010, 16:29 »

Denjs правильно написал.
Т.е. вам нужен класс со слотом, который будет запускать ваше приложение (делать show() нужному виджету)ю
И еще таймер, singleshot с нулевой задержкой.

Работать оно должно так:
- создали запускающий обьект запускающего класса
- создали таймер
- соединили запускающий обьект  с таймером
- запустили таймер
- app->exec()


OK, спасибо. Буду работать.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.096 секунд. Запросов: 21.