PyQt 예제 1.4


이번에는 라인 에디터(Line Editor)를 추가해보겠다.
#!/usr/bin/env python3

# Copyright (C) 2011년 bluekyu (http://blog.bluekyu.me/)
# 이 프로그램은 자유 소프트웨어입니다. 소프트웨어의 피양도자는 자유 소프트웨어
# 재단이 공표한 GNU 일반 공중 사용 허가서 2판 또는 그 이후 판을 임의로
# 선택해서, 그 규정에 따라 프로그램을 개작하거나 재배포할 수 있습니다.
# 이 프로그램은 유용하게 사용될 수 있으리라는 희망에서 배포되고 있지만,
# 특정한 목적에 맞는 적합성 여부나 판매용으로 사용할 수 있으리라는 묵시적인
# 보증을 포함한 어떠한 형태의 보증도 제공하지 않습니다. 보다 자세한 사항에
# 대해서는 GNU 일반 공중 사용 허가서를 참고하시기 바랍니다.

# 라인 에디터 추가.

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

__version__ = "1.4.1"

class Form(QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.label = QLabel("Hello, PyQt!")
        
        self.lineEdit = QLineEdit("This is LineEdit Widget")
        
        layout = QVBoxLayout()
        layout.addWidget(self.label)
        layout.addWidget(self.lineEdit)

        self.setLayout(layout)
        self.setWindowTitle("Main Dialog")
    
if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = Form()
    form.show()
    app.exec_()

레이블을 추가해봤듯이 같은 방법으로 라인 에디터의 인스턴스를 생성해서 위젯으로 추가해주면 된다. 그러나 라인 에디터에 편집만 가능할 뿐 특별한 것은 없다.

이제 여기에 특별한 기능을 추가해보자!

라인 에디터에 글을 입력한 후 엔터를 누르면 그 입력한 글이 레이블에 나타나게 하는 것이다.

-__version__ = "1.4.1"
+__version__ = "1.4.2"

 class Form(QDialog):
     def __init__(self, parent=None):
@@ -28,9 +28,15 @@ class Form(QDialog):
         layout = QVBoxLayout()
         layout.addWidget(self.label)
         layout.addWidget(self.lineEdit)
-
         self.setLayout(layout)
+
+        self.connect(self.lineEdit, SIGNAL("returnPressed()"),
+                        self.UpdateLabel)
+
         self.setWindowTitle("Main Dialog")
+
+    def UpdateLabel(self):
+        self.label.setText(self.lineEdit.text())
     
 if __name__ == "__main__":
     app = QApplication(sys.argv)
diff 를 이용해서 차이점만 보겠다.

self.connect 라는 메소드를 이용하고 있다. 이것은 이벤트를 처리해주는 메소드이다. 특히, Qt에 이벤트 처리 방법 중 하나인 시그널-슬롯(Signal-Slot) 기능이다.

이 메소드를 이용해서 self.lineEdit에서 나오는 시그널을 받게 된다. 보내는 시그널을 아주 다양할 것이다. 텍스트가 변경되었다던가, 엔터가 눌렸다던가, 마우스가 클릭되었다던가 등등...

그러나 이 메소드로는 오직 returnPressed() 라는 시그널만 받겠다. 즉, 엔터가 눌렸을 때에만 작동한다는 것이다. 그러면 엔터가 눌렸을 때 작동해야 할 반응이 필요할 것이다. 이것을 Slot으로 사용하게 된다.

이후에 이를 더 자세하게 다루겠지만, Slot에 파이썬 메소드가 올 수 있다. 따라서 아래에 정의된 UpdateLabel 이라는 메소드를 슬롯으로 처리해주면, 엔터가 눌렸을 때 이 메소드가 실행이 된다.

메소드를 살펴보면, 레이블에 텍스트를 설정해주라고 되어 있고, 이 텍스트는 라인 에디터의 텍스트를 넣으라고 되어 있다.

따라서 엔터를 누르면 레이블에 라인 에디터의 텍스트가 나타나게 되는 것이다!


추가로 좀 더 살펴보자.
-__version__ = "1.4.2"
+__version__ = "1.4.3"
 
 class Form(QDialog):
     def __init__(self, parent=None):
@@ -36,7 +36,8 @@ class Form(QDialog):
         self.setWindowTitle("Main Dialog")
 
     def UpdateLabel(self):
-        self.label.setText(self.lineEdit.text())
+        self.label.setText("<font color=red><b>" + self.lineEdit.text() +
+                            "</b></font>")
     
 if __name__ == "__main__":
     app = QApplication(sys.argv)
이번에는 라인 에디터에서 엔터를 친 후 레이블 텍스트를 변경할 때 색상과 강조를 해보겠다.

특별한 것은 아니고, 레이블에서 Rich Text라 하면서 HTML 포맷을 지원해준다. 이를 이용해서 font 태그와 b 태그를 이용해서 텍스트의 글자 색을 빨간색으로, 그리고 굵게 만들어 본 것이다.

HTML 태그를 찾아보고 이를 수정해보면 다양한 방식으로 글자를 나타낼 수 있을 것이다. 글자 색이나 크기, 이탤릭 등등...

댓글 없음:

댓글 쓰기