ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Qt 이론
    공부/Embedded 2024. 5. 12. 15:22

    Firmware GUI

    - 통일된 H/W 인터페이스가 없음

    - LVGL, ST사의 TouchGFX, Embedded Wizard

     

    QT

    GUI 프로그램 개발용 Cross Flatform Framework

    하나의 프레임워크로 하나의 코드로 어떤 플랫폼에서든 실행 가능한

    Win, Linux, MacOS, Tizen 등 대부분의 플랫폼 지원

    네트워크, 그래픽, DB 사용 등을 위한 쉬운 API 제공

    C++ 기반이자만, Python으로도 사용 가능

     

    Commerical <> OpenSource

    상용적 <> GPL(비상업), LGPL(상업용)

     

    QT 라이센스

    - GPL, LGPL 두 가지임

    - LPGL 라이센스 선택이 GPL 기능이 비활성화(Qt Carts, Qt Creator)

     

    Python Binding : 다른 언어로 제작된 Library를 Python으로 호출할 수 있는 연결 모듈

    - PySide : QT 공식 프레임 워크

    - PyQt : QT 비공식 Framework

     

    Qt Designer : 일반적인 UI 디자이너, LGPL, 에디터 미포함, .ui 생성용

     

    Python의 main()

    - Python은 따로 main()이 없다

    - 보통 main 없이 작성하는데, 이 경우 해당 파일을 import만 해도 실행되는 문제가 생긴다.

    - 따라서 if __name__=='__main__' 문법을 통해 main을 사용한다.

     

    Widget : Qt에서 눈에 보이는 모든 모듈(컨트롤)

    - QLable, QPushButton, QComboBox, QLineEdit, QSlider, QProgressBar ...

     

    app : 이벤트를 밭음

    win : 눈에 보일 수 있는 기본 위젯(window), show()를 호출하면 눈에 보여진다. 화면구성역할

    app.exec() : 무한 루프를 돌며, 이벤트를 기다림(사용자가 프로그램을 끄기 전까지 무한루프를 돔)

    app = QApplication()
    win = MyApp()
    win.show()
    app.exec()

     

    * class 내에서 코드 작성 시, self 유의

     

    함수

    - self.setWindowTitle(text) : 타이틀 설정

    - self.setGeometry(위치x, 위치y, 가로, 세로) : 보여줄 위치 정하기

     

    - QLabel(text, pos)

    # 레이블의 위치는 win(0, 0) 기준

    self.label = QLabel('test', self)

    self.label = setGeometry(100, 100, 50, 50)

     

    - QPushButton(text, pos)

    ...

    self.btn.clicked.connect(self.func)

     

    def func():

        pass

     

     

    Signal

    위젯(Widget)을 통해 감지되는 신호

     

    Slot

    Signal을 감지, Signal에 대응하는 함수를 호출

    하나의 Widget에는 여러 Slot이 존재

     

    객체.시그널.connect(함수)

    self.btn.connect(self.func)

    - 사용자가 버튼을 누르는 순간, clicked 시그널이 발생하고, func이 실행됨

     

    QMessageBox

    self.msg = QmessageBox()

    self.msg.setText = (self.lineEdit.text())

    self.msg.exec()

    - 메시지 박스의 경우, 독립적인 창이므로 exec()로 수행한다. 확인 클릭(종료)까지 무한 대기

     

    Layout

    QHBoxLayout(pos) : layout 가로로 배치

    QVBoxLayout(pos) : layout 세로로 배치

     

    .addWidget(객체) : 객체를 layout에 추가

     

    add 의 작성 순서가 GUI의 화면의 배치 순서로 결정됨

     

    GUI Window Class

    - QWidget

      GUI의 기본 객체, Window에서 컨트롤 개념

      화면에 출력되는 컨트롤을 나타냄

    - QMainWindow

      QMainWindow는 QWidget을 상속 받아 추가 구현 한 것 (QWidget의 업그레이드 형태)

      메뉴/툴바/상태표시줄/전용 레이아웃 등을 가지고 있음

    - QDialog

      단순한 정보를 알리는 알림 창 / 단순 정보 입력 창 용도로 쓰임

      대체로 하단에 “확인”/“ 취소” 버튼이 있음

     

    QMainWindow : QWidget을 상속받은 하나의 클래스

    setCentralWidget(위젯) : 위젯 등록

     

    Menu Bar

    - menuBar()

    - .addMenu(메뉴이름')

    - .addAction() : 메뉴에 Action 등록

     

    - QAction() 

    - .triggered.connect(함수) : 동작 함수 등록

    - .setShortcut() : 단축키 등록

     

     

    Qt의 rich text

    - HTML과 유사

    """<center>~~~...

    """

     

    uic 파일 변환

    pyside6-uic.exe Tool 사용

    ~~~/pyside6-uic.exe /~~.ui -o /~~.py

    from PySide6.QtWidgets import *
    from mainUI import Ui_MainWindow
    
    #Ui_MainWindow class 도 상속한다.
    class MyApp(QMainWindow, Ui_MainWindow):
        def __init__(self):
            super().__init__()
            self.setupUi(self)
            self.main()
            
        def main(self):
            pass
    
    if __name__ == '__main__':
        app = QApplication()
        win = MyApp()
        win.show()
        app.exec()

     

    Qt Designer

    송신자 / 시그널 / 수신자 / 슬롯

     

    Qt Layout 4 종류

    HBox Layout

    VBox Layout

    Form Layout

    Grid Layout

     

    Size Policy

    버튼의 경우 좌우로는 늘어나지만, 위/아래로는 크기가 고정되어있다.

    이는 버튼의 Size Policy 중 수직정책이 Fixed이기 때문 -> Minimum 으로 변경

     

    styleSheet : Widget 꾸미기

    .setStyleSheet("background-color:%s" % color)

     

    .adjustSize() : 레이블의 크기가 텍스트에 맞게 조절된다.

    .move(x, y) : 레이블 이동

     

    mousePressEvent(self, event)

     

    QColorDialog : color 창을 띄우는 것 (이런 것도 있다 ~~)

     

    QBasicTimer

    - Qt 에서 제공하는 기본 타이머 기능

    - .start(ms, self), .stop(), timerEvent() , ms단위

     

    QThread

    - .start, .stop

    - start 동작시, run함수가 실행되고, 정지 시에는 stop함수가 실행된다.

     

    Signal() : 나만의 Signal 객체 생성, signal로 전송할 데이터 개수와 타입을 설정

    emit() : signal 전송하는 API

    self.a = Signal(int, str)

    self.a.emit(10, "Test")

     

    # main에서 connect

    self.th.a.connect(self.func)

     

    # emit을 받는 함수

    def func(self, val, msg):

        ~~~

        ~~

     

    QTableWidget

    - Table의 데이터가 들어가는 곳을 Cell이라고 함

    - Cell은 0, 0 부터 시작

     

    - Table의 Signal/Slot

    - Signal : cellEntered(int, int), cellPressed(int, int)

    - Slot : click(int, int)

     

    - .item(x,y) : 해당 좌표의 item의 QTableWidgetItem() 타입으로 return

     

    QProgressBar

    setOrientation() : Qt.Vertical / Qt.Horizontal, 수평/수직 방향 변경

    setInvertedAppearance(False) : 정방향/역방향 변경, 프로그래스 바가 차는 방향

     

    QDial

    QSlider

    QLCDNumber : display(value)함수로 값을 보여줌

     

    버튼의 Signal

    - clicked : 클릭 시

    - clicked(bool) : 체크형 버튼 클릭 시

    - pressed() : 버튼을 누를 때

    - released() : 버튼에서 땔 때

    - toggled(bool) : 체크형 버튼이 토글 될 때

     

     

    임베디드 Data Visualization(시각화) 과정

    - Log data 생성

    - Log data 전달

    - 파싱(Parsing)

    - 데이터 시각화

     

    Matplotlib Library

    - 수학/과학 라이브러리

    - PSF(Python S/W Foundation) License : 상업, 복제, 수정 가능(단 PSF Copyright 표시 및 수정사항을 표시 해야함)

     

    Numpy

    - 타 Library의 기본 Library로 쓰임(OpenCV, Matplotlib, Pandas)

     

    OpenCV

    - 대표적인 이미지/영상 처리 라이브러리

    - BSD 라이센스로 기업도 무료로 사용

    - 멀티플랫폼 지원

    - 기본은 C++, Python, Java interface 지원

     

    OpenCV Code

    생략

     

    ML Library

    Tensorflow : 구글에서 만든 ML 라이브러리

    우린 Tensorflow Lite를 사용

     

    ML 과정

    - 목표 설정 -> 가설 세우기 -> 데이터 수집 -> 학습 -> 모델 완성


    LGPL

    - GPL보다 훨씬 완화된 조건의 공개 소프트웨어 라이센스

    - 코드를 정적 또는 동적 라이브러리로 사용한 프로그램을 개발하여 판매/배포할 경우, 프로그램의 소스코드를 공개하지 않아도 됨

    - LGPL 코드를 사용했다고 명시만 하면 됨

    - 하지만 LGPL 코드를 수정/개발하여 사용할 경우 전체 코드를 공개하여야 함

     

    GPL

    - 어떤 프로그램 개발 시, GPL 코드를 일부라도 사용한다면, GPL

    - 프로그램을 유료 판매 가능하지만, 전체 소스 코드를 무료로 공개하여야 함

    - 만약, 프로그램 중 일부만 GPL을 참조한 모듈이지만, 전체를 배포한다면 GPL을 따라야 함

     

    BSD

    - 소스코드 공개 의무가 없음

    - 상용 소프트웨어에도 무제한 사용 가능함 -> 제약 x

    - OpenCV는 BSD를 따름

     

    MIT License

    BSD 라이센스를 기초로 작성된 BSD계열 라이센스 중 하나

    마찬가지로, 오픈 소스 배포 규정이 없으며, 오픈 소스를 사용 했다면, 기본적으로 메뉴얼 등에 사용했음을 알려야 함

     

     

    closeEvent

    - QMainWindow() class의 멤버 함수를 재정의

    - 재정의로 사용 가능, 이름 변경은 불가하다.

    - Close 또는 프로그램 종료 버튼 누를 시 호출

    def main(self):
        ...
        self.closeAction = QAction("&Close", self)
        ...
        self.menuFile.addAction(self.closeAction)
        ...
    
    def closeEvent(self, event):
        if not self.edit.document().isModified():
            return
        ...
        ....
        ..
        
        answer = QMessageBox.questing(self, '~', msg,
        	QMessageBox.save |
            QMessageBox.Discard |
            QMessageBox.Cancel
            )
        
        if answer & QMessageBox.Save:
        	self.save()
        if answer & QMessageBox.Cancel:
        	event.ignore()	# 윈도우 닫기 이벤트를 무시

     

     

    signal / slot (위에 있음)

     

    cross compile

    - 컴파일러가 실행되는 플랫폼이 아닌, 다른 플랫폼에서 실행 가능한 코드를 생성할 수 있는 컴파일러(컴파일)

    Qt : GUI 프로그램 개발용 Cross Flatform Framework

    - 개발 PC와 실제 동작하는 기기가 다른 경우

    - 실제 동작하는 기기에서 코드 작업 및 빌드 테스트가 쉽지 않은 경우 사용

     

     

    Modal

    - 최상위 창만 사용 가능 (하위 창 제어 불가)

    - exec() 사용

    - 닫기 전에는 하위 창이 사용 불가

     

    - Qt에서 해상도 알아내는 객체 : self.screen = QGuiApplication.primaryScreen()

     

    Modaless

    - 모든 창 사용 가능

    - show() 사용

     

    Modal , Modaless

    QMessageBox의 정보 버튼은 macOS는 modaless, 그 외는 modal 으로 출력된다.

     

     

    QWidget (위에있음)

     

    Qt mooto : One framework. One codebase. Any Platform

    '공부 > Embedded' 카테고리의 다른 글

    Zephyr  (0) 2024.11.20
    기타 보드 & 에뮬레이터  (0) 2024.11.17
    [PyQT] PiCamera + OpenCV  (0) 2024.05.09
    PyQT _ 실습  (2) 2024.05.07
    용어 정리  (0) 2024.04.28
Designed by Tistory.