반응형
상황
버튼이 2개( m_buttonGraphicMode, m_buttonTableMode) 있고, 그 두개의 버튼을 m_buttonGroup이 싸고 있다.
m_buttonGraphicMode 버튼을 클릭 시, 화면에 보여지는 stackedWidget을 Graphic으로 바꾸고, 해당 버튼을 비활성화한다.
m_buttonTableMode 버튼을 클릭 시, 화면에 보여지는 stackedWidget을 Table로 바꾸고, 해당 버튼을 비활성화 한다.
/* 객체 생성 */ QButtonGroup* m_buttonGroup = new QButtonGroup; QPushButton* m_buttonTableMode = new QPushButton; QPushButton* m_buttonGraphicMode = new QPushButton;
방법 1.
/* 버튼 클릭 시그널 등록 */ // 방법 1. buttonGroup을 시그널로 등록 - NOT WORKING connect(m_buttonGroup, SIGNAL(buttonClicked(QPushButton*)), this, SLOT(changeViewMode(QPushButton*))); void changeViewMode(QPushButton* button) { if( button == m_buttonTableMode ) { m_buttonTableMode->setEnabled(false); m_buttonGraphicMode->setEnabled(true); m_stackedWidget->setCurrentIndex(VIEWMODE_TABLE); } else { m_buttonTableMode->setEnabled(true); m_buttonGraphicMode->setEnabled(false); m_stackedWidget->setCurrentIndex(VIEWMODE_GRAPHIC); } }
방법 2.
/* 버튼 클릭 시그널 등록 */ // 방법 2. buttonGroup을 시그널로 등록하고, 파라미터를 받지 않는 SLOT 함수 - NOT WORKING connect(m_buttonGroup, SIGNAL(buttoncClicked(QPushButton*)), this, SLOT(changeViewMode())); void changeViewMode() { if( m_buttonTableMode->isDown() ) // 본 slot function에 들어왔을 때는, 버튼이 '눌린 상태'가 아니기때문에 동작 안함. { m_buttonTableMode->setEnabled(false); m_buttonGraphicMode->setEnabled(true); m_stackedWidget->setCurrentIndex(VIEWMODE_TABLE); } else if( m_buttonGraphicMode->isDown() ) { m_buttonTableMode->setEnabled(true); m_buttonGraphicMode->setEnabled(false); m_stackedWidget->setCurrentIndex(VIEWMODE_GRAPHIC); } }
방법 3.
/* 버튼 클릭 시그널 등록 */ // 방법 3. button 각각 등록 - NOT WORKING connect(m_buttonTableMode, SIGNAL(clicked()), this, SLOT(changeViewMode(m_buttonTableMode)) ); connect(m_buttonGraphicMode, SIGNAL(clicked()), this, SLOT(changeViewMode(m_buttonGrahicMode)) ); void changeViewMode(QPushButton* button) { if ( button == m_buttonTableMode ) { m_buttonTableMode->setEnabled(false); m_buttonGraphicMode->setEnabled(true); m_stackedWidget->setCurrentIndex(VIEWMODE_TABLE); } else { m_buttonTableMode->setEnabled(true); m_buttonGraphicMode->setEnabled(false); m_stackedWidget->setCurrentIndex(VIEWMODE_GRAPHIC); } }
"방법 4" WORKING!
/* 버튼 클릭 시그널 등록 */ // 방법 4. button 각각 등록, 2개의 SLOT함수 개별 생성 - WORKING, THE BEST WAY connect(m_buttonTableMode, SIGNAL(clicked()), this, SLOT(changeToTableMode())); connect(m_buttonGraphicMode, SIGANAL(clicked()), this, SLOT(changeToGraphicMode())); void changeToGraphicMode() { changeMode(VIEWMODE_GRAPHIC); } void changeToTableMode() { changeMode(VIEMODE_TABLE); } void changeMode(ViewMode mode) { m_buttonGraphicMode->setEnabled(mode==VIEWMODE_TABLE); m_buttonTableMode->setEnabled(mode==VIEWMODE_GRAPHIC); m_stackedWidget->setCurrentIndex(mode); }
slot함수 내에서도 클릭된 객체를 확인하여 처리하는 방법이 있기는 하다. 아래와 같은 방식으로 가능.
Object* obj = sender(); if( obj == m_buttonTableMode )
반응형