Seite 1 von 1
Animation vorberechnen mit ?
Verfasst: 5. März 2011 14:11
von Siassei
Hallo,
ich bin neu in Qt und suche euren Rat.
Ich möchte eine wissenschaftliche Simulation visualisieren und hierfür muss ich Qt nutzen. Jetzt ist die Berechnung der einzelnen Bilder sehr Aufwendig, weshalb ich diese gerne Vorberechnen würde. Aber welches Widget nutze ich hierfür? QPixmap?
Kann mir hier jemand weiterhelfen? Evtl. mit ein paar Tipps?
Danke, Thomas
Verfasst: 5. März 2011 15:52
von franzf
Hi Thomas,
Erstmal: QPixmap ist kein Widget! Das ist eine Struktur, die nur Bilddaten hält, welche von einem QWidget (z.B. QLabel) gezeichnet werden können.
Ich würde je nach Situation die Berechnungen ein eine eigene Struktur speichern, und diese dann Zeichnen. Wenn es viel zu viel wird und du Gefahr läufst, dass die Daten deinen RAM sprengen, kannst du in ein QImage malen.
Wenn das Rechnen so intensiv ist, wirst du garantiert auch mit Threads arbeiten wollen. Schau dir dazu mal das Mandelbrot-Example an. Dort wird ein Mandelbrot-Fraktal in mehreren Threads in ein QImage gemalt.
Verfasst: 5. März 2011 16:06
von Siassei
franzf hat geschrieben:... kannst du in ein QImage malen..
Das bedeutet, dass ich ein Array von QImage der Größe x erzeuge und jedes Bild einzeln zeichene.
Blöde Frage, aber wie zeichne ich in ein QImage?
Kann man ein BasisImage erzeugen? Ich muss nämlich immer
- eine unveränderliche Struktur zeichnen
- einen veränderlichen Farbverlauf zeichnen
Also das BasisImage mit der Struktur. Das resultierende mit dem Farbverlauf und das BasisImage darüber gelegt.
Ist sowas möglich?
Verfasst: 5. März 2011 16:13
von franzf
Siassei hat geschrieben:Blöde Frage, aber wie zeichne ich in ein QImage?
Blöde Antwort: In dem du die Doku liest

QImage erbt von QPaintDevice, kann also direkt an einen QPainter übergeben werden, der dann darauf malt. Zum Malen gibt es aber auch sehr viele Beispiele, im Mandelbrot wird ja bereits auf ein QImage gemalt.
Verfasst: 5. März 2011 18:39
von padreigh
Du könntest dir ein Basisimage einmal malen, als Member speichern und dir dann immer nur eine Kopie ziehen und den Verlauf neu machen.
Einfaches Beispiel:
Code: Alles auswählen
#ifndef IMAGELABEL_H
#define IMAGELABEL_H
#include <QtGui/QLabel>
#include <QtCore/QTime>
#include <QtCore/QTimer>
#include <QtGui/QPainter>
class ImageLabel : public QLabel
{
Q_OBJECT
public:
explicit ImageLabel(QWidget *parent = 0, Qt::WindowFlags f=0) : QLabel(parent,f) { qsrand(QTime(0,0,0,0).msecsTo(QTime::currentTime())); psychodelic(); }
~ImageLabel();
private slots:
void psychodelic() { repaint(); QTimer::singleShot(qrand()%2000+20,this,SLOT(psychodelic())); };
protected:
void paintEvent(QPaintEvent *event)
{
QImage image(100,100,QImage::Format_ARGB32);
QPainter paint(&image);
// init image with one color
paint.fillRect(image.rect(),palette().color(QPalette::Window));
QPen p (paint.pen());
p.setWidth(qrand()%5+5);
p.setColor(QColor(qrand()%256,qrand()%256,qrand()%256,qrand()%156+100));
paint.setPen(p);
paint.setBrush(QBrush(QColor(qrand()%256,qrand()%256,qrand()%256,qrand()%156+100)));
paint.drawRoundedRect(10,10,80,80,60,10,Qt::RelativeSize);
paint.end();
setPixmap(QPixmap::fromImage(image));
setMinimumSize(105,105);
setMaximumSize(105,105);
QLabel::paintEvent(event);
}
};
#endif // IMAGELABEL_H
Für Verläufe brauchst du den QBrusch und gibst dem ein
http://doc.qt.nokia.com/latest/qgradient.html mit

Verfasst: 5. März 2011 18:42
von padreigh
Nachtrag: Wenn du ein Framework kennst in dem du Bilder malen kannst, kannst du die auch dort malen, speichern (/tmp/bla00001 bis x) und dann dem QImage zum laden geben und dieses dem QLabel zum Darstellen geben. Es geht auch alles in Qt, ich vermute aber mal das du deiner Fragestellung nach noch wenig bis garnicht Qt'iert hast, daher dieser Einwand (vielleicht biste ja ein OpenCV-Gott
