ObjectName

Alles rund um die Programmierung mit Qt
Antworten
der_burner
Beiträge: 10
Registriert: 28. Oktober 2013 17:21

ObjectName

Beitrag von der_burner »

Hallo Zusammen,

ich suche nach einer Lösung, ein Objekt auf einer QGraphicsScene per Name oder ID zu erreichen.

Ich erzeuge ein QGraphicsItem und setze mit setObjectName einen Namen, dieser ist auch eindeutig. Dann füge ich das Objekt mit scene->addItem(), auf die Scene. Das passiert nun mit diversen QGraphicsItems.
Nun möchte ich, irgendwann später, auf ein bestimmtes Objekt mit dem ObjectName "XYZ" zugreifen.
Wie kann ich das realisieren? Ich habe mit scene->findChild() rumprobiert, hab das aber nicht zum laufen bekommen. Könnt Ihr mir helfen?

Vielen Dank und schöne Grüße

Björn
Hulk2442
Beiträge: 115
Registriert: 10. Januar 2007 13:44

Re: ObjectName

Beitrag von Hulk2442 »

Habe es jetzt nicht geteste jedoch "findchild" sollte funken
http://harmattan-dev.nokia.com/docs/lib ... #findChild
der_burner
Beiträge: 10
Registriert: 28. Oktober 2013 17:21

Re: ObjectName

Beitrag von der_burner »

