Seite 1 von 1

Farbwert eines Graphicsitem auslesen

Verfasst: 3. Juli 2009 12:41
von Kenni
Hallo,

auf einer Graphicsview liegen mehrere rechteckige einfarbige Items in einer Scene. Kann mir vielleicht jemand einen Tip geben, wie ich einen Farbwert aus den Items auslesen kann? Ist dies überhaupt möglich?
Habe den Assistanten schon sehr lange durchforstet, aber bin leider nicht fündig geworden. Zweifel auch langsam daran, ob dies überhaupt möglich ist.

Lieben Gruß
Kenni

Verfasst: 3. Juli 2009 13:23
von samsamsam
hallo,

wenn die items rechteckig sind, dann sind sie bestimmt vom typ QGraphicsRectItem.

Code: Alles auswählen

myScene = new QGraphicsView()
//....
//...
//...
//101. element
int x = 100;
QGraphicsRectItem* item = (QGraphicsRectItem*(myScene->items().at(x));

//QBrush QAbstractGraphicsShapeItem::brush () const
//QGraphicsRectItem erbt von QAbstractGraphicsShapeItem
QBrush myRectBrush = item.brush();

//

Verfasst: 3. Juli 2009 13:24
von samsamsam
ich meine natürlich QGraphicsScene und nicht View....

Verfasst: 3. Juli 2009 18:07
von Kenni
ja super, dein Hinweis mit dem QBrush hilft mir.
Dadurch kann ich dann über QColor die Farbwerte bekommen.
Ich hatte sogar schon bei QBrush geschaut, aber irgendwie dachte ich, man könnte nur die Struktur mit Pattern abfragen.
Werds gleich mal testen. dank dir

Verfasst: 3. Juli 2009 22:41
von Kenni
hm, hab jetzt einiges versucht, aber leider klappts nicht richtig.

mit folgendem code wird eine graphicscene mit rechtecken gefüllt.

Code: Alles auswählen

QGraphicsScene *gScene = new QGraphicsScene();
gScene->setSceneRect(-250.0 , -125.0 , 500.0, 250.0);

	for (int i = -250; i < 250; i += 25) 
	{
		for (int j = -125; j < 125; j += 25) 
		{
			QGraphicsRectItem *item = new QGraphicsRectItem();
			item->setRect(0,0,25,25);

			item->setPen(QPen(Qt::black));
			item->setBrush(Qt::red);

			item->setPos(QPointF(i, j));

			gScene->addItem(item);
		}
	}

ui.graphicsView->setScene(gScene);
Anschließend würde ich gerne wenn ich einen Button drücke über gScene die Farbwerte der items abfragen und genau hierbei hab ich das Problem. eine graphicscene liefert beim Aufruf von itemAt ein graphicitem und kein graphicrectitem.
aber nur graphicrectitem liefert mir die Möglichkeit die Farbwerte über brush zu bekommen.

folgender code liefert mir bei einem Item z.B den Rotwert als Integer.
So würde ich das gerne auch auf eine Scene anwenden.

Code: Alles auswählen

QGraphicsRectItem *item = new QGraphicsRectItem();
item->setRect(0,0,10,10);
item->setBrush(Qt::red);
item->setPos(0,0);

int iRed = item->brush().color().red();

Verfasst: 3. Juli 2009 22:45
von upsala
Dann schau dir mal das hier an: qgraphicsitem_cast

Verfasst: 3. Juli 2009 22:58
von Kenni
dank dir für den schnellen tip.
werde ich dann mal versuchen :)

Verfasst: 4. Juli 2009 01:03
von Kenni
@upsala: vielleicht kannst du nochmal einen blick drauf werfen :)

die abgeleitete klasse:

Code: Alles auswählen

#include <QGraphicsRectItem>

class CustomItem : public QGraphicsRectItem
{
public:
	CustomItem();
	~CustomItem();

	enum { Type = UserType + 1}; 
	int type() const { return Type; }

private:
	
};
und der aufruf nach den beiden for-schleifen:

Code: Alles auswählen

QGraphicsRectItem* rectItem= qgraphicsitem_cast<CustomItem *> (gScene->items().at(0));
int iRed = rectItem->brush().color().red();
mit gScene->items().at(0) hol ich mir das erste element in der scene als graphicsitem und dieses wandel ich mit dem cast in ein rect um. nächster befehl bewirkt einen absturz.
sind denn die werte im header richtig?

Verfasst: 4. Juli 2009 01:50
von Kenni
ok, ich habe eine andere castlösung gefunden.
ist vielleiht nicht die richtige, aber sie funkioniert ;)

Code: Alles auswählen

	QList<QGraphicsItem *> items = gScene->items();

	foreach (QGraphicsItem* item, items)
	{
		QGraphicsRectItem* rectItem = dynamic_cast<QGraphicsRectItem *>(item);
	int iRed = rectItem->brush().color().red(); //liefert den letzten Rotwert
	}

würd mich aber shcon interessieren, was ich bei dem anderen falsch gemacht hab. naja, aber schonmal vielen dank für die hilfe![/code]

Verfasst: 4. Juli 2009 08:02
von upsala
Was bei beiden Möglichkeiten auf jeden Fall fehlt ist, ob das gefundene Item auch wirklich das ist, was du erwartest. D. h. der Rückgabewert vom dynamic_cast/qgraphicsitem_cast sollte darauf überprüft werden ob er 0 ist.