2016-05-03 1 views
1

Ich habe ein Widget, das von QGraphicsView inherhits etwa so:Der beste Weg, um ein Signal von QGraphicsItem seiner QGraphicView Verbindungs ​​

class MyWidget : public QGraphicsView 
{ 
    Q_OBJECT 

    public: 
    MyWidget(QWidget *parent); 
    ... 
    signal: 
    mySignal(); 
} 

Diese QGraphicsView eine Szene hat und die Szene hinzugefügt (custom) Elemente, die von QGraphicsObject erben so dass das Signal/Slots sind implementiert:

class CustomItem : public QGraphicsObject 
{ 
    Q_OBJECT 

public: 
    CustomItem(); 

    QVariant itemChange(GraphicsItemChange change, const QVariant &value); 
    void focusInEvent(QFocusEvent *event); 
    void focusOutEvent(QFocusEvent *event); 
    ... 
signal: 
    void itemSignal(); 
} 

Wenn das Element im Fokus ist ich mywidget der mySignal verbinden möchten, etwa so:

void CustomItem::focusInEvent(QFocusEvent *event) 
{ 
    connect(this, SIGNAL(itemSignal()), ???,SIGNAL(mySignal())); 
} 

Wie Sie sehen können, habe ich den Zeiger auf MyWidget mit Fragezeichen ausgefüllt, weil ich nicht sicher bin, was der beste Weg, um einen Zeiger darauf zu bekommen ist. Ich habe versucht, durch die Dokumentation zu gehen, um zu sehen, ob das Element irgendeine Methode oder ähnliches erbt, um seine QGraphicsView zu bekommen, aber ich konnte nichts finden. Übergibt MyWidget diesen Zeiger auf den Konstruktor des CustomItem und speichert es eine gute Methode?

Vielen Dank im Voraus :)

+1

Sie verkomplizieren die Dinge. Wahrscheinlich erstellen Sie diese 'CustomItem's in einer Klasse, die die Instanz von' MyWidget' enthält. Verbinden Sie das "CustomItem :: itemSignal" mit "MyWidget :: mySignal" dort. Wenn dasselbe Signal mehrmals angeschlossen wird, wird es mehrmals ausgelöst. – thuga

+0

Welche Qt-Version wird verwendet? Könntest du bereits die Funktion Pointer-basierte Verbindungssemantik verwenden? Ihre Version basiert auf dem veralteten String-Base Signal-Slot-Konzept und sollte nicht mehr verwendet werden. – KimKulling

+1

Was sind die technischen Aspekte, was ist das Ziel? Wenn Sie sich auf eine QGraphicsObject-basierte Instanz konzentrieren, was planen Sie in QGraphicsView? – TheDarkKnight

Antwort

0

Ein Hinweis: Sie müssen das Signal itemSignal() mit einem entsprechenden Schlitz verbinden:

MyWidget widget; 
QObject::connect(this, &CustomItem::itemSignal, &widget, &MyWidget::itemSlot); 
// or for older Qt-versions 
QObject::connect(this, SIGNAL(itemSignal(), &widget, SLOT(itemSlot)); 

Wenn Sie nicht über den Zeiger auf das Widget Sie können den Objektbaum über QGraphicsView :: items() durchsuchen und nach Ihrem Widget suchen.

+0

Vielen Dank für die Antwort :) Nicht Slot war beabsichtigt, weil meine Widget-Klasse das Signal weiter zu einer Interface-Klasse propagieren muss, weil mein Widget in einer Anwendung von Drittanbietern verwendet wird. Ich werde versuchen, den Objektbaum zu durchsuchen! – TSO

Verwandte Themen