2024年8月8日木曜日

PySide6에서 QUiLoader를 利用한 UI 파일 런타임 로딩

PySide6에서 QUiLoader를 이용한 UI 파일 런타임 로딩과 위젯 통합 관리

PySide6에서 QUiLoader를 이용한 UI 파일 런타임 로딩과 위젯 통합 관리

PySide6를 사용하여 Qt Designer로 만든 UI 파일을 런타임에 로드하고, 위젯을 효과적으로 관리하는 방법에 대해 알아보겠습니다. 이 방법을 통해 UI 디자인과 로직을 분리하여 유지보수성을 높일 수 있습니다.

1. 필요한 모듈 임포트

먼저 필요한 모듈들을 임포트합니다:

import sys
from PySide6.QtUiTools import QUiLoader
from PySide6.QtCore import QFile, QIODevice
from PySide6.QtWidgets import QApplication, QWidget

2. MainWindow 클래스 정의

QWidget을 상속받아 MainWindow 클래스를 정의합니다:

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        try:
            ui_file = QFile("layout.ui")
            if not ui_file.open(QIODevice.ReadOnly):
                print(f"Cannot open {ui_file.fileName()}: {ui_file.errorString()}")
                sys.exit(-1)
            
            loader = QUiLoader()
            self.ui = loader.load(ui_file, self)  # self를 인자로 전달
            ui_file.close()
            
            if not self.ui:
                print(loader.errorString())
                sys.exit(-1)
            
            self.ui.btn_Test.clicked.connect(self.on_btn_test_clicked)
            
        except Exception as e:
            print(f"Error: {e}")
            print("Please check the file name of the .ui file")

    def on_btn_test_clicked(self):
        self.ui.test_label.setText("Hello Qt")
        
    def closeEvent(self, event):
        print("closeEvent")
        super().closeEvent(event)

3. UI 파일 로딩과 위젯 통합 관리

QUiLoader.load() 메서드를 사용할 때 self를 두 번째 인자로 전달합니다:

self.ui = loader.load(ui_file, self)

이렇게 하면 UI 파일에서 정의된 위젯들이 현재 클래스(MainWindow)의 자식 위젯으로 통합됩니다. 이는 위젯 계층 구조를 유지하면서 메모리 관리를 효율적으로 할 수 있게 해줍니다. 또한, UI 파일에서 정의한 위젯들을 self.ui를 통해 쉽게 접근할 수 있게 됩니다.

4. closeEvent 메서드 오버라이딩

closeEvent는 QWidget 클래스의 가상 함수입니다. MainWindow 클래스가 QWidget을 상속받았기 때문에 이 메서드를 오버라이드할 수 있습니다:

def closeEvent(self, event):
    print("closeEvent")
    super().closeEvent(event)

이 메서드는 창이 닫히기 직전에 호출됩니다. 여기에서 필요한 정리 작업을 수행할 수 있습니다. super().closeEvent(event)를 호출하여 기본 동작도 유지합니다.

5. 메인 실행 코드

애플리케이션을 실행하는 메인 코드를 작성합니다:

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())  # PyQt6에서는 exec_() 대신 exec()를 사용합니다

결론

이 방식을 사용하면 Qt Designer로 만든 UI 파일을 런타임에 동적으로 로드하고, 위젯들을 효과적으로 통합 관리할 수 있습니다. QUiLoader.load()self를 전달함으로써 UI 파일의 위젯들을 현재 클래스의 자식으로 만들어 관리를 용이하게 합니다.

또한, QWidget의 가상 함수인 closeEvent를 오버라이딩하여 창이 닫힐 때의 동작을 커스터마이즈할 수 있습니다. 이는 QWidget을 상속받았기 때문에 가능한 것으로, 객체 지향 프로그래밍의 장점을 잘 활용한 예입니다.

이러한 방식을 통해 UI 디자인과 로직을 분리하고, 위젯을 효과적으로 관리하며, 창 닫힘과 같은 이벤트를 세밀하게 제어할 수 있는 유연하고 관리하기 쉬운 PySide6 애플리케이션을 만들 수 있습니다.

PySide6로 Qt 애플리케이션 開發하기: 初步者 가이드

