2012-04-10 3 views
2

Ich bin mit einem Problem konfrontiert, um Klicks in Qt zu behandeln. Ich habe die folgende Klasse:Qt Objektsignale sind nicht mit Methoden (Handler) verbunden

class MyRectItem : public QObject, public QGraphicsEllipseItem{ 
    Q_OBJECT 
public:  
    MyRectItem(double x,double y, double w, double h) 
    : QGraphicsEllipseItem(x,y,w,h)  
    {} 

public slots:  
    void test() { 
     QMessageBox::information(0, "This", "Is working"); 
     printf("asd"); 
    } 
signals:  
    void selectionChanged(bool newState); 

protected:  
    QVariant itemChange(GraphicsItemChange change, const QVariant &value) { 
     if (change == QGraphicsItem::ItemSelectedChange){ 
      bool newState = value.toBool(); 
      emit selectionChanged(newState); 
     } 
     return QGraphicsItem::itemChange(change, value); 
    } 
}; 

Jetzt möchte ich einen Schlitz auf das Signal verbinden, ich folgendes:

MyRectItem *i = new MyRectItem(-d, -d, d, d); 
     i->setPen(QPen(Qt::darkBlue)); 
     i->setPos(150,150); 
     // canvas is a QGraphicsScene 
     canvas.addItem(i); 
     i->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable); 
     QObject::connect(&canvas, SIGNAL(selectionChanged(bool)), this, SLOT(test())); 

Als ich dies ausführen, wird der Kreis auf canvas angezeigt, aber wenn ich Klicken Sie auf den Kreis nichts passiert und die Konsole zeigt Folgendes:

Object::connect: No such signal QGraphicsScene::selectionChanged(bool) 

Irgendwelche Vorschläge?

Antwort

2

Die Konsolennachricht ist Ihre Antwort. Da Sie die Version von Qt, die Sie verwenden, nicht angegeben haben, möchte ich annehmen, dass 4.8 das neueste stabile ist. Wie aus here zu sehen, es ist wirklich nicht ein solches Signal als

selectionChanged(bool) 

jedoch ist, gibt es ein Signal

selectionChanged() 
4

Sie dies bereits versucht:

QObject::connect(&canvas, SIGNAL(selectionChanged()), this, SLOT(test())); 

als Soweit ich weiß, hat die Signalauswahl aus QGraphicsScene keinen Parameter: http://qt-project.org/doc/qt-4.8/qgraphicsscene.html#selectionChanged.

Hier versuchen Sie, das Signal von QGRaphicsScene mit dem Steckplatz "Test" zu verbinden, nicht mit dem Signal, das Sie in MyRectItem definiert haben. Wenn Sie das Signal von MyRectItem anschließen möchten, sollten Sie so etwas wie tun:

QObject::connect(i, SIGNAL(selectionChanged(bool)), this, SLOT(test())); 

Der erste Parameter ist die Quelle (Sender) des Signals.

Gerald

Verwandte Themen