ObjectName
-
- Beiträge: 10
- Registriert: 28. Oktober 2013 17:21
ObjectName
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
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
Habe es jetzt nicht geteste jedoch "findchild" sollte funken
http://harmattan-dev.nokia.com/docs/lib ... #findChild
http://harmattan-dev.nokia.com/docs/lib ... #findChild
-
- Beiträge: 10
- Registriert: 28. Oktober 2013 17:21
Re: ObjectName
Die Doku habe ich gelesen und ausprobiert habe ich das auch. Aber es klappt nichtder_burner hat geschrieben:Ich habe mit scene->findChild() rumprobiert, hab das aber nicht zum laufen bekommen. Könnt Ihr mir helfen?
Re: ObjectName
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
main.cpp
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 \
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"
-
- Beiträge: 54
- Registriert: 27. März 2009 15:01
Re: ObjectName
Servus!
Du kannst mit setData dem Item einen ObjectName vergeben. Anderst gehts meines Wissens nach nicht.
Das kommt dann im Debug raus:
Found: "B02"
Found: "B03"
Found: "B04"
Found: "B01"
NOT Found
usw.....
Gruß
Andy
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"
Found: "B02"
Found: "B03"
Found: "B04"
Found: "B01"
NOT Found
usw.....
Gruß
Andy
-
- Beiträge: 10
- Registriert: 28. Oktober 2013 17:21
Re: ObjectName
Wenn ich das jetzt richtig sehe, wählst du das Objekt mit der Maus aus. Genau das will ich ja nicht!
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
Code: Alles auswählen
QGraphicsItem * item = this->itemAt(mouseEvent->lastScenePos());
http://qt-project.org/doc/qt-4.8/qobject.html#findChild
Re: ObjectName
@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.
Das Löst zwar das Problem nicht jedoch ist kurzfristig einsetzbar.
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 );
-
- Beiträge: 10
- Registriert: 28. Oktober 2013 17:21
Re: ObjectName
@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.
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.
-
- Beiträge: 54
- Registriert: 27. März 2009 15:01
Re: ObjectName
@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ß
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
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.
Und da findChild auf QObject 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.
ODT Informatik GmbH, Reto Tschofenig