본문 바로가기
SWE/Qt

Qt예제] QMenu 이용해 윈도우의 메뉴 만들기

by S나라라2 2019. 8. 29.
반응형

QMenu 

 : 윈도우에 메뉴를 만들 수 있는 기능

 

메뉴 아이템을 풀다운 방식으로 구성한다.

메뉴에 하위 아이템을 추가하려면 QmenuBar 위젯의 addMenu() 멤버 함수를 사용한다.

 

QMenuBar위젯은 메뉴를 이용하기 위해 사용되며, 개발자가 특정 메뉴를 구성하려면 QMenu 위젯을 사용해야한다.

 

사용법

fileMenu = menuBar()->addMenu(tr("&File")):

fileMenu->addAction(newAct);

 

예를 들어 QMenuBar : 음식을 담는 그릇

              QMenu : 이 그릇에 담겨있는 음식

 

 

<QMenu 위젯을 이용해 윈도우의 메뉴 만들기 >

 

예제 실행결과

 

// mywidget.h

#include <QMainWindow>

class QAction;
class QActionGroup;
class QLabel;
class QMenu;
class QHBoxLayout;

class MyWidget : public QMainWindow
{
	Q_OBJECT
    
public :
	MyWidget();
    
protected :
	void contextMenuEvent(QContextMenuEvent *event);
    
private :
	// QMenu 위젯으로 메뉴를 사용하기 위함.
    // fileMenu를 선언한 후
    // 이 메뉴의 하위 메뉴를 QAction위젯을 이용해 등록한다.
    QMenu *fileMenu;
    
    QAction *newAct;
    QAction *exitAct;
    
    QHBoxLayout *layout;
    
private slots :
    void newFile();
};

 

// mywidget.cpp

#include <QtGui>
#include "mywidget.h"

MyWidget::MyWidget()
{
	setFixedSize(500,200);

	static QIcon Img(QPixmap("./images/icon.png"));


	/* fileMenu라는 최상위 메뉴에 하위 메뉴를 등록하기 위한 코드이다.*/

	fileMenu = menuBar()->addMenu(tr("&File"));
	// 창에 메뉴를 등록하려면 addMenu() 멤버 함수를 사용해야 한다.
	// &File 이라는 파라미터는 메뉴의 제목을 표기해야 하며
	// &는 문자의 단축키를 의미한다.
	

	newAct = new QAction(Img, tr("&New"), this);
	// QAction 위젯을 사용하여 선언.
	// 첫 번째 파라미터 Img : 이미지 아이콘
	// 두 번째 파라미터 tr() : 이 메뉴의 제목
	// 세 번째 파라미터 this : QObject를 명시


	newAct->setShortcut(tr("Ctrl+N"));
	// 단축키 지정
	// ctrl과 N을 같이 누르면 이 메뉴의 이벤트가 발생한다.


	newAct->setStatusTip(tr("Create a new file"));
	// 창의 아래쪽에 있는 Status Bar 부분에 이 메뉴의 이벤트가 발생했을 때
	// 첫 번째 파라미터의 텍스트를 표기한다.


	connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));
	// 이 메뉴의 이벤트가 발생했을 때 newFile() 슬롯 함수를 호출하는 코드.
	
	
	exitAct = new QAction(tr("Exit"),this);
	exitAct->setShortcut(tr("Ctrl+Q"));
	exitAct->setStatusTip(tr("Exit the application"));
	connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));

	fileMenu->addAction(newAct);
	// fileMenu라는 상위 메뉴에 newAct라는 하위 메뉴를 포함시키기 위한 코드.
	
	fileMenu->addSeparator();
	// 각 메뉴 사이에 경계선이 필요한 경우 사용하는 함수

	fileMenu->addAction(exitAct);
	// 메뉴를 등록할 때 등록한 순서대로 메뉴가 표기되므로 등록 순서에 주의한다.

	statusBar()->showMessage(tr("A context menu is available by right-clicking"));
	// 창의 아래쪽에 있는 StatusBar에 파라미터의 텍스트를 출력하기 위해 사용.

	setWindowTitle(tr("Menus"));
	// 창의 제목 표시줄에 제목을 설정하기 위해.
}

void MyWidget::newFile()
{
	qDebug("newFile Menu Action");
}

/* 마우스 오른쪽 버튼을 클릭했을 때 발생하는 이벤트로,
	Context 메뉴를 사용하기 위한 함수*/
void MyWidget::contextMenuEvent(QContextMenuEvent *event)
{
	// 창에서 마우스 오른쪽 버튼을 클릭하면 앞의 함수가 호출되어
	// Context 메뉴를 화면에 출력하고 addAction()함수에 등록된 하위메뉴 항목이 출력된다.
	QMenu menu(this);
	menu.addAction(newAct);
	menu.exec(event->globalPos());
}

 

// main.cpp

#include <QApplication>
#include <QStyleFactory>

#include "mywidget.h"

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);
	MyWidget widget;

	QStringList styles = QStyleFactory::keys();
	app.setStyle( styles[3]);

	widget.show();
	return app.exec();
}
반응형