Название: Перемещающаяся картинка Gif. Странные вещи о_О
Отправлено: p00p от Декабрь 13, 2013, 03:02
Добрый день, Уважаемые) Я, как и большинство в этой теме, полный новичок, и хотел бы от вас помощи. Собственно, мне необходимо, чтобы в соответствии со значением моей функции gif-ка передвигалась по горизонтали. Когда я связываю перемещение с событием MouseMove перемещение происходит в точности так, как должно. Но когда я пытаюсь изменить его на какие-либо другие входные данные, появляется просто прозрачное зависшее окно. Вот функция положения: void RunAnimal::setPos(float p) { pos = p; qDebug() << (this->width() - animal->width()) * pos; animal->move((this->width() - animal->width()) * pos, (this->height() - animal->height()) / 2); Sleeper::msleep(10); }
Причем, в qDebug строки бегут корректно, т.е. значение в функцию поступают Функция установки положения: void RunAnimal::mouseMoveEvent(QMouseEvent * e) { setPos((float)e->x() / this->width());//чем правее от края мышь тем больше прогресс qDebug() << 1.*e->x() << "Move Event \n"; }
Например, такой код дает повисшее окно в течении цикла, а затем картинка бегает за мышкой... int main(int argc, char *argv[]) { QApplication a(argc, argv); RunAnimal c; c.show(); for(float i=0; i<100; i=i+1) { c.setPos(i*0.01); } return a.exec(); }
Буду оооочень признателен за помощь! =========================================================================== На всякий случай, выкладываю весь код: #ifndef RUNANIMAL_H #define RUNANIMAL_H
#define RUNANIMAL_H #include <QImage> #include <QWidget> #include <QPushButton> #include <QPixmap> #include <QMovie>
class RunAnimal : public QWidget { Q_OBJECT
QWidget* animal; QMovie *pig; public: RunAnimal(QWidget *parent = 0); void resizeEvent(QResizeEvent *); void mouseMoveEvent(QMouseEvent *); float pos;//Будет от 0 до 1 void replace(float p); public slots: void setPos(float p); };
#endif // RUNANIMAL_H
main.cpp:
#include "mainwindow.h" #include <QApplication> #include "Registration.h" #include "RunAnimal.h" #include <QRadioButton> #include <QPushButton> #include <QCheckBox> #include <QVBoxLayout> #include <iostream> #include <QDebug> #include <QMouseEvent> #include <QFile> #include <unistd.h> #include <QTimer> #include <QMetaObject> #include <QThread> #include <QPaintEvent>
class Sleeper: public QThread { public: static void msleep(int ms) { QThread::msleep(ms); } };
RunAnimal::RunAnimal(QWidget *parent) : QWidget(parent) { QMovie *movie = new QMovie("/home/popka/Документы/pig.gif"); animal = new QLabel(this); qobject_cast<QLabel*>(animal)->setMovie(movie); pos = 0.0f; QLabel label; label.setMovie(movie); movie->start(); this->setMouseTracking(true); this->setMinimumSize(1000,500); }
void RunAnimal::resizeEvent(QResizeEvent *) { setPos(pos); }
void RunAnimal::setPos(float p) { pos = p; animal->move((this->width() - animal->width()) * pos, (this->height() - animal->height()) / 2); Sleeper::msleep(50); qDebug() << (this->width() - animal->width()) * pos ; }
void RunAnimal::mouseMoveEvent(QMouseEvent * e) { setPos((float)e->x() / this->width());//чем правее от края мышь тем больше прогресс qDebug() << 1.*e->x() << "Move Event \n"; }
int main(int argc, char *argv[]) { QApplication a(argc, argv); //Registration registration; //registration.show(); RunAnimal c; c.show(); for(float i=0; i<100; i=i+1) { c.setPos(i*0.01); } return a.exec(); }
Название: Re: Перемещающаяся картинка Gif. Странные вещи о_О
Отправлено: Bepec от Декабрь 13, 2013, 09:31
Очередная печаль.
1) используем тег код - кнопка "#" вверху и между тегами всё становится кодом. 2) вы всё это делаете до запуска цикла событий Qt (a.exec()). Делайте всё после. 3) чтобы двигалось, давайте время на отрисовку вашей гифки, вызывая qApp->processEvents();
Название: Re: Перемещающаяся картинка Gif. Странные вещи о_О
Отправлено: p00p от Декабрь 13, 2013, 16:14
Спасибо, что откликнулись... Попробовал изменить main следуюзим образом int main(int argc, char *argv[]) { QApplication a(argc, argv); RunAnimal c; c.show(); a.exec(); for (float i=0; i<1; i+=0.01) { c.setPos(i); a.processEvents(); } }
Это результатов не дало. Я что-то сделал не так? И, если не сложно, можете пояснить? Не могу до конца понять, как работает a.exec()?
Название: Re: Перемещающаяся картинка Gif. Странные вещи о_О
Отправлено: p00p от Декабрь 13, 2013, 16:25
Добавил в фунцию qApp->processEvents(); А main сделал таким: int main(int argc, char *argv[]) { QApplication a(argc, argv); RunAnimal c; c.show(); for (float i=0; i<1; i+=0.01) c.setPos(i); return a.exec(); }
Заработало) Спасибо Большое) Но не могли бы Вы все равно пояснить exec?
Название: Re: Перемещающаяся картинка Gif. Странные вещи о_О
Отправлено: Bepec от Декабрь 13, 2013, 22:14
exec запускает цикл событий. Конец цикла событий - закрытие программы. Т.е. всё что позже exec будет выполнено только после закрытия всех окон и выхода.
PS и это плохой стиль кода. Не трогайте, прости господи, main. Делайте всё в классе.
Название: Re: Перемещающаяся картинка Gif. Странные вещи о_О
Отправлено: p00p от Декабрь 15, 2013, 00:39
Спасибо большое) Само собой, все сделано в классе. Я использовал main для отладки)
Название: Re: Перемещающаяся картинка Gif. Странные вещи о_О
Отправлено: Bepec от Декабрь 15, 2013, 09:18
Делайте лучше так - создаёте проект с классом отладочной и уже в нём создаёте свой класс.
|