Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: milioran от Январь 27, 2010, 18:23



Название: Отображение диалога
Отправлено: milioran от Январь 27, 2010, 18:23
Есть такой код:
Код:
void SomeFunction()
{
     SomeDialog dlg;
     dlg.show();
     Sleep(3000);
}
(SomeDialog унаследован от QDialog, SomeFunction некая функция класса унаследованного от QMainWindow)
В windows (с виндовым Sleep) работает так: поверх главного окна отображается SomeDialog и через 3 секунды изчезает (собственно как и задумано).
При переносе того же кода в linux (с использованием sleep(3)), происходит следующее: задержка на 3 сек, после чего на мгновение появляется SomeDialog (т.е. успеть увидеть его трудно - отображение происходит непосредственно перед уничтожением объекта окна, ну или как то так)

А вопрос таков, каким образом реализовать поведение окон, чтобы хотя бы внешне выглядело как в случае c windows

полагаю что проблема не в qt, но навсякий случай qt 3.3.3


Название: Re: Отображение диалога
Отправлено: KADABRA от Январь 27, 2010, 19:47
А вопрос таков, каким образом реализовать поведение окон, чтобы хотя бы внешне выглядело как в случае c windows
Создать диалог в куче, запустить таймер на 3 секунды, вернуть управление в главный цикл, по событию таймера закрыть диалог.


Название: Re: Отображение диалога
Отправлено: zenden от Январь 27, 2010, 20:19
Не помню ни одной реальной задачи, где пришлось бы использовать sleep().  ???


Название: Re: Отображение диалога
Отправлено: SABROG от Январь 27, 2010, 20:24
Унаследуйся от SomeDialog, переопредели метод timerEvent() в конструкторе вызови startTimer() в методе timerEvent() вызывай close() или done().
---
Блин, вот я извращенец. Короче создавай простой QTimer::singleShot() и делай connect() на сигнал timeout() к слоту close() или done().

P.S.: а то я уже в QStateMachine полез  ;D


Название: Re: Отображение диалога
Отправлено: Авварон от Январь 27, 2010, 22:06
еще гениальный вариант - после show сделать QApplication::processEvents()


Название: Re: Отображение диалога
Отправлено: SABROG от Январь 28, 2010, 00:25
еще гениальный вариант - после show сделать QApplication::processEvents()

Достаточно exec() вызвать вместо show(). QApplication::processEvents() обработает всего-лишь доступные эвенты и пойдет дальше не дожидаясь завершения диалога, т.ч. скорее QEventLoop.