기본 콘텐츠로 건너뛰기

라벨이 PYQT5인 게시물 표시

[PyQt5] paint() 함수 무한 호출

 2017년부터 PyQt5로 개발하고 있는 어플리케이션이 있습니다. QGraphicsScene/QGraphicsView를 이용하여 그래픽을 화면에 표시하고 있는데 Scene에 들어가는 객체의 수가 적으면 어느정도 성능이 나오는데 일정 수준 이상으로 객체가 늘어가네 되면 성능이 급격히 떨어지는 현상이 발생하였습니다. 이러한 현상을 디버깅하는 도중에 객체나 Scene/View의 변동 사항이 없어도 paint() 함수가 반복적으로 호출하는 현상을 찾았습니다. 그 현상의 원인은 paint() 함수 내부에서 객체를 수정하는 로직때문이었습니다. def paint ( self , painter , option , widget ) : # override paint method color = self . getColor ( ) self . setColor ( color ) # --> 여기서 객체를 수정하고 있음   painter. setPen ( self . pen ( ) ) painter. drawLine ( self . line ( ) )   if self . isSelected ( ) : painter. setOpacity ( 0.7 ) painter. setPen ( QPen ( Qt. black , 1.5 , Qt. DashLine ) ) painter. setBrush ( QEngineeringLineItem. HIGHLIGHT_BRUSH ) painter. drawPolygon ( self . minimum_bounding_box ) 이 부분을 수정하고 나니 전체 프로그램의 성능이 조금 올라갔습니다. paint() 함수는 객체를 화면에 표현만 하도록 해야하고,  내부에 객체를 수정하는 로직을 넣지 않는것이 좋습니다.

[PyQT5] QTableView 틀 고정(Frozen Columns)

개인적으로 QT를 좋아하는데 다만 아쉬운점은 엑셀과 유사한 Spread 컨트롤이 없다는 것입니다. 아쉬운대로 테이블 형식의 데이터는 QTableView 컨트롤을 이용하여 표시하고 있습니다. 유지보수 중인 프로젝트에서 데이터 양이 많아져 횡스크롤이 길어지게 되었습니다. 고객사에서 편의상 앞의 두 칼럼은 엑셀처럼 틀고정을 시켜달라는 요청을 해왔습니다. 하지만 QT의 QTableView 컨트롤에는 틀 고정과 같은 기능이 없습니다. 구글링하여 이에 관한 방법을 찾아보면 한 가지 자료가 검색됩니다. 검색한 자료를 프로젝트에 맞게 수정하여 올립니다. 아래 코드를 보시면 틀 고정을 하기 위한 추가적인 QTableView를 생성하는 것을 확인할 수 있습니다. # -*- coding: utf-8 -*- """ This is FreezeTableWidget module """   from PyQt5. QtCore import * from PyQt5. QtGui import * from PyQt5. QtWidgets import *     class FreezeTableWidget ( QTableView ) : def __init__ ( self , parent = None , fixed_col_count = 1 , *args ) : QTableView. __init__ ( self , parent , *args )   self ._fixed_col_count = fixed_col_count   self . frozenTableView = QTableView ( self )   self . frozenTableView . verticalHeader ( ) . hide ( ) self . frozenTableView . setFocusPolicy ( Qt. NoFocus ) self . frozenTab...

[PyQt5] 화면 디자인

 PyQt5를 이용하여 어플리케이션을 개발할때 화면은 당연히 QtDesigner를 통해 만들게 됩니다. QtDesigner는 PyQt5 패키지를 설치하면 같이 설치됩니다. designer.exe로 검색하시면 찾을 수 있을겁니다. Qt Designer QtDesigner를 통해 만들어진 ui 파일을 프로그램에 적용하는 방법은 먼저 ui 파일을 ui 컴파일러를 통하여 Python 코드로 변환합니다. pyuic5 XXX.ui -o XXX_UI.py 1. Qt Designer에서 다이얼로그 생성 2. ui 파일 3. ui 파일을 통해 자동 생성된 python 코드 그리고 변환한 코드를 Wrapping한 클래스를 만들어 사용하면 됩니다. 이렇게 친절하게 저희 직원에게 소개해줬더니, 아직도 커맨드 명령어를 사용하느냐, 그리고 컴파일러를 이용하여 Python 코드를 만든 후 또 Wrapping 클래스 만들어야 하느냐 C#에 비해 불편하고 복잡하다는 대답을 들었습니다. 맞는 말입니다. C#에 비해 불편합니다. 위 방법에 비해 좀더 간편한 방법이 있긴합니다. ui 파일을 컴파일하여 Python코드를 만들어 사용하지 않고 바로 사용하는 방법입니다. class QSpinnerPane ( QWidget ) : def __init__ ( self ) : import os from PyQt5 import QtWidgets , uic   QWidget. __init__ ( self ) ui_path = os . path . join ( os . path . dirname ( os . path . realpath ( __file__ ) ) , 'UI' , 'Spinner.ui' ) uiClass , qtBaseClass = uic. loadUiType ( ui_path ) self . ui = uiClass ( ) self . u...