안녕하세요, 오늘은 PySide6를 사용하여 Qt 기반의 파이썬 애플리케이션을 개발하는 방법에 대해 알아보겠습니다. PySide6는 2020년 12월에 처음 출시된 이후 꾸준히 발전해온 Qt 바인딩 라이브러리입니다.

  1. PySide6 vs PyQt6

먼저, 많은 개발자들이 궁금해하는 PySide6와 PyQt6의 차이점에 대해 살펴보겠습니다.

  • 라이선스: PySide6는 LGPL 라이선스를 사용하여 상업용 소프트웨어 개발에 더 적합합니다.
  • 개발 주체: PySide6는 Qt Company에서 직접 개발하여 Qt와의 호환성이 뛰어납니다.
  • API 유사성: 두 라이브러리의 API는 매우 유사하여 코드 포팅이 비교적 쉽습니다.
  • 성능: 일반적으로 큰 차이는 없지만, 일부 상황에서 PySide6가 더 나은 성능을 보일 수 있습니다.
  1. PySide6 설치 및 기본 사용법

PySide6를 설치하려면 pip를 사용하면 됩니다:

pip install PySide6

기본적인 PySide6 애플리케이션의 구조는 다음과 같습니다:

python
import sys from PySide6.QtWidgets import QApplication, QWidget class MyApp(QWidget): def __init__(self): super().__init__() self.setWindowTitle('My First PySide6 App') self.resize(300, 200) if __name__ == '__main__': app = QApplication(sys.argv) window = MyApp() window.show() sys.exit(app.exec())
  1. Qt Designer 사용하기

Qt Designer를 사용하면 GUI를 쉽게 디자인할 수 있습니다. PySide6를 설치하면 함께 설치되며, 'pyside6-designer' 명령으로 실행할 수 있습니다.

pyside6-designer

Designer로 만든 .ui 파일은 두 가지 방법으로 사용할 수 있습니다:

a) QUiLoader를 사용한 런타임 로딩  :  나중에 포스팅을 따로 하겠음

b) uic 도구를 사용한 파이썬 코드 변환 : 나중에 포스팅을 따로하겠음


  1. 리소스 파일(.qrc) 사용하기

Qt 리소스 시스템을 사용하면 애플리케이션에 필요한 리소스(이미지, 아이콘 등)를 효율적으로 관리할 수 있습니다. .qrc 파일을 생성하고 이를 파이썬 코드로 변환해서 사용함. 코드에 올려 사용하는 방법은 나중에 따로 설명하겠음.


리소스 파일 컴파일:

pyside6-rcc your_resources.qrc -o resources_rc.py
  1. 주의사항 및 팁

  • PySide6와 PyQt6의 일부 모듈 이름이나 임포트 방식이 다를 수 있으니 주의가 필요합니다.
  • 리소스 파일 사용 시 경로 문제나 형식 오류에 주의해야 합니다.
  • Qt Designer와 리소스 시스템을 효과적으로 활용하면 개발 생산성을 크게 높일 수 있습니다.

관련자료


공식 도큐먼트
https://doc.qt.io/qtforpython-6/tutorials/index.html

위키 :
https://wiki.qt.io/Qt_for_Python  



PySide6는 강력하고 유연한 GUI 개발 도구입니다. LGPL 라이선스를 제공하여 상업용 애플리케이션 개발에 적합하며, Qt Company의 지원을 받아 지속적으로 발전하고 있습니다. 이 글이 여러분의 PySide6 개발 여정에 도움이 되길 바랍니다!


2022年4月18日月曜日

시간낭비 #1

 이건 첫번째 시간낭비에 대한기록이다.

나도 사람에 대한 배려는 없지만 이건 해도 너무 하는 인간같다.

이런 인간에게서 서로에게 이익을 얻을 방법은없다는 생각이든다. 그냥 일방적으로 내가 당해주지않는다면 말이지...

소개팅 자리에 나갔는데 당신 맘에 든다. 우리 친하게 지네자...

그럼 그다음에 대사는 사귀자는 대사 아닌가?

갑자기 이사짐을 날라달라는 이야기를 한다.


또는 당신의 착한 마음에 맘에 든다 우리 친하게 지네자..그리고 역시 사귀자는 말대신

