LINUX.ORG.RU

[Qt4]Я делаю неправильно. А как правильно?


0

0

Понадобилось мне написать одноразовую программу. В ней мне понадобилось отрисовать анимацию. Я решил долго не сношать мозг, а сделать в быдлокод-way.

Но теперь мне интересно, как это надо было сделать правильно, в стиле, который предполагает Qt4.

Я сделал так: завёл QPixmap, в котором всё храню, и в paintEvent() моего виджета я отрисовываю его через paintPixmap. А в методах, отвечающих за анимацию, я в цикле с задержкой рисую на этом QPixmap и каждый кадр дёргаю repaint().

А как правильно?

★★★

И ещё: мне для того, чтобы отрисовать некоторую начальную картинку, естественно, нужно было знать размеры моего виджета. Виджет показывается через showFullScreen(). Но в конструкторе размеры этого полноэкранного виджета ещё неизвестны.

И тогда я сделал ужасно: в paintEvent() завёл static int first=1 и в первый вызов смотрел размеры. Но. Почему-то просто width() и height() давали что-то совсем неправильное, тогда я применил ещё один костыль и написал int w=frameSize().width(); int h=frameSize().height().

Что-то здесь явно не торт ведь...

Yareg ★★★
() автор топика
Ответ на: комментарий от Bad_Habit

Я так и думал, что надо было использовать QLabel::setPixmap. Хотя... Внутри, оно интересно как-то по-хитрому делается или также тупо.

Yareg ★★★
() автор топика
Ответ на: комментарий от Bad_Habit

Это всё я узнаю из документации или из Шлее, а мне было интересно именно про рисование. Скорее всего, правильнее всего будет почитать наиболее похожие на мои цели примеры.

Yareg ★★★
() автор топика
Ответ на: комментарий от Yareg

> правильнее всего будет почитать наиболее похожие на мои цели примеры.

Сорцы Qt поставляются с большим набором демок..

Bad_Habit
()
Ответ на: комментарий от Bad_Habit

>Вот более-менее кутешный вей, сигналы и слоты

http://cartan.cas.suffolk.edu/oopdocbook/html/moviethread.html

По ссылке анимация с использование дополнительной нити. Если необходимо делать некий анимированный компонент, которым будут многократно использоваться другие, то ИМХО так делать нельзя. С трудом верится, что это Qt-way анимация.

Мне больше нравиться идея alex_custov с использованием QTimer.

pathfinder ★★★★
()

В Qt есть The Animation Framework. сам я его не щупал за ненадобностью, но судя по всему это как раз то, что вам нужно.

staseg ★★★★★
()
Ответ на: комментарий от staseg

В Qt есть The Animation Framework. сам я его не щупал за ненадобностью, но судя по всему это как раз то, что вам нужно.

Беглым гуглением натолкнулся на это

http://qt.nokia.com/products/appdev/add-on-products/catalog/4/Utilities/qtani...

Qt Animation Framework

This component adds a convenient API to do animations in Qt. Note that this solution is experimental and work in progress: No backwards compatibility (source nor binary) is provided.

Точно не знаю, но похоже с этой штукой надо быть осторожным.

pathfinder ★★★★
()

> А как правильно?

Есть класс, QAnimation (если ничего не забыл). Он хранит массив картинок, которые выводятся поочерёдно, создавая эту самую анимацию. Вроде, как то так...

one_more_hokum ★★★
()
Ответ на: комментарий от one_more_hokum

Мне просто проще было использовать не пререндеренную анимацию, а в реальном времени рисовать примитивами купэйнтэра.

Yareg ★★★
() автор топика
Ответ на: комментарий от alex_custov
void CZWidget::drawAnimatedLine(int x1,int y1,int x2,int y2,int t)
{
    for(int i=0;i<t;i+=1)
    {
        painter.drawLine(x1,y1,x1+(x2-x1)*i/t,y1+(y2-y1)*i/t);
        repaint();
        SLEEP(20);
    }
}
Yareg ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.