728x90

하나의 Signal을 처리할 때 여러 Slot 함수를 만들지 않고 싶다면 sender() 함수를 사용하여 처리할 수 있습니다. 이전 포스팅에서 사용했던 QSplitter로 예를 들어보겠습니다.

 

Horizontal, Vertical QSplitter가 있습니다. QSplitter의 이동이 끝나면 splitterMoved라는 Signal이 발생하고 이 Signal이 발생됐을 때 하나의 Slot 함수로 처리하고 싶습니다.

connect(horizonSplitter, SIGNAL(splitterMoved(int, int)), this, SLOT(slot_setSpliterState(int, int)));
connect(verticalSplitter, SIGNAL(splitterMoved(int, int)), this, SLOT(slot_setSpliterState(int, int)));

이럴 때 slot에서는 어떤 QObject에서 Signal이 발생한 것인지 알아야 그에 맞는 처리를 할 수 있습니다. 이럴 때 사용하는 것이 sender 함수 입니다.

void MainWindow::slot_setSpliterState(int pos, int index)
{
    const QString sKeyHorizonSplitter = "Spliiter/horizon";
    const QString sKeyVerticalSplitter = "Spliiter/vertical";
    
    QObject* obj = sender();
    if ( obj == nullptr ) { return; }

    if ( obj == horizonSplitter ) {
        qsetting->setValue(sKeyHorizonSplitter, horizonSplitter->saveState());
    } else if ( obj == verticalSplitter ) {
        qsetting->setValue(sKeyVerticalSplitter, verticalSplitter->saveState());
    }
}

위 코드는 sender를 통해 splitter를 비교 후 해당 splitter에 맞는 key-value로 세팅하는 코드입니다.

728x90

+ Recent posts