Seite 1 von 1
Aus einem QWidget den farbwert per Maus lesen
Verfasst: 2. Juli 2008 09:28
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);
}
}
Verfasst: 2. Juli 2008 11:24
von Christian81
Passen denn auch x und y? Ggf. musst Du da noch die Koordinaten etwas umrechnen.
Verfasst: 2. Juli 2008 18:15
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 ...
Verfasst: 2. Juli 2008 18:26
von upsala
Wo kommt den die Funktion getRGB her?
Verfasst: 2. Juli 2008 18:51
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
Verfasst: 3. Juli 2008 20:56
von KeinPro
mmmh keiner da der mir helfen kann ? -.-
Verfasst: 3. Juli 2008 21:00
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.
Verfasst: 3. Juli 2008 21:23
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 ... -.-
Verfasst: 3. Juli 2008 21:49
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
Verfasst: 4. Juli 2008 09:11
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 ?
Verfasst: 4. Juli 2008 09:25
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.
Verfasst: 4. Juli 2008 22:38
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 ^^
Verfasst: 4. Juli 2008 23:57
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...

Verfasst: 5. Juli 2008 00:37
von KeinPro
ja schonklar das es die umrechnung ist die du meinst aber die zahlen ergeben keinen sinn
