【发布时间】: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