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;
}
Daumenkino
Weiterentwicklung
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;
}
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;
}
-
- Beiträge: 386
- Registriert: 21. November 2007 20:07
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 mageViewer, Analog Clock (wegen Timer)) anschauen.
Ich würde es in etwas so machen:
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 mageViewer, 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
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????
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????
-
- Beiträge: 14
- Registriert: 19. März 2008 19:22
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
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