Farbwert eines Graphicsitem auslesen

Alles rund um die Programmierung mit Qt
Antworten
Kenni
Beiträge: 10
Registriert: 23. Mai 2009 22:08

Farbwert eines Graphicsitem auslesen

Beitrag 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
samsamsam
Beiträge: 43
Registriert: 9. Juni 2009 16:22
Wohnort: Dortmund

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

//
samsamsam
Beiträge: 43
Registriert: 9. Juni 2009 16:22
Wohnort: Dortmund

Beitrag von samsamsam »

ich meine natürlich QGraphicsScene und nicht View....
Kenni
Beiträge: 10
Registriert: 23. Mai 2009 22:08

Beitrag 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
Kenni
Beiträge: 10
Registriert: 23. Mai 2009 22:08

Beitrag 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();
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Dann schau dir mal das hier an: qgraphicsitem_cast
Kenni
Beiträge: 10
Registriert: 23. Mai 2009 22:08

Beitrag von Kenni »

dank dir für den schnellen tip.
werde ich dann mal versuchen :)
Kenni
Beiträge: 10
Registriert: 23. Mai 2009 22:08

Beitrag 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?
Kenni
Beiträge: 10
Registriert: 23. Mai 2009 22:08

Beitrag 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]
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
Antworten