Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
|
aukolosov |
8.10.2010, 8:47
Сообщение
#1
|
|
Новичок Группа: Новичок Сообщений: 3 Регистрация: 8.10.2010 Пользователь №: 2095 Спасибо сказали: 0 раз(а) Репутация: 0
|
В программе на Qt 4.7.0 под Red Hat Enterprise Linux 5.5 понадобилось реализовать анимацию (вращающаяся картинка). Анимацию сделал в виде отдельного класса унаследованного от QWidget.
Сама анимация работает. Вот только туплю как затолкать ее в отдельный поток, чтобы она не мешала работе основной программы? Т.е. как сделать, чтобы объект класса унаследованного от QWidget работал в отдельном потоке? |
|
|
|
|
kwisp |
8.10.2010, 8:49
Сообщение
#2
|
|
астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23
|
aukolosov,
по-моему, весь гуи в основном потоке должен быть. - в смысле это одно из требований Qt. |
|
|
|
|
quarz |
9.10.2010, 13:12
Сообщение
#3
|
|
Студент ![]() Группа: Участник Сообщений: 49 Регистрация: 3.11.2009 Пользователь №: 1202 Спасибо сказали: 5 раз(а) Репутация: 0
|
aukolosov, сделай анимацию в *.gif и отображай в QLabel с помощью QMovie
|
|
|
|
|
Алексей1153 |
9.10.2010, 16:57
Сообщение
#4
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
aukolosov, у класса-виджета сделай метов void Tick();
и тикай его из любого потока с нужным интервалом Цитата(kwisp @ 8.10.2010, 11:49) Link aukolosov, по-моему, весь гуи в основном потоке должен быть. - в смысле это одно из требований Qt. что за глупое требование такое... Не верится |
|
|
|
|
igor_bogomolov |
9.10.2010, 17:45
Сообщение
#5
|
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29
|
Цитата(Алексей1153 @ 9.10.2010, 17:57) Link что за глупое требование такое... Не верится А придетсяЭто на самом деле так. Со всем что унаследовано от QWidget можно работать только в основном потоке. Перемещать виджеты между потоками нельзя, так же как и создавать их вне основного (gui) потока. Если как то нужно управлять виджетом из другого потока (например прогрессбаром), это делается через сигнал-слот взаимодействие (понятно что слот будет вызван в контексте основного (gui) потока). Поэтому, так как написал Алексей1153 делать нельзя. |
|
|
|
|
Алексей1153 |
9.10.2010, 18:06
Сообщение
#6
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
Цитата(igor_bogomolov @ 9.10.2010, 20:45) Link Поэтому, так как написал Алексей1153 делать нельзя. то есть, достаточно Tick() сделать слотом - и уже можно ? |
|
|
|
|
igor_bogomolov |
9.10.2010, 18:07
Сообщение
#7
|
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29
|
Цитата(Алексей1153 @ 9.10.2010, 19:06) Link то есть, достаточно Tick() сделать слотом - и уже можно ? Почти. Вызывать на прямую, как обычную функцию нельзя. Только через сигнал.
|
|
|
|
|
Алексей1153 |
9.10.2010, 18:55
Сообщение
#8
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
ну я и имел в виду через сигнал
Сообщение отредактировал Алексей1153 - 9.10.2010, 18:55 |
|
|
|
|
aukolosov |
21.10.2010, 14:05
Сообщение
#9
|
|
Новичок Группа: Новичок Сообщений: 3 Регистрация: 8.10.2010 Пользователь №: 2095 Спасибо сказали: 0 раз(а) Репутация: 0
|
В общем сделал как посоветовал Алексей1153.
Анимацию запихнул в один класс-наследник виджета и разместил его на форме. а таймер перерисовки в другой класс-наследник QThread и связал их через сигнал-слот. По сигналу с формы поток таймера начинает/прекращает слать сигналы на перерисовку, а в первом классе при поступлении сигнала на перерисовку отрабатывается следующее действие. Поигрался с несколькими потоками с разными приоритетами - вроде бы работает как должно быть. Спасибо всем ответившим. |
|
|
|
|
Алексей1153 |
21.10.2010, 14:11
Сообщение
#10
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
Цитата(aukolosov @ 21.10.2010, 17:05) Link Поигрался с несколькими потоками а зачем несколько потоков ? |
|
|
|
![]() ![]() ![]() |
|
Текстовая версия | Сейчас: 14.11.2025, 14:50 |