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

0

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

Я начинаю с простого приложения, которое имеет один виджет, а на нем - графический интерфейс и ярлык. Я создал слот в моем окне и подключил его к сигналу 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 ()));
   }
}

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

  • 2
    Вы пытались использовать полную подпись? void QGraphicsScene::focusItemChanged(QGraphicsItem * newFocus, QGraphicsItem * oldFocus, Qt::FocusReason reason)
  • 1
    stackoverflow.com/questions/26422154/… вероятно, поможет вам.
Показать ещё 1 комментарий
Теги:
qt
qgraphicsscene
qwidget
qt-signals

2 ответа

0
Лучший ответ

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

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

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

Вы не связываетесь с сигнальной сигнатурой, согласно документации:

void QGraphicsScene::focusItemChanged( QGraphicsItem * newFocus, QGraphicsItem * oldFocus,
                                       Qt::FocusReason reason)

а также обратите внимание, что вы можете проверить статус успешного соединения/отказа через тип возврата bool метода QObject :: connect

Ещё вопросы

Сообщество Overcoder
Наверх
Меню