Daumenkino

Alles rund um die Programmierung mit Qt
Antworten
Seppelhut
Beiträge: 5
Registriert: 6. April 2008 14:57
Wohnort: München

Daumenkino

Beitrag 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;

}
Seppelhut
Beiträge: 5
Registriert: 6. April 2008 14:57
Wohnort: München

Weiterentwicklung

Beitrag 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;

}
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Bitte benutz doch den Code-Tag für Code.. Das ist so unlesbar. Am besten poste es in eine NoPaste Seite.
quarks
Beiträge: 2
Registriert: 4. März 2008 11:05

Beitrag 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()
         
 }

Seppelhut
Beiträge: 5
Registriert: 6. April 2008 14:57
Wohnort: München

Danke für die Tipps

Beitrag 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????
Rocketbuehler
Beiträge: 14
Registriert: 19. März 2008 19:22

Beitrag 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
Antworten