Seite 1 von 1

Abprüfen ob Qpainter fertig gezeichnet hat

Verfasst: 25. Juni 2008 15:17
von pospiech
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:

Code: Alles auswählen

	void runThread()
	{	

		for (int i = 0; i < m_count; i++)
		{
			m_CurrentImage = i;					
			emit signalNewImageAvailable(i);	
			delay(DelayList[i]);
		}
	}
was dazu führt das dieser Code bei dem Signal ausgeführt wird:

Code: Alles auswählen

void DialogGratingPeriodVariation::OnThreadMovieImage(int i)
{
	QImage * image = &(*imagelist)[i];
	widgetComplexViewMovie->setImage(image);
	progressBarCalculation->setValue(i);
}
wobei zum Darstellen dann diese Klasse genutzt wird

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