Почему окно не всплывает?

У меня есть следующий исходный код:

    Processmethod()
{

    QDialog *ProcessMessage = new QDialog;      
    Ui::DialogProcessMessage Dialog;            
    Dialog.setupUi(ProcessMessage);             
    ProcessMessage->setModal(true);
    ProcessMessage->setAttribute(Qt::WA_DeleteOnClose); 
    ProcessMessage->show();



    PROCESSES START                     
}

После того, как я хочу показать QDialog «ProcessMessage», есть три процесса QProcess, включенные в три разных следующих метода. Если я отключу эти методы с помощью //, всплывающее окно появится просто отлично, но если я включу методы, процессы будут работать нормально, но всплывающее окно не появится. Любые идеи/решения? Привет


person Streight    schedule 21.03.2012    source источник
comment
Кажется, что ошибка в Ui::DialogProcessMessage. Там можно заглянуть?   -  person salomon    schedule 21.03.2012
comment
Вы вызываете setModal(true) в диалоговом окне, все еще вызывая show(). Вы пытались использовать exec() вместо show()?   -  person Patrick    schedule 21.03.2012
comment
когда я использую exec(), появляется окно, но процессы не запускаются, пока я не закрою окно. Но мое намерение состоит в том, чтобы увидеть окно с запущенными процессами.   -  person Streight    schedule 21.03.2012
comment
возможный дубликат окна не появляется раньше запуск процесса -› попробовал метод sleep(), но не удалось   -  person mechanical_meat    schedule 28.03.2012


Ответы (2)


Ваше окно не отображается до тех пор, пока метод Process не будет возвращен, потому что основной цикл приложения реализован в основной функции

int main(int argc, char *argv[])
{
        QApplication a(argc, argv);
        QDialog w; // or other window
        w.show();
        return a.exec(); // main app loop (all drawing procedures called from here
}

Поэтому, если вы вызовете свой PROCESSES START, ничего не произойдет, пока метод Process не вернется в QApplication::exec()

Вы можете запускать свои процессы в отдельном потоке и отправлять уведомления о прогрессе в свой диалог, реализуя сигналы\слоты в режиме очереди.

person Вадим Сущенко    schedule 21.03.2012
comment
Нет ли способа, чтобы диалоговое окно всплывало (оставаясь поверх главного окна) и просто позволяло ему зависать в главном окне? - person Streight; 21.03.2012
comment
Попробуйте вызвать статическую функцию QApplication::processEvents() перед запуском долгого процесса, в этом случае вы увидите свой диалог, но приложение зависнет до тех пор, пока не вернется Processmetod(). Если вы не хотите создавать отдельный поток, вы должны время от времени вызывать QApplication::processEvents() в своем длинном процессе после изменения состояния вашего диалога (обновите состояние выполнения, а затем вызовите QApplication::processEvents(), чтобы отобразить его на дисплее ) - person Вадим Сущенко; 21.03.2012
comment
Хорошо, я попробовал это сейчас, и окно также появляется, но текст окон (диалогов) отсутствует!?! Другая идея: нельзя ли выполнить цикл do, пока метод не достиг конца или пока метод не вернул int? Так что я мог бы просто скопировать диалоговое окно в этот цикл - это просто идея, и я не уверен, что это возможно. - person Streight; 22.03.2012

Диалоговое окно не может быть показано, пока выполнение вашего кода не завершит работу ProcessMethod(). Если вы используете QProcesses синхронно (вызывая любой из методов waitForXXX), это вызовет проблему, которую вы видите. Все остальное, что удерживает основной поток, также вызовет эту проблему.

person Arnold Spence    schedule 21.03.2012
comment
Да, я использую QProcess::waitForFinished(int) в своих процессах. - person Streight; 21.03.2012