내가 또다른 남자친구가 있는데 여행을 가고싶다. 그런데 단둘이 가는 건 좀 그러니 셋이서 같이 가자?


버러지같은 것들때문에 미치겠다. 정말...

2021年11月13日土曜日

first day(初日)

 

私は立てる憧れていたステージ

와따시와타테루아코가레떼이따스테에지

나는 서있어 언제나 그리던 스테이지에

 

 

大喚声 拍手と熱気の中

다이카은세이하쿠슈또네엣키노나카

큰 함성 박수와 열기 속에서

 

 

厳しいレッスン自分の壁乗り越えて

키비시이레엣슨지분노카베노리코에떼

힘든 레슨 자신의 벽 뛰어넘어서

 

 

迎えった今日チャンスの幕が開く

무카엣따쿄오챤스노마쿠가히라쿠

맞이한 오늘 기회의 막이 열린다

 

 

ひとりだけ覚えずに

히토리다케오보에즈니

혼자서만 외우지 못해서

 

 

帰るうち泣いた日もある

카에루우치나이따히모아루

돌아가는 동안 울었던 날도 있었어

 

 

思うより歌えずに自信を失った日もある

오모우요리우타에즈니지시은오우시나앗따히모 아루

생각처럼 노래가 불러지지 않아 자신을 잃어버 렸던 날도 있었어

 

 

いつもライバルが輝いて見えた

이쯔모라이바루가카가야이떼미에따

언제나 라이벌이 빛나 보였어

 

 

夢は汗の中に

유메와아세노나카니

꿈은 땀흘리는 동안에

 

 

少しずつ咲いていく花

스코시즈쯔사이떼유쿠하나

조금씩 피어가는 꽃

 

 

その努力決して裏切らない

소노도료쿠켓시떼우라기라나이

그 노력은 절대 배신하지 않아

 

 

夢は汗の中に

유메와아세노나카니

꿈은 땀흘리는 동안에

 

 

音を出してずっと待っている

네오다시떼즈읏또마앗떼이루

소리를 내며 계속해 기다리고 있어

 

 

いつかきっと願い叶うまで

이쯔까끼잇또네가이카나우마데

언젠가 분명 바램이 이루어 질때까지

 

 

スポットライトがこんなに眩しいなんて

스포옷또라이코가코은나니마부시이나은떼

스포트라이트가 이렇게나 눈부셨다니

 

 

長い夜が明けた朝陽のようね

나가이요루가아케따아사히노요오네

기나긴 밤이 밝아지는 아침햇살 같아

 

 

先輩たちには負けたくないよ絶対に

센빠이타치니와마케타쿠나이요젯따이니

선배들에게는 지고싶지 않아 절대로

 

 

私たちの勝を作りたかった

와따시타치노쇼오쯔쿠리따깟따

우리들의 승리를 만들고 싶었어

 

 

怪我をして列するんだ時

케가오시떼렛스룬다토키

다치고서 출석했을때

 

 

悔しくて泣いた日もある

쿠야시쿠떼나이따히모아루

분해서 울었던 날도 있었어

 

 

学校とレッスンも病欠にあきらめた日もある

가앗꼬오또렛스은모뵤케츠니아키라메따히모아 루

학교와레슨도 병결로 어쩔수 없었던 날도 있었 어

 

 

だけどアンコールがどこか出き越えた

다케도앙코루가도코카데키코에따

그래도 앵콜이 어딘가에서 울려퍼졌어

 

 

夢は涙の先

유메와나미다노사키

꿈은 눈물이 흐른뒤

 

 

泣きやんだ溢れ日の花

나키야은다코보레비노하나

울기를 멈춘 일출을 바라는 꽃

 

 

頑張った蕾がやがて咲く

가은바앗따쯔보미가야가떼사쿠

힘냈던 봉오리가 머지않아 필꺼야

 

 

夢は涙の先

유메와나미다노사키

꿈은 눈물이 흐른뒤

 

 

雨風に負けず信じてる

아메카제니마케즈시은지떼루

비바람에 지지않을꺼라 믿고있어

 

 

晴れた空に祈り届くまで

하레따소라니이노리토도쿠마데

