Seite 1 von 1

Daumenkino

Verfasst: 6. April 2008 15:14
von Seppelhut
Hallo an Alle,

ich hab ein Problem, und zwar möchte ich eine kleine Animation schreiben, bei der die einzelnen Bilder so oft gewechselt werden, dass der Eindruck einer fliessenden Bewegung entsteht, ähnlich wie beim Daumenkino.
Leider klappt das nicht so wie ich mir das gedacht habe, vielleicht könnt ihr mir weiterhelfen???

Anbei mal den Code:


#include <qapplication.h>
#include <qpixmap.h>
#include <qlabel.h>



QWidget* showpicture(char*);


int main(int argc, char *argv[]){


QApplication own_app(argc, argv);


int i = 2;

char bild1[] = "pic1.jpg";
char bild2[] = "pic2.jpg";
QWidget* widget = showpicture(bild1);

own_app.setMainWidget(widget);

widget->show();

while(true){


if(i%2 == 0){widget = showpicture(bild1);}
else {widget = showpicture(bild2);}

widget->update();


sleep(1);

i += 1;

};

return own_app.exec();
}


QWidget* showpicture(char bild[]){


QWidget* own_widget = new QWidget();
own_widget->setGeometry(100, 100, 500, 40);

QString filename;
QPixmap picture;

if(!picture.load(bild)){
filename += "Datei nicht korrekt";
QLabel* error = new QLabel(filename, own_widget);

error->setGeometry(0, 0, 600, 40);
error->setPalette(QPalette(Qt::green, Qt::green));
error->setAlignment(QLabel::AlignCenter);

}
else{
QLabel* picturelabel = new QLabel(own_widget);
own_widget->resize(picture.width() + 20, picture.height() + 20);
own_widget->setBackgroundColor(Qt::white);
picturelabel->setPixmap(picture);
picturelabel->setGeometry(10, 10, picture.width(), picture.height());
picturelabel->resize(picture.size());
}

return own_widget;

}

Weiterentwicklung

Verfasst: 6. April 2008 18:16
von Seppelhut
Habe jetzt schon die ersten Probleme beseitigt, ich denke das Hauptprpblem ist, dass exec() ausserhalb der while Schleife steht, gibt es da eine elegante Lösung dafür???


Hier mal die Überarbeitete Version des Programms:


#include <qapplication.h>
#include <qpixmap.h>
#include <qlabel.h>


QWidget* showpicture(char*, QWidget*);




int main(int argc, char *argv[]){



QApplication own_app(argc, argv);
QWidget* own_widget = new QWidget();
own_app.setMainWidget(own_widget);



int i = 2;


char bild1[] = "pic1.jpg";
char bild2[] = "pic2.jpg";

while(true){


if(i%2 == 0){own_widget = showpicture(bild1, own_widget);}
else {own_widget = showpicture(bild2, own_widget);}


own_widget->show();
sleep(1);
i += 1;

};

return own_app.exec();
}


QWidget* showpicture(char bild[], QWidget* own_widget){


QString filename;
QPixmap picture;

if(!picture.load(bild)){
filename += "Datei nicht korrekt";
QLabel* error = new QLabel(filename, own_widget);

error->setGeometry(0, 0, 600, 40);
error->setPalette(QPalette(Qt::green, Qt::green));
error->setAlignment(QLabel::AlignCenter);

}
else{
QLabel* picturelabel = new QLabel(own_widget);
own_widget->resize(picture.width() + 20, picture.height() + 20);
own_widget->setBackgroundColor(Qt::white);
picturelabel->setPixmap(picture);
picturelabel->setGeometry(10, 10, picture.width(), picture.height());
picturelabel->resize(picture.size());
}

return own_widget;

}

Verfasst: 6. April 2008 19:16
von PeterLustig
Bitte benutz doch den Code-Tag für Code.. Das ist so unlesbar. Am besten poste es in eine NoPaste Seite.

Verfasst: 8. April 2008 11:02
von quarks
Mit Objekten und Zeigern scheinst noch etwas Probleme zu haben. In deinem ersten Beisp. hast jedesmal ein neues Objekt erstellt, das dann aber nur irgend wo im Speicher hing. Bei der Benutzung von new solltest auch die alten Widget mit delete löschen, gerade bei der Endlosschleife wird sonst der Speicher schnell zugemüllt. Danach hast zumindest immer das selbe Widget benutzt.

Insgesamt wirst über kurz oder lang nicht vorbei kommen ein eigene Klasse zu schreiben, was dann auch viele Vorteile hat. Solltest also durchaus noch mal die Tutorials und Beispiele (ImageViewer, Analog Clock (wegen Timer)) anschauen.

Ich würde es in etwas so machen:

Code: Alles auswählen

class FilmWidget : public QWidget  // oder gleich QMainWindow
{
        Q_OBJECT

    public:
        FilmWidget (QWidget *parent = 0);

    protected:
        void timerEvent(QTimerEvent *event);

   private:
        QLabel *pictureLabel;
        QLabel *errorLabel;

        int frameNumber;


};


FilmWidget::FilmWidget(QObject *parent) : QObject(parent)
{
        // Labels erstellen, geometrie usw.
        .....


        startTimer(40);     // Dadurch wird alle 40ms timerEvent aufgerufen (25Hz)

}

 void FilmWidget::timerEvent(QTimerEvent *event)
 {
         // anhand frameNumber neuer Frame laden
         .....

         // bei Fehler errorLabel zeigen  
         errorLabel->setText("blabla");
         errorLabel->setVisible(true oder false); // oder show() hide()
         
 }


Danke für die Tipps

Verfasst: 8. April 2008 21:00
von Seppelhut
Hallo quarks,

ich danke Dir für Deine Tipps, ich hoffe so kriege ich meine Animation zum laufen. Da meine erst Präsentaion noch mit der ASCII Art Grafik bei meinen Vorgesetzten nicht so gut angekommen ist.

Kannst Du mir die links geben wo ich die Beispiele finde, also ImageViewer und Analog Clock????

Verfasst: 10. April 2008 16:37
von Rocketbuehler
Hi,

die Beispiele findest du in deinem QT Ordner\examples\widgets

oder auf der Trolltech Homepage findest du den Quellcode auch.

http://doc.trolltech.com/4.3/examples.html#widgets

Gruß
Rocketbuehler