Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: UVV от Сентябрь 24, 2010, 17:31



Название: Куда поместить код, чтобы он выполнился сразу после qApp->exec()
Отправлено: UVV от Сентябрь 24, 2010, 17:31
Привет.
Мне нужно показать диалог сразу после qApp->exec(), в котором будет возможность просто выйти из приложения.
Где правильнее разместить этот диалог?


Название: Re: Куда поместить код, чтобы он выполнился сразу после qApp->exec()
Отправлено: Sancho_s_rancho от Сентябрь 24, 2010, 18:11
Так в main.cpp вместо QMainWindow вставь класс диалога. Скажи ему show и делай qApp->exec()


Название: Re: Куда поместить код, чтобы он выполнился сразу после qApp->exec()
Отправлено: UVV от Сентябрь 24, 2010, 18:19
Так в main.cpp вместо QMainWindow вставь класс диалога. Скажи ему show и делай qApp->exec()

Не пойдёт.
1. MainWindow тоже отображается
2. Хотел разместить его в main.cpp, но у MainWindow должна быть возможность закрыть диалог.


Название: Re: Куда поместить код, чтобы он выполнился сразу после qApp->exec()
Отправлено: EhTemka от Сентябрь 24, 2010, 18:38
Возможность закрыть диалог должна быть у пользователя, имхо ;)

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

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


Название: Re: Куда поместить код, чтобы он выполнился сразу после qApp->exec()
Отправлено: UVV от Сентябрь 24, 2010, 18:47
Сорри не внимательно читал. в твоем случаи можно вызвать диалог в MainWindow::showEvent(...)

Насчёт showEvent() тоже думал.. Тогда получается нужно проверять, первый ли это showEvent() или нет.
Это нормальная практика или есть другие решения?


Название: Re: Куда поместить код, чтобы он выполнился сразу после qApp->exec()
Отправлено: EhTemka от Сентябрь 24, 2010, 18:52
можно создавать диалог в конструкторе, а после вызова его удалять и обнулять указатель...

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


Название: Re: Куда поместить код, чтобы он выполнился сразу после qApp->exec()
Отправлено: UVV от Сентябрь 24, 2010, 18:59
можно создавать диалог в конструкторе, а после вызова его удалять и обнулять указатель...

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


Закрыть по сигналу.
Пробую сейчас вариант с showEvent()...


Название: Re: Куда поместить код, чтобы он выполнился сразу после qApp->exec()
Отправлено: UVV от Сентябрь 24, 2010, 19:11
можно создавать диалог в конструкторе, а после вызова его удалять и обнулять указатель...

Таки вариант с конструктором помог, спасибо =)


Название: Re: Куда поместить код, чтобы он выполнился сразу после qApp->exec()
Отправлено: Denjs от Сентябрь 24, 2010, 21:50
Я обычно делаю специальный класс signal_sender - у которого есть собственный спец-сигнал, который испускаю при вызове спец-определенного метода. Данный сигнал я перед этим подключаю внутри main() типом соединения Qt::QueuedConnection к классу, который проводит "инициацию приложения и вообще".

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

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

я никого не запутал? )))))))))))


Название: Re: Куда поместить код, чтобы он выполнился сразу после qApp->exec()
Отправлено: GraninAS от Сентябрь 28, 2010, 10:17
Привет.
Мне нужно показать диалог сразу после qApp->exec(), в котором будет возможность просто выйти из приложения.
Где правильнее разместить этот диалог?

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

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


Название: Re: Куда поместить код, чтобы он выполнился сразу после qApp->exec()
Отправлено: SASA от Сентябрь 28, 2010, 16:12
А какова задача? Может быть, все проще, чем кажется.

Вот мне тоже так кажется  ;)


Название: Re: Куда поместить код, чтобы он выполнился сразу после qApp->exec()
Отправлено: UVV от Сентябрь 29, 2010, 08:45
А какова задача? Может быть, все проще, чем кажется.

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

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


Название: Re: Куда поместить код, чтобы он выполнился сразу после qApp->exec()
Отправлено: GraninAS от Сентябрь 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();
        }
    }
}

Надеюсь, догадаетесь, что должно быть прописано и продизайнено в вашем диалоге?


Название: Re: Куда поместить код, чтобы он выполнился сразу после qApp->exec()
Отправлено: whirlwind от Сентябрь 29, 2010, 15:55
Denjs правильно написал.
Т.е. вам нужен класс со слотом, который будет запускать ваше приложение (делать show() нужному виджету)ю
И еще таймер, singleshot с нулевой задержкой.

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


Название: Re: Куда поместить код, чтобы он выполнился сразу после qApp->exec()
Отправлено: UVV от Сентябрь 29, 2010, 16:29
Denjs правильно написал.
Т.е. вам нужен класс со слотом, который будет запускать ваше приложение (делать show() нужному виджету)ю
И еще таймер, singleshot с нулевой задержкой.

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


OK, спасибо. Буду работать.


Название: Re: Куда поместить код, чтобы он выполнился сразу после qApp->exec()
Отправлено: panAlexey от Сентябрь 29, 2010, 21:43
Привет.
Мне нужно показать диалог сразу после qApp->exec(), в котором будет возможность просто выйти из приложения.
Где правильнее разместить этот диалог?
Код:
int main(int argc, char *argv[])
{
    uoStartUpSet* startOpt = uoStartUpSet::instance();
    if (startOpt) {
    startOpt->writeToLog("unNStudio start");
        bool res = startOpt->parseCmdLine(argc, argv);
        if (!res) {
            startOpt->writeToLog("unNStudio end<< missing startup.....");
return(0);
        }
    } else {
        return(0);
    }
    InitCodecs();
    Q_INIT_RESOURCE(unNStudio);
    Q_INIT_RESOURCE(unNStudioCnf);
    uoStudioApp app(argc, argv);
    if (startOpt->isUnknownMode()) {
uoGUI::uoStartupDlgImpl* startDlg = new uoGUI::uoStartupDlgImpl();
startDlg->setModal(true);
if (QDialog::Accepted == startDlg->exec()) {
startOpt->setStartupMode(startDlg->getStartupMode());
startOpt->setDbPath(startDlg->getDbPath());
startOpt->setDbName(startDlg->getDbName());
} else {
return(1);
}
    }
    if (startOpt->isConfigMode()) {
if (!startOpt->makeTempMetaData())
return(0);
uoConfigMainWnd mainWin;
mainWin.show();
return app.exec();
    }
return(0);
}