YOGYUI

PyQt5 - QTextEdit Tab Width 설정하기 본문

Software/Python

PyQt5 - QTextEdit Tab Width 설정하기

요겨 2021. 7. 15. 11:18
반응형

 

대부분의 통합개발환경(IDE)는 텍스트 에디트의 탭('\t') 길이(크기)를 설정할 수 있는 옵션이 있다

(들여쓰기를 위해 주로 사용)

Visual Studio 2019

 

Qt의 QTextEdit 위젯의 Tab(탭) 길이를 변경하는 방법을 알아보자

 

우선 탭의 공백 길이가 Default는 어느 정도 되는지 알아보기 위해 다음과 같이 코드를 작성해봤다

하나의 스페이스와 일반 문자열의 가로 폭을 동일하게 표현하기 위해 Monospaced 폰트 중 하나의 'D2Coding'을 활용했다

https://github.com/naver/d2codingfont

 

naver/d2codingfont

D2 Coding 글꼴. Contribute to naver/d2codingfont development by creating an account on GitHub.

github.com

if __name__ == '__main__':
    import sys
    from PyQt5.QtGui import *
    from PyQt5.QtCore import *
    from PyQt5.QtWidgets import *

    app = QCoreApplication.instance()
    if app is None:
        app = QApplication(sys.argv)
    
    edit = QTextEdit()
    font = QFont('D2Coding')
    font.setPointSize(14)
    edit.setFont(font)
    
    text_list = [
        "    after 4 blank",
        "\tafter 1 tab",
        "        after 8 blank",
        "\t\tafter 2 tab",
    ]
    edit.setText('\n'.join(text_list))

    edit.show()
    app.exec_()

default tabStopWidth

하나의 탭이 8개의 스페이스보다 공백이 더 긴것을 확인할 수 있다

탭 공백은 QTextEdit의 tabStopWidth 메서드로 확인할 수 있다

In [1]: edit.tabStopWidth()
Out[1]: 80

 

이제 하나의 탭이 4개의 스페이스와 동일한 공백을 가지도록 설정해보자

필요한 것은 QtGui의 QFontMetrics 객체와 QTextEdit의 setTabStopWidth 메서드 두 개이다

edit.setTabStopWidth(QFontMetrics(font).width(' ' * 4))

코드에 다음 한줄만 추가하면 된다

> QFontMetrics를 통해 D2Coding 글꼴로 설정된 font 객체로 쓰여진 4개의 공백 (' ' * 4) 문자열의 폭(width)을 구해서 이를 QTextEdit의 tabStopWidth 값으로 설정하는 구문이다

 

위 코드를 추가한 뒤 실행해보면 결과는 다음과 같다

tabStopWidth = 4 space

코딩용 IDE와 같이 4개의 스페이스가 하나의 탭과 공백의 길이가 같아진 것을 확인할 수 있다

In [2]: edit.tabStopWidth()
Out[2]: 36

 

전체 코드는 다음과 같다

if __name__ == '__main__':
    import sys
    from PyQt5.QtGui import *
    from PyQt5.QtCore import *
    from PyQt5.QtWidgets import *

    app = QCoreApplication.instance()
    if app is None:
        app = QApplication(sys.argv)
    
    edit = QTextEdit()
    font = QFont('D2Coding')
    font.setPointSize(14)
    edit.setFont(font)
    
    edit.setTabStopWidth(QFontMetrics(font).width(' ' * 4))    
    
    text_list = [
        "    after 4 blank",
        "\tafter 1 tab",
        "        after 8 blank",
        "\t\tafter 2 tab",
    ]
    
    edit.setText('\n'.join(text_list))

    edit.show()
    app.exec_()

 

P.S) Python은 코딩 스탠다드상, PyCharm이나 Spyder, Jupyter, VS Code 등 IDE는 탭을 스페이스로 치환해버린다

 

끝~!

 

[참고]

https://stackoverflow.com/questions/13027091/how-to-override-tab-width-in-qt

반응형