-
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