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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Перемещающаяся картинка Gif. Странные вещи о_О  (Прочитано 2638 раз)
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();
}

« Последнее редактирование: Декабрь 13, 2013, 16:15 от p00p » Записан
Bepec
Гость
« Ответ #1 : Декабрь 13, 2013, 09:31 »

Очередная печаль.

1) используем тег код - кнопка "#" вверху и между тегами всё становится кодом.
2) вы всё это делаете до запуска цикла событий Qt (a.exec()). Делайте всё после.
3) чтобы двигалось, давайте время на отрисовку вашей гифки, вызывая qApp->processEvents();
Записан
p00p
Гость
« Ответ #2 : Декабрь 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()?
« Последнее редактирование: Декабрь 13, 2013, 16:19 от p00p » Записан
p00p
Гость
« Ответ #3 : Декабрь 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?
Записан
Bepec
Гость
« Ответ #4 : Декабрь 13, 2013, 22:14 »

exec запускает цикл событий. Конец цикла событий - закрытие программы. Т.е. всё что позже exec будет выполнено только после закрытия всех окон и выхода.

PS и это плохой стиль кода. Не трогайте, прости господи, main. Делайте всё в классе.
Записан
p00p
Гость
« Ответ #5 : Декабрь 15, 2013, 00:39 »

Спасибо большое)
Само собой, все сделано в классе. Я использовал main для отладки)
Записан
Bepec
Гость
« Ответ #6 : Декабрь 15, 2013, 09:18 »

Делайте лучше так - создаёте проект с классом отладочной и уже в нём создаёте свой класс.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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