Здравствуйте, гость ( Вход | Регистрация )
BRE | Дата 27.2.2012, 20:52 |
Алексей1153, а в Qt нет чего-нибудь типа дельфийского Application.ProcessMessages ? Ну если я правильно понимаю, что делает Application.ProcessMessages в делфи, то в Qt есть несколько штатных средств для обработки скопившихся сообщений в очереди: QCoreApplication::processEvents(...) и QEventLoop::processEvents(...) |
|
Алексей1153 | Дата 27.2.2012, 19:47 |
Steklova Olga, это не дельфийское, это виндоапишное ) В таких случаях городится костыль - локальная петля обработки сообщений. Но костыль - он и есть костыль , лучше через поток ИМХО. В Qt я не заморачивался поиском такого подпинывателя, а сейчас глянул - нашёл только для перерисовки, для остальных сообщений не нашёл И - если сделать по-виндошному, то не будет кроссплатформенности |
|
Steklova Olga | Дата 27.2.2012, 18:36 |
Алексей1153, а в Qt нет чего-нибудь типа дельфийского Application.ProcessMessages ? | |
Алексей1153 | Дата 27.2.2012, 16:48 |
Ov3r1oad, тебе нужно запустить процесс сжатия в отдельном потоке, тогда диалог не перестанет реагировать на сообщения от системы |
|
Ov3r1oad | Дата 27.2.2012, 16:08 |
Steklova Olga, ilyabvt, В общем, есть вот большой класс, наследуемый от QDialog. В нём куча кнопок, виджетов и прочей требухи. Так же там есть функция, ну допустим, сжатия файлов. Она, эта функция, затратная по времени, и мне нужно, чтобы пользователь понимал, что вот идёт архивация, и приложение не зависло (как ему может показаться). Для этого я хочу, чтобы на ProgressBar шкала просто двигалась назад и вперед, пока идёт архивация. То он нажимает на кнопку "Архивация", в слоте для этой кнопки лежит вот эта функция архивации. Что мне нужно сделать, чтобы прогрессбар у меня обновлялся? | |
Steklova Olga | Дата 27.2.2012, 12:44 |
Ov3r1oad, смотрите код
если не хотите делать две кнопки, то смотрите код
Присоединяюсь к словам "Расскажи задачу" (конкретнее, про "затратный по времени код") (прежде чем думать о потоках) P.S. А сообщения запрещено Вам пока редактировать как новичку. |
|
ilyabvt | Дата 27.2.2012, 12:42 |
Ov3r1oad Конечно не заходит, ведь вы его остановили. Уберите функцию stop() из func() и поместите ее в update(). Цитата Тут видимо надо вызывать поток отдельный для этого таймера. Не надо! |
|
Ov3r1oad | Дата 27.2.2012, 11:26 |
ilyabvt, Так в функции update() и меняется ProgressBar =), а в этот update, собственно и не заходит вообще программа. Тут видимо надо вызывать поток отдельный для этого таймера. | |
ilyabvt | Дата 26.2.2012, 13:46 |
Ov3r1oad Функция stop() останавливает ваш таймер. Если вы ее вызываете сразу после start() то ваш таймер даже одного раза не успевает отработать. В функции func() нужно вызвать только start(). А stop() нужно вызвать только после того как ваш таймер выполнит то что ему полагается. В вашем случае это достижение ProgressBar уровня 100%. Значит вам следует либо в функции update() проверять уровень ProgressBar или извне вызвать функцию stop() когда уровень ProgressBar достигнет 100%. Цитата Получается, я должен вызвать start и stop в разных функциях? Да |
|
zloiia | Дата 26.2.2012, 0:00 |
А может пускай таймер постоянно квакает, но в слоте update() смотреть на какой-то внешний флаг активности, который поднимается в object::func() ? | |
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 25.4.2024, 20:36 |