Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: olefard от Ноябрь 08, 2009, 14:40



Название: рисование на виджите
Отправлено: olefard от Ноябрь 08, 2009, 14:40
Рисую на виджите в PainEven, необходимо изобразить динамическое перемещение точки по виджиту, у которой в цикле меняются координаты...Как это организовать..подскажите как использовать таймер или как сделать задержку в цикле, чтобы было видно как рисуется точка????


Название: Re: рисование на виджите
Отправлено: lit-uriy от Ноябрь 08, 2009, 14:59
* создай таймер - startTimer ( int interval )
* создай метод-обработчик события таймера - timerEvent(QTimerEvent *event)

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

Подробности смотри int QObject::startTimer ( int interval )


Название: Re: рисование на виджите
Отправлено: olefard от Ноябрь 08, 2009, 16:27
а по подробнее можно, плиз???
где создавать таймер???


Название: Re: рисование на виджите
Отправлено: lit-uriy от Ноябрь 08, 2009, 18:18
>>где создавать таймер???
В своём виджете


Название: Re: рисование на виджите
Отправлено: olefard от Ноябрь 10, 2009, 08:38
А пример кода можно ...как использовать таймер в моем случае..никогда не доводилось работать с таймером просто


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

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



Название: Re: рисование на виджите
Отправлено: olefard от Ноябрь 10, 2009, 14:42
а как это сделать, не используя таймер???


Название: Re: рисование на виджите
Отправлено: SABROG от Ноябрь 10, 2009, 15:48
а как это сделать, не используя таймер???

Используя *sleep + QApplication::processEvents.


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


Название: Re: рисование на виджите
Отправлено: olefard от Ноябрь 10, 2009, 16:27
 :)да еще бы знать как его использовать и проблем не будет :)


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

P.S. надеюсь за прямую ссылку на чужой ресурс не получу бан..


Название: Re: рисование на виджите
Отправлено: Igors от Ноябрь 10, 2009, 18:04
:)да еще бы знать как его использовать и проблем не будет :)
Ну вот Вы со своим другом взяли маленькую (0.5) и мучительно думаете: ну КАК же ее использовать?? :) Да просто наливать и пить - то же и с таймерами.


Название: Re: рисование на виджите
Отправлено: lit-uriy от Ноябрь 10, 2009, 18:08
>>Да просто наливать и пить - то же и с таймерами.
+1

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


Название: Re: рисование на виджите
Отправлено: olefard от Ноябрь 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();
   }

Где ошибка???


Название: Re: рисование на виджите
Отправлено: lit-uriy от Ноябрь 11, 2009, 04:14
Рисование возможно только в методе paintEvent, перенеси код из void MyProb::MyDraw() туда.
А в timerEvent вызывай repaint()


Название: Re: рисование на виджите
Отправлено: olefard от Ноябрь 11, 2009, 07:50
что -то не получается линия отрисовывается вся сразу


Название: Re: рисование на виджите
Отправлено: olefard от Ноябрь 11, 2009, 07:50
точнее она вообще не рисуется