티스토리 뷰

designer로 만든 ui를 pyqt에서 사용하는 방법은 크게 2가지 방법이 있다.

  1. ui를 pyuic를 이용하여 python코드로 변환하는 방법
  2. ui를 uic.loadUi()를 이용하는 방법

2번의 방법을 이용하는 경우, uic.loadUi()로 생성된 객체를 통해서 접근을 해야 하므로 개인적으로 1번의 방법을 사용하고 있다. 그래서 1번의 방법을 이용해서 ui를 상속받아 사용하는 방법에 대해 기록할려고 한다.

pyuic를 사용하는 방법은 http://ruriro.tistory.com/4를 참고하면 된다.

disigner로 만든 화면은 크게 두가지로 볼 수 있다.

  1. 메인윈도우(main window)
  2. 다이얼로그(dialog)

메인윈도우는 프로그램에서 단 하나의 최상위 화면으로 볼 수 있다. 그래서 프로그램에서 메인 윈도우는 하나이상 가질 수 없다. 하지만 프로그램은 여러개의 다이얼로그를 가질 수 있다.

pyqt에서 특이한 점으로 다이얼로그가 최상위 화면이 될 수 있다는 사실이다. 이렇게 다이얼로그를 최상위 화면이 될 수 있어서, 간단하게 다이얼로그를 테스트해 볼 수 있고, 하나의 다이얼로그로 프로그램으로 만들어 사용할 수도 있다.

하지만 다이얼로그는 메뉴바(menu bar)와 상태바(state bar)를 가질 수 없으므로 메인윈도우를 최상위 화면으로 사용하는 것이 좋다.

이제 desiger로 만들어진 ui를 pyuic로 변환된 py를 상속받아 사용하는 방법에 대해서 알아보자.

메인윈도우를 상속받는 경우

import search_window 


class SearchWindow(QtCore.QMainWindow, search_window.Ui_SearchWindow)
    def __init__(self):
        QtCore.QMainWindow.__init__(self)
        self.setupUi(self)

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    window = SearchWindow()
    window.show()
    sys.exit(app.exec_())

위의 예제코드에서 pyuic로 변환된 py파일인 searchwindw를 import하고, SearchWindow라는 클래스는 만들었다. SearchWindow클래스는 QtCore.QMainWindow, searchwindow.Ui_SearchWindow를 상속받는다. 여기까지는 다이얼로그를 상속받는 경우와 동일하다. 하지만 클래스를 초기화하는 부분과 클래스를 실행시키는 부분이 달라진다.

QtCore.QMainWindow.init()과 self.setupUi()의 매개변수는 누구를 부모로 할 것인지를 매개변수로 전달하게 된다. 이때 SearchWindow는 메인윈도우가 되므로 자신이 부모가 되어야 한다. 그래서 클래스 초기화시 QtCore.QMainWindow.init()과 self.setupUi()에 self(자신)를 전달하는 것을 볼 수 있다.

이렇게 만들어진 클래스를 실행(exec_)할 때는 위의 예제와 같이 사용하는 것을 볼 수 있다.

다이얼로그를 상속받는 경우

import search_dialog


class SearchDialog(QtCore.QDialog, search_dialog.Ui_SearchDialog)
    def __init__(self, parent=None):
        QtCore.QDialog.__init__(self, parent)
        self.setupUi(self)

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    dialog = SearchDialog()
    dialog.show()
    sys.exit(app.exec_())

위의 예제코드는 메인윈도우를 상속받는 경우와 틀린점이 많이 없다. 크게 틀린점은 다이얼로그는 초기화시 부모(parent)를 매개변수로 전달받는다는 점이다. 그 이유는 다이얼로그가 최상위화면이 될 수도 있지만, 자녀(child)화면이 될수도 있기 때문이다.

전달받는 부모는 상속받은 QtGui.QDialog의 초기화에 매개변수로 전달하게 된다. 이 과정을 통해서 다이얼로그 클래스의 부모가 정해진다. 그리고 self.setupUi에는 self를 전달함으로 이 클래스가 부모가 된다.

이렇게 만들어진 클래스를 실행(exec_)할 때는 부모를 전달해야 한다. 하지만 parent=None으로 되어 있으므로, 굳히 parent를 전달하지 않고 실행할 수도 있다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함