Слот не используется

Я изучаю сигналы/слоты в Qt и обнаружил проблему. Мне нужно создать собственный слот, который вызывается при перемещении или выборе элементов в QGraphicsScene (в QGraphicsView).

Я начинаю с простого приложения, в котором есть один виджет, а на нем — GraphicsView и ярлык. Я создал слот в своем окне и подключил его к сигналу QGraphicsScene, но он не используется. Где моя ошибка?

Вот код:

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

Теперь, когда я запускаю программу, она работает нормально, но я не могу установить фокус на круги (эллипсы), нарисованные на сцене, и слот не используется. Пробовал ставить флаг IsSelectable, не помогает. Есть ли другой предпочтительный способ сделать это или решить мою проблему?


person mishan    schedule 17.10.2014    source источник
comment
Вы пробовали использовать полную подпись? void QGraphicsScene::focusItemChanged(QGraphicsItem * newFocus, QGraphicsItem * oldFocus, Qt::FocusReason reason)   -  person Marco A.    schedule 17.10.2014
comment
stackoverflow.com/questions/26422154/, вероятно, вам поможет.   -  person Silicomancer    schedule 17.10.2014
comment
Ага, спасибо, силиконмансер. Ваш ответ был полезен. Хотя моя ошибка была еще более базового уровня. Возможно, вы можете добавить немного о сигнатуре функции в SLOT/SIGNAL, а не только о ее имени.   -  person mishan    schedule 17.10.2014


Ответы (2)



Итак, в конце концов я нашел ответ на свой вопрос. Это была ошибка с моей стороны.

в connect() я использовал слоты без скобок/параметров. Это должно было выглядеть так:

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