본문 바로가기
SWE/Qt

Qt 버튼 클릭 이벤트 코드 예제 Signal Slot등록

by S나라라2 2019. 10. 30.
반응형

상황

버튼이 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 )
반응형