PyQt 예제 쉬어가기 - 버튼 레이아웃 배치

일반적으로 버튼 레이아웃은 확인 버튼이 앞에 오고 취소 버튼이 뒤로 간다. 그러나 모든 윈도우 환경이 이와 같은 것은 아니다.

맥이나 그놈의 경우 버튼 순서가 반대로 되어 있다. 그렇기 때문에 버튼을 배치할 때 사용자의 환경을 고려하지 않고 버튼을 배치하게 되면 사용자의 실수가 발생을 하게 된다.

이를 막기 위해서 PyQt 에서는 사용자 환경에 따라서 버튼 배치를 알맞게 해주는 클래스를 가지고 있다.


QDialogButtonBox 클래스를 이용하면 위와 같은 문제를 해결할 수 있는데, 이를 사용하는 방법을 지난 번에 이용한 프로그램에서 알아보겠다.

먼저, 클래스를 생성하는 방법이다. 클래스를 생성하는 방법은 정렬 방식과 비슷한 방법을 사용한다.

정렬 방법에서 비트 연산 방법을 이용한 것처럼 버튼 생성도 비트 연산 방법을 사용한다.
buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
이렇게 사용을 하면 ok 버튼과 cancel 버튼이 삽입되어 진다. (이 외의 버튼은 레퍼런스를 참고하면 된다.)

그리고 기본 버튼(Default Button)을 생성하기 위해 아래와 같은 방법을 쓰면 된다.
(기본 버튼이란 버튼이 아니면서 엔터 키를 처리하지 않는 위젯에 초점이 있을 때 엔터를 눌렀을 경우 기본적으로 작동하는 버튼을 말한다.)
buttonBox.button(QDialogButtonBox.Ok).setDefault(True)
그리고 이렇게 생성하는 위젯은 하나 이기 때문에 직접 위젯을 레이아웃에 추가할 수 있다. 지난번 프로그램에 위젯을 넣으면
layout.addWidget(buttonBox, 3, 0, 1, 3)
와 같이 쓸 수 있다.

마지막으로 버튼을 연결할 때 clicked() 시그널을 사용하지 않고 특별한 시그널을 사용해서 처리를 하게 된다.
self.connect(buttonBox, SIGNAL("accepted()"), self, SLOT("accept()"))
self.connect(buttonBox, SIGNAL("rejected()"), self, SLOT("reject()"))
이와 같이 accepted() 시그널은 확인 버튼에 대한 시그널이고, rejected() 시그널은 취소 버튼에 대한 시그널이다.

그리고 QDialogButtonBox 는 기본적으로 수평 레이아웃을 가지고 있는데, 수직 레이아웃으로 변경을 하려면 Qt.Vertical 을 통과시키면 된다. 사용 방법은 클래스를 생성할 때 인자로 통과시키거나 setOrientation() 메소드에 통과를 시키면 된다.

참고로 이렇게 버튼을 생성할 경우 버튼에 이름을 삽입하지 못한다. 즉, 번역이 불가능하다는 점이 있는데, 이러한 경우에는 직접 만든 버튼을 추가해서 사용하는 방법이 있다.
buttonBox = QDialogButtonBox()
buttonBox.addButton(okButton, QDialogButtonBox.AcceptRole)
buttonBox.addButton(cancelButton, QDialogButtonBox.RejectRole)
okButton.setDefault(True)
이와 같이 okButton 을 확인 역할을 하는 버튼으로 설정해서 추가를 해주고, cancelButton 을 취소 역할을 하는 버튼으로 설정해서 추가를 해주면 된다.

그리고 connect 의 경우 clicked() 시그널을 사용할 수도 있고, accepted() 나 rejected() 시그널을 사용할 수도 있다.

댓글 없음:

댓글 쓰기