반응형

PyQt5와 QML을 사용하는 간단한 예제코드입니다.

 

2023. 12. 9  최초작성 



QML을 사용하여 UI를 따로 분리할 수 있다는 것을 알면서도 사용을 꺼렸는데 이렇게 UI를 분리하는 것도 괜찮겠다 싶어 간단한 예제 코드로 시도해보았습니다. 



실행하면 중앙에 버튼이 있는 윈도우가 보입니다.

 



버튼을 클릭할때마다 메시지 박스가 보이게 됩니다. 확인을 클릭하면 메시지 박스가 사라집니다. 

 



코드는 UI를 정의한 main.qml 파일과 PyQt5 코드를 작성해놓은 main.py 파일로 구성됩니다.

 

main.qml

QML을 사용하여 윈도우를 생성하고 중앙에 버튼을 배치합니다. 버튼이 클릭되면, 파이썬 코드 파일 main.py에 정의된 mainWindow 클래스에 있는 showMessage() 함수가 호출됩니다.

 

import QtQuick 2.0
// Qt Quick 2.0 모듈을 임포트합니다. 기본적인 UI 요소와 기능을 제공합니다.

import QtQuick.Controls 2.0
// Qt Quick Controls 2.0 모듈을 임포트합니다. 버튼과 같은 표준 컨트롤을 제공합니다.

ApplicationWindow {
// ApplicationWindow 요소는 최상위 윈도우를 생성합니다.

    title: "webnautes.tistory.com"
    // 윈도우의 제목을 설정합니다.

    width: 600
    // 윈도우의 너비를 픽셀 단위로 설정합니다.
    height: 480
    // 윈도우의 높이를 픽셀 단위로 설정합니다.
   
    visible: true
    // 윈도우가 보이도록 설정합니다. 기본값은 false입니다.

    Button {
    // Button을 추가합니다.
   
        id: button
        // 버튼의 고유 식별자입니다.
       
        text: "버튼을 누르세요."
        // 버튼에 표시될 텍스트입니다.

        anchors.centerIn: parent
        // 버튼을 부모 요소(여기서는 ApplicationWindow)의 중앙에 배치합니다.
       
        onClicked: mainWindow.showMessage()
        // 버튼이 클릭될 때 실행할 동작을 정의합니다.
        // 이 예제에서는 'mainWindow' 객체의 'showMessage' 함수를 호출합니다.
    }
}




main.py

 

import sys
from PyQt5.QtWidgets import QApplication, QMessageBox 
from PyQt5.QtQml import QQmlApplicationEngine 
from PyQt5.QtCore import QObject, pyqtSlot 


class MainWindow(QObject): 
# QObject를 상속받는 MainWindow 클래스를 정의합니다.

    def __init__(self):
        super(MainWindow, self).__init__() 
        # MainWindow의 생성자에서 부모 클래스의 생성자를 호출합니다.

    @pyqtSlot() 
    # 슬롯 데코레이터를 사용하여 showMessage 함수를 Qt 슬롯으로 표시합니다.
    def showMessage(self): 
        QMessageBox.information(None, "메시지", "버튼을 클릭하셨군요!"
    # 메시지 박스를 화면에 보여주는 showMessage 함수를 정의합니다.


if __name__ == "__main__"
# 현재 파이썬 코드를 실행할 때에만 아래 코드가 실행됩니다.

    app = QApplication(sys.argv) 
    # QApplication 인스턴스를 생성합니다.

    engine = QQmlApplicationEngine() 
    # QQmlApplicationEngine 인스턴스를 생성합니다.
   
    main_window = MainWindow() 
    # MainWindow 인스턴스를 생성합니다.
   
    engine.rootContext().setContextProperty("mainWindow", main_window) 
    # QML 컨텍스트에 mainWindow 객체를 추가합니다.

    engine.load("main.qml"
    # QML 파일을 불러옵니다.

    if not engine.rootObjects(): 
        sys.exit(-1
    # QML 엔진이 객체를 로드하지 못한 경우 프로그램을 종료합니다.

    sys.exit(app.exec_()) 
    # 이벤트 루프를 시작하고 애플리케이션을 실행합니다.

 

반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts