Я изучаю сигналы/слоты в 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, но это не помогает. Есть ли другой предпочтительный способ сделать это или решить мою проблему?
Итак, в конце концов я нашел ответ на свой вопрос. Это была ошибка на моей стороне.
в connect() я использовал слоты без круглых скобок/параметров. Это должно было выглядеть так:
QObject::connect (scene,
SIGNAL(focusItemChanged(QGraphicsItem*,QGraphicsItem*,Qt::FocusReason)),
this,
SLOT(selectedItemChanged(QGraphicsItem*,QGraphicsItem*)));
Вы не связываетесь с сигнальной сигнатурой, согласно документации:
void QGraphicsScene::focusItemChanged( QGraphicsItem * newFocus, QGraphicsItem * oldFocus,
Qt::FocusReason reason)
а также обратите внимание, что вы можете проверить статус успешного соединения/отказа через тип возврата bool
метода QObject :: connect
void QGraphicsScene::focusItemChanged(QGraphicsItem * newFocus, QGraphicsItem * oldFocus, Qt::FocusReason reason)