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
Animation vorberechnen mit ?
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.
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.
Das bedeutet, dass ich ein Array von QImage der Größe x erzeuge und jedes Bild einzeln zeichene.franzf hat geschrieben:... kannst du in ein QImage malen..
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?
Blöde Antwort: In dem du die Doku liestSiassei hat geschrieben:Blöde Frage, aber wie zeichne ich in ein QImage?
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.
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:
Für Verläufe brauchst du den QBrusch und gibst dem ein http://doc.qt.nokia.com/latest/qgradient.html mit 
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_HNachtrag: 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 