der_burner hat geschrieben:Ich habe mit scene->findChild() rumprobiert, hab das aber nicht zum laufen bekommen. Könnt Ihr mir helfen?
Die Doku habe ich gelesen und ausprobiert habe ich das auch. Aber es klappt nicht :(
Hulk2442
Beiträge: 115
Registriert: 10. Januar 2007 13:44

Re: ObjectName

Beitrag von Hulk2442 »

Hi
Habe mich etwas mit der Funktion "findChild" bzw. "findChildren" gespielt leider ohne Erfolg. :?
Da mich die Antwort auch sehr interessieren würde habe ich eine kleine Applikation zum testen geschrieben.
Falls jemand eine Lösung für das Problem kennt bitte melden.

*.pro

Code: Alles auswählen

QT	+=	gui widgets
MOC_DIR      = .moc
OBJECTS_DIR  = .obj
TEMPLATE = app
TARGET	=	graphic
HEADERS +=	\
SOURCES	+=	main.cpp \
main.cpp

Code: Alles auswählen

#include <QApplication>
#include <QtCore>
#include <QtGui>
#include <QGraphicsWidget>
#include <QGraphicsView>


//==============================================================================	Widget
class QGraphicsRectWidget : public QGraphicsWidget
{
	public:
		QGraphicsRectWidget( Qt::GlobalColor INcolor ):
			color(INcolor)
		{}

		void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
		{
			painter->fillRect(rect(), color);
		}

	private:
		Qt::GlobalColor color;
};



//==============================================================================	Scene
class GraphicsScene : public QGraphicsScene
{
	Q_OBJECT
	public:
		GraphicsScene()
		{}

	protected:
		void mouseReleaseEvent(QGraphicsSceneMouseEvent * mouseEvent)
		{
			Q_UNUSED( mouseEvent );

			QGraphicsRectWidget *pButton = this->findChild<QGraphicsRectWidget *>("B01");

			if( 0 != pButton )
			{
				qDebug() << "Found: " << pButton->objectName();
			}
			else
			{
				qDebug() << "NOT Found";
			}

			QList<QGraphicsRectWidget *> list = this->findChildren<QGraphicsRectWidget *>();
			qDebug() << list.size();
		}
};



//==============================================================================	View
class GraphicsView : public QGraphicsView
{
	Q_OBJECT
	public:
		GraphicsView(GraphicsScene *scene, QWidget *parent = NULL) :
			QGraphicsView(scene, parent)
		{}

	protected:
		virtual void resizeEvent(QResizeEvent *event)
		{
			fitInView(scene()->sceneRect());
			QGraphicsView::resizeEvent(event);
		}
};



//==============================================================================	main
int main(int argc, char **argv)
{
	QApplication app(argc, argv);

	QGraphicsRectWidget *button1 = new QGraphicsRectWidget( Qt::blue );
	QGraphicsRectWidget *button2 = new QGraphicsRectWidget( Qt::red );
	QGraphicsRectWidget *button3 = new QGraphicsRectWidget( Qt::green );
	QGraphicsRectWidget *button4 = new QGraphicsRectWidget( Qt::yellow );

	button1->setObjectName( "B01" );
	button1->setX(5);
	button1->setY(5);
	button1->setZValue(0);

	button2->setObjectName( "B02" );
	button2->setX(250);
	button2->setY(5);
	button2->setZValue(1);

	button3->setObjectName( "B03" );
	button3->setX(250);
	button3->setY(250);
	button3->setZValue(2);

	button4->setObjectName( "B04" );
	button4->setX(5);
	button4->setY(250);
	button4->setZValue(3);

	GraphicsScene scene;
	scene.setSceneRect(0, 0, 300, 300);
	scene.setBackgroundBrush(Qt::black);
	scene.addItem(button1);
	scene.addItem(button2);
	scene.addItem(button3);
	scene.addItem(button4);

	GraphicsView window(&scene);
	window.setFrameStyle(0);
	window.setAlignment(Qt::AlignLeft | Qt::AlignTop);
	window.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
	window.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

	window.resize(300, 300);
	window.show();

	return app.exec();
}

#include "main.moc"
trendyAndy
Beiträge: 54
Registriert: 27. März 2009 15:01

Re: ObjectName

Beitrag von trendyAndy »

Servus!

Du kannst mit setData dem Item einen ObjectName vergeben. Anderst gehts meines Wissens nach nicht.

Code: Alles auswählen

  #include <QApplication>
    #include <QtCore>
    #include <QtGui>
    #include <QGraphicsWidget>
    #include <QGraphicsView>


    //==============================================================================   Widget
    class QGraphicsRectWidget : public QGraphicsWidget
    {
       public:
          QGraphicsRectWidget( Qt::GlobalColor INcolor ):
             color(INcolor)
          {}

          void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
          {
             painter->fillRect(rect(), color);
          }

       private:
          Qt::GlobalColor color;
    };



    //==============================================================================   Scene
    class GraphicsScene : public QGraphicsScene
    {
       Q_OBJECT
       public:
          GraphicsScene()
          {}

       protected:
          void mouseReleaseEvent(QGraphicsSceneMouseEvent * mouseEvent)
          {
             QGraphicsItem * item = this->itemAt(mouseEvent->lastScenePos());

             if( 0 != item  )
             {
                 static const int ObjectName = 0;
                 qDebug() << "Found: " << item->data(ObjectName).toString();
             }
             else
             {
                qDebug() << "NOT Found";
             }
          }
    };



    //==============================================================================   View
    class GraphicsView : public QGraphicsView
    {
       Q_OBJECT
       public:
          GraphicsView(GraphicsScene *scene, QWidget *parent = NULL) :
             QGraphicsView(scene, parent)
          {}

       protected:
          virtual void resizeEvent(QResizeEvent *event)
          {
             fitInView(scene()->sceneRect());
             QGraphicsView::resizeEvent(event);
          }
    };



    //==============================================================================   main
    int main(int argc, char **argv)
    {
       QApplication app(argc, argv);

       QGraphicsRectWidget *button1 = new QGraphicsRectWidget( Qt::blue );
       QGraphicsRectWidget *button2 = new QGraphicsRectWidget( Qt::red );
       QGraphicsRectWidget *button3 = new QGraphicsRectWidget( Qt::green );
       QGraphicsRectWidget *button4 = new QGraphicsRectWidget( Qt::yellow );


       static const int ObjectName = 0;
       button1->setObjectName( "B01" );
       button1->setX(5);
       button1->setY(5);
       button1->setZValue(0);
       button1->setData(ObjectName, "B01" );

       button2->setObjectName( "B02" );
       button2->setX(250);
       button2->setY(5);
       button2->setZValue(1);
       button2->setData(ObjectName, "B02" );

       button3->setObjectName( "B03" );
       button3->setX(250);
       button3->setY(250);
       button3->setZValue(2);
       button3->setData(ObjectName, "B03" );

       button4->setObjectName( "B04" );
       button4->setX(5);
       button4->setY(250);
       button4->setZValue(3);
       button4->setData(ObjectName, "B04" );

       GraphicsScene scene;
       scene.setSceneRect(0, 0, 300, 300);
       scene.setBackgroundBrush(Qt::black);
       scene.addItem(button1);
       scene.addItem(button2);
       scene.addItem(button3);
       scene.addItem(button4);

       GraphicsView window(&scene);
       window.setFrameStyle(0);
       window.setAlignment(Qt::AlignLeft | Qt::AlignTop);
       window.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
       window.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

       window.resize(300, 300);
       window.show();

       return app.exec();
    }

    #include "main.moc"

Das kommt dann im Debug raus:

Found: "B02"
Found: "B03"
Found: "B04"
Found: "B01"
NOT Found

usw.....

Gruß
Andy
der_burner
Beiträge: 10
Registriert: 28. Oktober 2013 17:21

Re: ObjectName

Beitrag von der_burner »

Wenn ich das jetzt richtig sehe, wählst du das Objekt mit der Maus aus. Genau das will ich ja nicht!

Code: Alles auswählen

 QGraphicsItem * item = this->itemAt(mouseEvent->lastScenePos());
Ich möchte das ich per Name, das Objekt bekomme. z.B. gibt es irgendwo ein LineEdit wo ich einen Namen eintragen kann und würde dann genau das Objekt auch auswählen, nicht erst alle Objekte in der Scene durchgehen und vergleichen ob es den gewünschten Namen auch hat. Genau dafür schein ja auch findChild zu sein, aber es klappt nicht.

http://qt-project.org/doc/qt-4.8/qobject.html#findChild
Hulk2442
Beiträge: 115
Registriert: 10. Januar 2007 13:44

Re: ObjectName

Beitrag von Hulk2442 »

@trendyAndy
Ich weiß was du meinst jedoch wird in diesem Fall eine Funktionalität programmiert welche laut Beschreibung schon funktionieren sollte und dann musst du erst recht „alle“ items überprüfen.
( Für den Mausklick gibt es eine eigene schnellere Lösung -> mouseEvent im Item Selbst.)

@der_burner
Man könnte auch eine QMap benutzen. Damit wäre der Zugriff schneller als mit einer direkten Suche.
Und irgendwo muss ja eine Zuweisung zwischen Namen und Objekten sowieso durchgeführt werden.

Code: Alles auswählen

//Map
Qmap<Qstring, QGraphicsItem *> map;
...
//insert
map.insert( „Item_001“, pItem );
...
//access
pItem = map.value( myString );
Das Löst zwar das Problem nicht jedoch ist kurzfristig einsetzbar.
der_burner
Beiträge: 10
Registriert: 28. Oktober 2013 17:21

Re: ObjectName

Beitrag von der_burner »

@hulk2442
Ja, das wäre ein schöner Workaround, an so etwas ähnlichem hatte ich auch schon gedacht. Aber ich hab gedacht, das findchild() eigentlich diese Aufgabe übernehmen sollte.
trendyAndy
Beiträge: 54
Registriert: 27. März 2009 15:01

Re: ObjectName

Beitrag von trendyAndy »

@hulk

Ich hatte das Beispiel von dir genommen, deshalb der Mausklick.
Geht findchild nicht auch alle childs durch um das gesuchte child zu finden?
Na ja ihr werdet schon was finden :D

Gruß
odt
Beiträge: 128
Registriert: 12. August 2010 11:49
Kontaktdaten:

Re: ObjectName

Beitrag von odt »

Das QGraphicsWidget ist von QGraphicsObject abgeleitet. Dabei habe ich im Hinterkopf, dass auch mit diesen QObject's innerhalb des Graphics-View-Framework's die Hiearchie von QGraphicsItem und nicht diejenige von QObject "relevant" ist.
Although QGraphicsObject inherits from both QObject and QGraphicsItem, you should use the functions provided by QGraphicsItem, not QObject, to manage the relationships between parent and child items.
Und da findChild auf QObject ist...
ODT Informatik GmbH, Reto Tschofenig
Antworten