최상위창으로 생성되는 메뉴, 툴바, 상태바 등을 갖는 위젯을 의미한다.
상하좌우에 메뉴(QMenuBar), 툴바(QToolBar), 상태바(QStatusBar) 등을 배치할 수 있다. 또한 도킹윈도(QDockWidget, 서브클래싱) 영역도 정해져 있다. 중앙 위젯은 QWidget에서 상속받은 위젯이면 된다(QMainWindow.setCentralWidget()).
내장QT위젯: QTextEdit
컨테이너위젯: QMdiArea(고전적인 MDI 인터페이스), QTabWidget(탭문서 형태의 인터페이스)
메뉴, 툴바, 상태바 등을 편리하게 생성하고 관리할 수 있는 개념. QAction에 메뉴에 표시되는 문자열, 아이콘, 단축키, 툴팁, 상태바에 나타나는 팁 문자열, 와츠디스 문자열 등을 지정할 수 있다.
메인윈도에서 액션으로 메뉴와 툴바를 구성하는 방법
1. 액션을 만들고 설정한다(아이콘, 단축키, 팁, slot 함수 연결 등)
2. 메뉴를 생성하고, 만들어둔 액션을 추가한다(QMenu.addAction())
3. 툴바를 생성하고, 만들어둔 액션을 추가한다(QToolBar.addAction())
class MainWindow(QMainWindow):
def __init__(self,parent=None):
QMainWindow.__init__(self,parent)
self.setWindowTitle('Shape')
self.setWindowIcon(QIcon(":/images/qt.png"))
self.myWidget = MyWidget()
self.setCentralWidget(self.myWidget)
# 액션을 생성한다.
self.newAction = QAction("&New", self)
self.newAction.setIcon(QIcon(":/images/new.png")
self.newAction.setShortcut("Ctrl+N") # or newAction.setShortcut(QKeySequence::New)
self.newAction.setStatusTip("Create a new file")
self.newAction.triggered.connect(newFile)
...
self.copyAction = QAction("&Copy", self)
...
self.copyAction.triggered.connect(myWidget.copy) # MyWidget::copy() 슬롯과 연결
# 메뉴를 만든다
fileMenu = self.menuBar().addMenu("&File")
fileMenu.addAction(self.newAction)
...
sperator = fileMenu.addSeparator()
fileMenu.addAction(self.exitAction)
# 툴바를 만든다
fileToolBar = self.addToolBar("&File")
fileToolBar.addAction(self.copyAction)
...
# 상태바를 만든다
....
setShortcut에서 단축키를 지정할 수 있다.
QAction.setStatusTip(text)로 상태바에 text가 표시되게 할 수 있다.
QAction.setCheckable(true)으로 체크가능한 액션을 만들 수 있다.
checkAction = QAction(self)
... set icon, shortcut, status tips
checkAction.setCheckable(True)
checAction.setChecked(True)
checkAction.toggled.connect(self.someSlot) # someSlot(bool)
on/off 상태에 따라 다른 아이콘
icon= QIcon(self)
icon.addFile(":/images/normal.png", QSize(), QIcon.Normal, QIcon.Off)
icon.addFile(":/images/pressed.png", QSize(), QIcon.Normal, QIcon.On)
someAction.setIcon(icon)
액션에는 활성화 상태와 체크 상태라는 두가지 상태가 존재할 수 있다. setEnabled(bool)로 설정할 수 있다.
몇 개의 체크액션을 묶어 그 중 하나만 선택 가능하도록 할 경우가 있다.
redAction = QAction("&Red",self)
... set icon, shortcut, tool tips, status tips
redAction.setCheckable(True)
redAction.setChecked(True) # initial check
greenAction = QAction("&Green",self)
... set icon, shortcut, tool tips, status tips
greenAction.setCheckable(True);
blueAction = QAction("&Blue",self)
... set icon, shortcut, tool tips, status tips
blueAction.setCheckable(True)
colorActionGroup = QActionGroup(self)
colorActionGroup.addAction(redAction)
colorActionGroup.addAction(greenAction)
colorActionGroup.addAction(blueAction)
redAction.setChecked(True) # actionGroup 중 하나의 액션을 체크상태로 초기화
colorActionGroup.triggered.connect(self.setColor)
# triggered(QAction*) - self.setColor(QAction*)