Russian Qt Forum
Ноябрь 25, 2024, 00:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: рисование на виджите  (Прочитано 8636 раз)
olefard
Гость
« : Ноябрь 08, 2009, 14:40 »

Рисую на виджите в PainEven, необходимо изобразить динамическое перемещение точки по виджиту, у которой в цикле меняются координаты...Как это организовать..подскажите как использовать таймер или как сделать задержку в цикле, чтобы было видно как рисуется точка?Непонимающий
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Ноябрь 08, 2009, 14:59 »

* создай таймер - startTimer ( int interval )
* создай метод-обработчик события таймера - timerEvent(QTimerEvent *event)

При создании таймера, запоминай его ID.
В обработчике события удали таймер по его ID - void killTimer ( int id )
Далее делай то, что сейчас делаешь в теле цикла.
Затем в конце обработчика вызывай repaint() и заново создавай таймер

Подробности смотри int QObject::startTimer ( int interval )
« Последнее редактирование: Ноябрь 08, 2009, 15:01 от lit-uriy » Записан

Юра.
olefard
Гость
« Ответ #2 : Ноябрь 08, 2009, 16:27 »

а по подробнее можно, плиз???
где создавать таймер???
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Ноябрь 08, 2009, 18:18 »

>>где создавать таймер???
В своём виджете
Записан

Юра.
olefard
Гость
« Ответ #4 : Ноябрь 10, 2009, 08:38 »

А пример кода можно ...как использовать таймер в моем случае..никогда не доводилось работать с таймером просто
Записан
jasf
Гость
« Ответ #5 : Ноябрь 10, 2009, 10:48 »

- все действия производятся в наследнике класса QObject
Код:
int timerId = startTimer(delay);
переопределяем virtual void QObject::timerEvent( QTimerEvent* e )
{ // сюда управление будет попадать с частотой delay в миллисекундах
 if( needToStop ) {
  killTimer(timerId);
 }
}

НО после многолетнего опыта программирования, и исходя из того, что вам не приходилось до этого пользоваться таймерами, настоятельно рекомендую пожалеть себя и поберечь своё время, и не просиживать часы жизни на форумах в поисках решения самых базовых проблем, а приобрести какую-нибудь книгу по Qt и выделить неделю времени на её прочтение. При этом, если с первого раза тяжело пойдёт, её можно прочитать 2 раза! Улыбающийся или 3. тем самым, благодаря инвестиции нескольких недель времени, экономятся годы Улыбающийся (проверено)

Записан
olefard
Гость
« Ответ #6 : Ноябрь 10, 2009, 14:42 »

а как это сделать, не используя таймер???
Записан
SABROG
Гость
« Ответ #7 : Ноябрь 10, 2009, 15:48 »

а как это сделать, не используя таймер???

Используя *sleep + QApplication::processEvents.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Ноябрь 10, 2009, 16:24 »

а как это сделать, не используя таймер???
Лучше сделать "используя". Если есть tools которые для этого подходят/предназначены, то искать обходные пути - себе дороже. Тот же sleep - с ним всегда будут проблемы.
Записан
olefard
Гость
« Ответ #9 : Ноябрь 10, 2009, 16:27 »

 :)да еще бы знать как его использовать и проблем не будет Улыбающийся
Записан
jasf
Гость
« Ответ #10 : Ноябрь 10, 2009, 17:26 »

2olefard: да блин подробная работа с эвентами (включительно таймеров) описана в 6стой главе книги http://www.books.ru/shop/books/588549. А так же там описано всё остальное, что может пригодиться при разработке приложений под Qt.

P.S. надеюсь за прямую ссылку на чужой ресурс не получу бан..
« Последнее редактирование: Ноябрь 10, 2009, 17:28 от jasf » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Ноябрь 10, 2009, 18:04 »

:)да еще бы знать как его использовать и проблем не будет Улыбающийся
Ну вот Вы со своим другом взяли маленькую (0.5) и мучительно думаете: ну КАК же ее использовать?? Улыбающийся Да просто наливать и пить - то же и с таймерами.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #12 : Ноябрь 10, 2009, 18:08 »

>>Да просто наливать и пить - то же и с таймерами.
+1

(другими словами: напиши простейшую программу, пусть в консоль что-нибудь по таймеру печатает)
Записан

Юра.
olefard
Гость
« Ответ #13 : Ноябрь 10, 2009, 20:11 »

вот пытаюсь сделать рисование по таймеру
Код:
MyProb::MyProb(QWidget *parent)
    : QWidget(parent)
{
       myTimerId = startTimer(30);
    }

void MyProb::paintEvent(QPaintEvent * /* event */)
{
    QPainter painter(this);
    painter.setPen(QPen(Qt::red,1, Qt::DashLine));
    painter.drawLine(0, 0, 200, 200);
    painter.setPen(QPen(Qt::red,5, Qt::DashLine));


}

void MyProb::MyDraw()
{
QPainter painter(this);
int x;
while (x < 30) {
        painter.drawPoint(x, 20);
        ++x;}
    repaint();
}

void MyProb::timerEvent(QTimerEvent *event)
{
    killTimer(myTimerId);
    MyDraw();
   }

Где ошибка???
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #14 : Ноябрь 11, 2009, 04:14 »

Рисование возможно только в методе paintEvent, перенеси код из void MyProb::MyDraw() туда.
А в timerEvent вызывай repaint()
Записан

Юра.
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.214 секунд. Запросов: 22.