插槽没有被使用

时间:2014-10-17 08:20:21

标签: c++ qt qwidget qgraphicsscene qt-signals

我正在学习Qt中的信号/插槽,我发现了一个问题。我需要创建自己的插槽,当移动或选择QGraphicsScene(在QGraphicsView中)的项目时调用。

我从一个简单的应用程序开始,它有一个小部件,上面是graphicsView和label。我在我的窗口中创建了一个插槽并将其连接到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时,它可以正常运行,但是我无法将焦点设置在场景上绘制的圆圈(椭圆)上,并且不使用插槽。我尝试设置IsSelectable标志,但它没有帮助。 是否还有其他首选方法可以解决问题?

2 个答案:

答案 0 :(得分:3)

根据documentation

,您没有链接信号的正确签名
void QGraphicsScene::focusItemChanged( QGraphicsItem * newFocus, QGraphicsItem * oldFocus,
                                       Qt::FocusReason reason)

并注意到您可以通过QObject::connect方法的bool返回类型检查连接的成功/失败状态

答案 1 :(得分:0)

所以,最后我找到了自己问题的答案。这是我的错误。

在connect()中我使用了没有括号/参数的插槽。应该看起来像:

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