2014-10-17 4 views
0

Qt에서 신호/슬롯을 학습 중이며 문제가 있음을 발견했습니다. 나는 (QGraphicsView의) QGraphicsScene의 항목을 이동하거나 선택했을 때 호출되는 자체 슬롯을 만들어야합니다.슬롯이 사용되지 않습니다.

하나의 위젯이 있고 그래픽보기와 라벨 인 간단한 앱부터 시작합니다. 내 창에 슬롯을 만들고 QGraphicsScene의 신호에 연결했지만 사용되지는 않았습니다. 내 실수는 어디 갔지? 나는 그것을 확인 RINS probram을 실행할 때, 지금

//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())); 
    } 
} 

,하지만 난 현장에 그려진 원 (타원)에 초점을 설정할 수 없습니다 슬롯을 사용하지 : 여기

는 코드입니다. IsSelectable 플래그를 설정하려고했지만 도움이되지 않습니다. 이 문제를 해결하기위한 다른 방법이 있습니까?

+2

전체 서명을 사용해 보셨습니까? 'void QGraphicsScene :: focusItemChanged (QGraphicsItem * newFocus, QGraphicsItem * oldFocus, Qt :: FocusReason 이유)' –

+1

http://stackoverflow.com/questions/26422154/code-compiles-by-slot-is-not-invoked-called -used-worked-executed는 아마 당신을 도울 것입니다. – Silicomancer

+0

그래, 고마워. 귀하의 대답은 도움이되었습니다. 내 실수는 훨씬 기본적인 수준 이었지만. SLOT/SIGNAL에 함수 시그니처에 대한 비트를 추가 할 수 있습니다. – mishan

답변

0

결국 결국 나는 내 자신의 질문에 대한 답을 찾았습니다. 그것은 내 편이 었어.

connect()에서 괄호/매개 변수없이 슬롯을 사용했습니다. 그것은 다음과 같아야합니다 :

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

당신은 documentation에 따라, 신호의 권리 서명에 연결하지 않을 :

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

을하고 또한 당신이 QObject::connect 방법의 bool 반환 형식을 통해 연결의 성공/실패 상태를 확인할 수 있습니다 것을 알 수