Seite 1 von 1
ObjectName
Verfasst: 5. November 2013 00:08
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
Re: ObjectName
Verfasst: 8. November 2013 11:30
von Hulk2442
Habe es jetzt nicht geteste jedoch "findchild" sollte funken
http://harmattan-dev.nokia.com/docs/lib ... #findChild
Re: ObjectName
Verfasst: 8. November 2013 12:02
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

Re: ObjectName
Verfasst: 11. November 2013 09:45
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"
Re: ObjectName
Verfasst: 12. November 2013 13:46
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
Re: ObjectName
Verfasst: 12. November 2013 14:23
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
Re: ObjectName
Verfasst: 12. November 2013 16:52
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.
Re: ObjectName
Verfasst: 12. November 2013 17:32
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.
Re: ObjectName
Verfasst: 12. November 2013 18:24
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
Gruß
Re: ObjectName
Verfasst: 12. November 2013 18:58
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...