Search code examples
c++qtqwidgetqgraphicssceneqt-signals

Slot is not being used


I'm learning the signals/slots in Qt and I have found a problem. I need to create my own slot that is called when items on QGraphicsScene (in QGraphicsView) are moved or selected.

I'm starting with a simple app that has one widget and on it is graphicsView and label. I've created a slot in my window and connected it to QGraphicsScene's signal, but it is not being used. Where is my mistake?

Here is the code:

//MainWindow.h
//as generated by QtCreator, just added one slot to it
...omitted for brevity...

public slots:
       void selectedItemChanged(QGraphicsItem * newItem, QgraphicsItem * oldItem);

..omitted for brevity...

//------------------------------------------------------------------

//MainWindow.cpp
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   QGraphicsScene * scene = new QGraphicsScene();
   scene->setBackgroundBrush (QBrush(Qt::gray));
   ui->graphicsView->setScene (scene);

   for(int x = 10; x < 250; x+=20)
   {
      QGraphicsEllipseItem * item = scene->addEllipse (x,x,5,5,QPen(Qt::darkGreen),QBrush(Qt::darkGreen));
     item->setFlag (QGraphicsItem::ItemIsFocusable,true);
   }

   QObject::connect (scene,SIGNAL(focusItemChanged),this,SLOT(selectedItemChanged));
}

void MainWindow::selectedItemChanged (QGraphicsItem *newItem, QGraphicsItem *oldItem)
{
   qDebug()<<"called";
   if(newItem == 0)
   {
      ui->label->setText ("Není vybrán bod");
   }
   else
   {
      ui->label->setText (QString::number (newItem->scenePos ().x ()) + "," + QString::number (newItem->scenePos ().y ()));
   }
}

Now, when I run the probram it rins ok, but I cannot set Focus on the circles(ellipses) drawn on the scene and the slot is not used. I tried setting IsSelectable flag, but it does not help. Is there any other preferred way to get this done or solution to my problem?


Solution

  • So, in the end i found the answer to my own question. It was a mistake on my side.

    in the connect() i used the slots without parenthesis/parameters. It should have looked like:

    QObject::connect (scene,
                      SIGNAL(focusItemChanged(QGraphicsItem*,QGraphicsItem*,Qt::FocusReason)),
                      this,
                      SLOT(selectedItemChanged(QGraphicsItem*,QGraphicsItem*)));