Abprüfen ob Qpainter fertig gezeichnet hat
Verfasst: 25. Juni 2008 15:17
Ich habe eine Klasse die im Grunde nichts anderes macht als QImages zu zeichen. Diese rufe ich in einem Thread in bestimmten Zeitabständen auf. Wenn diese zu klein gewählt sind wird aber anscheint das neue Image gezeichent bevor das alte fertig war. Das möchte ich gerne verhindern/kontrollieren.
Gleichzeitig sollte sichergestellt sein das alle Events auch direkt abgearbeitet wurden.
Das Anzeigen der Bilder löse ich wie folgt aus:
Die klasse zum Darstellen sieht so aus:
was dazu führt das dieser Code bei dem Signal ausgeführt wird:
wobei zum Darstellen dann diese Klasse genutzt wird
Jetzt stelle ich zwei Dinge fest:
1. Die Bilder flackern bei der Darstellung
2. Es passiert das der paintevent mehrfach aufgerufen wird, ohne das der Thread eine neue Iteration gemacht hat.
Beides würde ich gerne verhindern.
Matthias
Gleichzeitig sollte sichergestellt sein das alle Events auch direkt abgearbeitet wurden.
Das Anzeigen der Bilder löse ich wie folgt aus:
Die klasse zum Darstellen sieht so aus:
Code: Alles auswählen
void runThread()
{
for (int i = 0; i < m_count; i++)
{
m_CurrentImage = i;
emit signalNewImageAvailable(i);
delay(DelayList[i]);
}
}
Code: Alles auswählen
void DialogGratingPeriodVariation::OnThreadMovieImage(int i)
{
QImage * image = &(*imagelist)[i];
widgetComplexViewMovie->setImage(image);
progressBarCalculation->setValue(i);
}
Code: Alles auswählen
widgetComplexBeamView::widgetComplexBeamView(QWidget* parent /*= 0*/) : QWidget(parent)
{
setAttribute(Qt::WA_NoSystemBackground);
}
widgetComplexBeamView::~widgetComplexBeamView()
{
}
void widgetComplexBeamView::paintEvent(QPaintEvent * event)
{
if (m_Image.width() * m_Image.height() == 0)
return;
QPainter painter(this);
double scaleFracX = m_ViewSize.width()/m_Image.width();
double scaleFracY = m_ViewSize.height()/m_Image.height();
painter.scale(scaleFracX, scaleFracY);
painter.drawImage(0,0, m_Image );
//qDebug() << "Time for Image painting:" << timePaintImage.elapsed();
}
void widgetComplexBeamView::setViewSize(const int iWidth, const int iHeight)
{
m_ViewSize = QSize(iWidth, iHeight);
}
void widgetComplexBeamView::setImage(QImage * image)
{
timePaintImage;
timePaintImage.start();
m_Image = *image;
repaint();
}
1. Die Bilder flackern bei der Darstellung
2. Es passiert das der paintevent mehrfach aufgerufen wird, ohne das der Thread eine neue Iteration gemacht hat.
Beides würde ich gerne verhindern.
Matthias