【问题标题】:Slot is not being used插槽未被使用
【发布时间】:2014-10-17 08:20:21
【问题描述】:

我正在学习 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 标志,但没有帮助。 还有其他首选方法可以完成此任务或解决我的问题吗?

【问题讨论】:

  • 您是否尝试过使用完整签名? void QGraphicsScene::focusItemChanged(QGraphicsItem * newFocus, QGraphicsItem * oldFocus, Qt::FocusReason reason)
  • 是的,谢谢siliconmancer。你的回答很有帮助。虽然我的错误是更基础的。也许您可以在 SLOT/SIGNAL 中添加有关函数签名的位,而不仅仅是它的名称。

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


【解决方案1】:

根据documentation,您没有链接到信号的正确签名:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-06
      相关资源
      最近更新 更多