프로그래밍
QMenu에서 라디오 버튼 방식 메뉴 구현하기
야라바
2024. 1. 4. 21:15
728x90
QT UI 앱을 작성하다가 특정 메뉴의 서브 메뉴 일부를 라디오 버튼 동작 방식처럼 그룹 중 일부만 선택되도록 하는 필요가 생겼다. 서브 메뉴를 열면 현재 선택 상태도 보인다.
먼저 결과 화면먼저 보면 위의 그림과 같다. 개별 서브메뉴를 선택했을 때 미리 설정된 액션 슬롯도 수행하고 어떤 메뉴가 선택 상태인지도 표시된다.
actZoom40 = new QAction(QIcon(), _("40%"),this);
connect(actZoom40, SIGNAL(triggered()), this, SLOT(OnZoom40Menu()));
actZoom70 = new QAction(QIcon(), _("70%"),this);
connect(actZoom70, SIGNAL(triggered()), this, SLOT(OnZoom70Menu()));
actZoom100 = new QAction(QIcon(), _("100%"),this);
connect(actZoom100, SIGNAL(triggered()), this, SLOT(OnZoom100Menu()));
actZoom150 = new QAction(QIcon(), _("150%"),this);
connect(actZoom150, SIGNAL(triggered()), this, SLOT(OnZoom150Menu()));
actZoom200 = new QAction(QIcon(), _("200%"),this);
connect(actZoom200, SIGNAL(triggered()), this, SLOT(OnZoom200Menu()));
actZoom400 = new QAction(QIcon(), _("400%"),this);
connect(actZoom400, SIGNAL(triggered()), this, SLOT(OnZoom400Menu()));
actZoom40->setCheckable(true);
actZoom70->setCheckable(true);
actZoom100->setCheckable(true);
actZoom150->setCheckable(true);
actZoom200->setCheckable(true);
actZoom400->setCheckable(true);
작업을 위해서 먼저 각 서브메뉴에 대한 QAction을 정의하고 해당하는 슬롯(Slot)을 설정한다. 그리고 중요한 점이 있는데 각 액션에 대하여 setCheckable(true)를 설정해 주어야 한다.
mn_zoom = mn_view->addMenu(_("&Zoom"));
QActionGroup *zactgrp = new QActionGroup(this);
zactgrp->setExclusive(true);
zactgrp->addAction(actZoom40);
zactgrp->addAction(actZoom70);
zactgrp->addAction(actZoom100);
zactgrp->addAction(actZoom150);
zactgrp->addAction(actZoom200);
zactgrp->addAction(actZoom400);
mn_zoom->addAction(actZoom40);
mn_zoom->addAction(actZoom70);
mn_zoom->addAction(actZoom100);
mn_zoom->addAction(actZoom150);
mn_zoom->addAction(actZoom200);
mn_zoom->addAction(actZoom400);
actZoom100->setChecked(true);
상위 메뉴에 각 서브메뉴를 addAction()으로 추가해 주는 것은 다른 메뉴형태와 동일한데, 메뉴 기능을 수행하면서 라디오 버튼처럼 동작하게 하려면 QActionGroup을 생성하여 액션 그룹에 addAction()으로 각 서브메뉴를 추가해 주고 setExclusive(true)로 설정해야 한다. 특정 액션을 선택하는 것은 위의 코드처럼 해당 액션에 대하여 setChecked(true)를 설정하면 그룹에 있는 여러 서브메뉴 중에 해당 액션만 선택 상태가 된다.
728x90