Aus einem QWidget den farbwert per Maus lesen

Alles rund um die Programmierung mit Qt
Antworten
KeinPro
Beiträge: 17
Registriert: 26. Juni 2008 16:23

Aus einem QWidget den farbwert per Maus lesen

Beitrag von KeinPro »

Ich bekomme in einem QWidget einen Kreis angezeigt (eine bestimmte zeit) dieser Kreis hat eine bestimmte Farbe ... durch klicken auf den kreis hätte ich gerne gewusst ob ich über ein MouseEvent die farbe abfragen kann dann weiss ich ja ob ich in den kreis geklickt habe oder daneben...

so habe ich es versucht aber er gibt mir immer 0 zurück

Code: Alles auswählen

	if (e->button() == Qt::LeftButton){
		QPoint pos = e->pos();
		int x = pos.x();
		int y = pos.y();
		unsigned char r,g,b;
		imageWidget->getRGB(x,y,r,g,b);
		QString s = QString("%1").arg(b);
		QMessageBox::information(0,tr("AebImageWidget::getRGB"),s);
	}
}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Passen denn auch x und y? Ggf. musst Du da noch die Koordinaten etwas umrechnen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
KeinPro
Beiträge: 17
Registriert: 26. Juni 2008 16:23

Beitrag von KeinPro »

wie meinst du das ?
also ich habe ja (wie im code geschrieben) mir den "angeblichen" farbwert an x,y pos ausgeben lassen ... alerdings ist es egal wo ich hin klicke er gibt mir immer den selben wert ...

ich habe einwenig das gefühl das meine überlegung nicht hinhaut ... ich will im programm dann erfassen ob der kreis geklickt wurde und das wollte ich über den farb wert machen ... falls farbe X geklickt dann kreis falls farbe y dann hintergrund ...
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Wo kommt den die Funktion getRGB her?
KeinPro
Beiträge: 17
Registriert: 26. Juni 2008 16:23

Beitrag von KeinPro »

Code: Alles auswählen

bool AebImageWidget::getRGB(int x, int y, unsigned char& r, unsigned char& g, unsigned char& b) {
	if(x < 0 || x > m_image.width()-1 || y < 0 || y > m_image.height()-1) 
		return false;

	switch(m_image.format()) {

	// "Graustufenbilder". In diesem Fall steht im Bild ein Index
	// in eine Farbtabelle. Bei einem echten Graustufenbild stehen in dieser
	// Tabelle dann die Grauwerte als RGB-Farben z.b. (255,255,255) fuer Weiss.
	case QImage::Format_Indexed8:
	    r = g = b = m_image.pixelIndex(x,y);
		break;

	// Farbformate fuer die mit RGB-Werten gearbeitet werden kann
	case QImage::Format_ARGB32_Premultiplied:
	case QImage::Format_RGB32:
	case QImage::Format_ARGB32: {
		QRgb rgb = m_image.pixel(x,y);
		r = qRed(rgb);
		g = qGreen(rgb);
		b = qBlue(rgb);
		break;
								}
	// Nicht unterstuetzte Formate, im wesentlichen
	// 1bit Binaerbilder
	case QImage::Format_Invalid:
	case QImage::Format_Mono:
	case QImage::Format_MonoLSB:
	default:
		QMessageBox::information(0,tr("AebImageWidget::getRGB"),tr("Nicht unterstuetztes Bildformat"));
	}	
	return true;
};
das hat unserer Prof. geschrieben ...

also "eigentlich" bietet getRGB mir zuviele optionen ... ich denke im "end" program werde ich es etwas verändert haben
KeinPro
Beiträge: 17
Registriert: 26. Juni 2008 16:23

Beitrag von KeinPro »

mmmh keiner da der mir helfen kann ? -.-
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Christian meinte das die X/Y Koordinaten evtl. nicht stimmen bzw. für das falsche Koordinatensystem gelten. Evtl. musst du mapToGlobal benutzen?

Aber wenn du überprüfen willst ob der Benutzer in den Kreis geklickt hat, dann ist das definitiv der falsche Ansatz. Du solltest einfach ausrechnen ob die X/Y Koordinaten innerhalb des Kreises liegen.
KeinPro
Beiträge: 17
Registriert: 26. Juni 2008 16:23

Beitrag von KeinPro »

mmmh dachte irgendwie das es mit dem farbwert eindeutiger und auch simpler ist ...
da ich in dem fall farbwert "nur" überprüfen muss ob das angeklickte pixel die farbe des kreises ist ... ich habe auch ideen wie ich das mit den kords x/y machen kann alerdings bin ich da auch ein bissel überfordert ...

problem ist alerdings (habe ich heute morgen festgestellt) das ich ja auch nicht wirklich nen kreis habe sonder ein quadrat in das ein kreis gemalt wird und der hat die x/y nicht in der mitte vom kreis sondern links oben in der ecke...
bei meiner überlegung bräuchte ich die kreis mitte ... -.-
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Natürlich ist es 'einfacher', aber auch eher falsch. Was wenn das System eine andere Farbpalette benutzt?

