2

我在处理 Qt 中的点击时遇到了问题。我有以下课程:

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);
    }
};

现在我想将一个插槽连接到信号,我执行以下操作:

   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()));

当我运行它时,会显示圆圈,canvas但是当我单击圆圈时没有任何反应,控制台显示以下内容:

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

有什么建议么?

4

2 回答 2

4

您是否已经尝试过:

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

据我所知,来自 QGraphicsScene 的信号 selectionChanged 没有任何参数:http: //qt-project.org/doc/qt-4.8/qgraphicsscene.html#selectionChanged

在这里,您尝试将来自 QGRaphicsScene 的信号连接到插槽“测试”,而不是您在 MyRectItem 中定义的信号。如果您想连接来自 MyRectItem 的信号,您应该执行以下操作:

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

第一个参数是信号的来源(发送者)。

杰拉德

于 2012-04-10T11:57:37.510 回答
2

控制台消息就是您的答案。由于您没有指定您使用的 Qt 版本,我将假设 4.8 作为最新的稳定版本。从这里可以看出,确实没有这样的信号

selectionChanged(bool)

但是,有一个信号

selectionChanged()
于 2012-04-10T11:47:06.263 回答