개인 하늘에 기도가 닿을때까지

 

 

死ぬ気で踊ろう

시누키데오도로오

죽을만큼 춤추고

 

 

死ぬ気で歌おう

시누키데우타오오

죽을만큼 노래하자

 

 

初心を忘れず全力投球で

쇼시은오와스레즈제은료쿠토오큐우데

초심을 잃지 않고 전력투구로

 

 

夢は汗の中に

유메와아세노나카니 꿈은

땀흘리 는 동안에

 

 

少しずつ咲いていく花

스코시즈쯔 사이떼유쿠하나

조금씩 피어가는 꽃

 

 

その努力 決して裏切らない

소노도료쿠켓시떼우라기라 나이

그 노력은 절대 배신하지 않아

 

 

夢は汗 の中に

유메와아세노나카니

꿈은 땀흘리는 동안에

 

 

音を出してずっと待っている

네오다시떼즈 읏또마앗떼이루

소리를 내며 계속해 기다리고 있어

 

 

いつかきっと願い叶うまで

이쯔까끼잇또 네가이카나우마데

언젠가 분명 바램이 이루어 질때까지





.

우리들만의 추억


한결 같은 너희들의 정성이 

우리에겐 너무 커다란 힘이 되었지

편지속에 수많았던 사연들 예쁜 마음 모두다 느낄수가 있었어


Devastating Taiji in the place to be 

with Ju-no and Hyun-suk right beside me 

Creating the sound to the fullist effect Pumping it hard to 

gain the respect Art to the Truth and Truth the Art 

Coming to you straight from the heart 

We're rocking the mike as never before 

so to all the freaks in the house move to the dance floor


소리쳐 주던 예쁘게 웃었던 

아름다운 너희들의 모습이 좋았어

함께 기뻐하고 모두 다같이 웃고 서로를 걱정했던 

우리들만의 옛 추억들


우리들이 힘든일을 겪을땐 

그곁에는 아무도 있어주진 않았어

다만 우리가 견딜수 있던건 너희들의 크나큰 사랑이었어


Dance to the music and move Move to the sound and groove 

To the soft MC's, I'm a lyrical poet 

Listen to my rhyms and you'll surely know it

A hard hiphopper there is nine higher sucka MC's 

they call me sire

T to the A to the I to the J to the I ...

Why...Cause we want you to funk !!


소리쳐 주던 예쁘게 웃었던 

아름다운 너희들의 모습이 좋았어

함께 기뻐하고 모두 다같이 웃고 서로를 걱정했던

우리들만의 옛 추억들


T is for the talent that I possess

A is for attetion I get from the rest

I is for my intellect, style, and my grace

J is for the joy I bring to my raceI is for identity,visions I 

see 

We'll rock you till the twenty first century !

So united we stand divided we fall in this year of 93

we're taking it all !


소리쳐 주던 예쁘게 웃었던 

아름다운 너희들의 모습이 좋았어

함께 기뻐하고 모두 다같이 웃고 서로를 걱정했던

우리들만의 옛 추억들


우린 약하지 않아 어린애가 아니야 

마음을 서로 합하면 모든 해낼 수 있어

난 더 잘하겠어 우리 모두를 위해 

우리 역시 영원토록 너희들을 사랑할거야 





2021年10月26日火曜日

기괴한 도덕의 모순

도덕은 강자에게 강요되지만

진짜강자라면 도덕을 무시된다.

강자가 효율적으로 약자를 지배하려는 수단일뿐이다.

오마에가 도덕에 굴복했다면 너는 이미 약자이다.

선함은 약함을 의미한다. 

리만가설의 소수로 우주의 진리를 풀어내리란 예측이 망상인것처럼

너의 더러운 대장속의 배설물이 시키는대로 남에게 선을 강요하는 당신은 강자인가?

약자면 도덕적으로 살며 목숨을 구걸할것이다.

권선징악은 강자가 약자를 응징한다는 중력의 힘이다.

2021年6月2日水曜日

yaml 자료 모음

json보다 맛딛더 단백하다.

이것이야말로 데이터 표현식의 최종 진화된 맛집

https://yaml-online-parser.appspot.com/

 

ラベル