Du hast doch sicher den Radius vom Kreis oder? Dann kannst du die X|Y Koordinate der Mitte von deinem 0 Punkt aus ganz einfach berechnen (Sofern es wirklich ein Kreis ist, keine Ellipse):
Jeweils + sqrt(2*radius*radius)

Dann subtrahierst du von deinen Mauskoordinaten die Koordinaten des Mittelpunktes und wandelst die Koordinaten in Polarkoordinaten um und überprüfst einfach den Radius.


Vllt. auch viel zu viel arbeit. xD
KeinPro
Beiträge: 17
Registriert: 26. Juni 2008 16:23

Beitrag von KeinPro »

Code: Alles auswählen

void AebImageWidget::paintEvent ( QPaintEvent * event ) {
	QPainter painter(this);
	srand ( time(NULL) );
	int x = rand() % 600+1;
	int y = rand() % 600+1;
	int r = rand() % 255;
	int b = rand() % 255;
	int g = rand() % 255; 
	int ho =100;
	int br = 100;
	QRect re = QRect(x,y,ho,br);
	QBrush brush(QColor(r,g,b));
	painter.setBrush(brush);
	painter.drawEllipse(re);
ich zeichne ne ellipse in ein Rechteck... man kann auch speziell nur nen kreis malen ? ist das mit dem kreis auch ein QPaintevent ?
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Na wenn due Höhe und die Brete identisch sind, dann ist es nen Kreis, ansonsten natürlich ne Ellipse...

Übrigens, du solltest nicht Modulu (oder wie man das schreibt, also das %) nutzen um Zufallszahlen zu begrenzen. Benutze stattdessen sowas hier:
1+(int) (10.0*rand()/(RAND_MAX+1.0));

Wobei 1 die untere Grenze und 10 die obere ist.
KeinPro
Beiträge: 17
Registriert: 26. Juni 2008 16:23

Beitrag von KeinPro »

so also ... ich habe nun einen kreis ... den ich anklicken kann und mein Maus event wird auch "korrekt" ausgeführt ... alerdings bin ich auf zwei sehr merkwürdige sachen gestossen ...

zum einen das hier: (danke wegen der random fkt. aber das habe ich sogar schon geändert^^)

Code: Alles auswählen

	int x = (((double)rand())/RAND_MAX)*(800-200);
	int y = (((double)rand())/RAND_MAX)*(600-200);
	int w = rand() % 255;
	int b = rand() % 255;
	int g = rand() % 255; 
	int ho =100;
	int br = 100;
	m_circleRect = QRect(x,y,ho,br);
	QBrush brush(QColor(w,g,b));
	painter.setBrush(brush);
	painter.drawEllipse(m_circleRect);

mein problem ist hier das der x wert sich super schön nach jedem "neu" aufruf ändert ... alerding der y wert anscheinend mehr zeit brauch um sich zu änderen für mich ist das ein rätsel da ich doch beiden zahlen einen zufallswert liefer ... alerdings bewegt sich der kreis nicht von der y-geraden .... ich weiss das ist eigentlich c++ aber vieleicht könnt ihr mir ja hier auch helfen ...

zum anderen muss ich das hier machen um den mittelpunkt vom kreis zuberechnen was mich total verwirrt.

Code: Alles auswählen

if (e->button() == Qt::LeftButton){
		QPoint pos = e->pos();
		int x = pos.x();
		int y = pos.y();
		unsigned char r,g,b;
		imageWidget->getRGB(x,y,r,g,b);
		QString s = QString("%1").arg(y);
		QRect circle = imageWidget->getCircleRect();
		QPoint edge = circle.center();
		QPoint circlePos;
		circlePos.setX(circle.x()+50);
		circlePos.setY(circle.y()+105);
		double distanz = sqrt((double)(circlePos.x()-x)*(circlePos.x()-x)+(circlePos.y()-y)*(circlePos.y()-y));
		if (distanz <= 50){
			m_count++;
			m_aim++;
			QMessageBox::information(0,"",tr("daneben"));}

		
		else{
			QMessageBox::information(0,"",tr("daneben"));}
			m_count++;

das ist jetzt meine abfrage ob ich den kreis getroffen habe mit einem klick oder nicht nach langem testen bin ich auf diese 2 werte gekommen circlePos.setX(circle.x()+50);
circlePos.setY(circle.y()+105);
ohne diese 2 additionen würde ich nicht den kreis treffen ... hat da einer ne erklärung ?!

mir ist noch ne "kleinigkeit" eingefallen ... wie kann ich ne abfrage machen die einen int wert verlangt die dann dem programm übergeben wird ?!? ...
dachte an einen button auf den ich klicke und dann popt ein eingabe fenster auf... stehe da bissel auf dem schlauch ^^
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

KeinPro hat geschrieben: ohne diese 2 additionen würde ich nicht den kreis treffen ... hat da einer ne erklärung ?!
ich red gegen eine Wand... :cry:
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
KeinPro
Beiträge: 17
Registriert: 26. Juni 2008 16:23

Beitrag von KeinPro »

ja schonklar das es die umrechnung ist die du meinst aber die zahlen ergeben keinen sinn :cry:
Antworten