2023년 2월 15일 수요일

VITIS Git + Doxygen Config

 Doxygen Configure

1. Vitis 메뉴의 Window->Preference의 C/C++ -> Editor의 Documentation tool comments 기본 설정값을 Doxygen으로 변경


설정 후 함수 바로 위에서 /** 입력 후 엔터를 입력하면 아래와 같이 Doxygen문법이 자동 완성된다.


2. Git Hub와 연동

Github에 아래와 같이 저장소가 하나 준비되어 있다.


vitis메뉴에서 Window -> Open Perspective를 선택하면 창이 하나 출력되며, Git을 선택 후 open을 클릭한다.


아래 그림과 같이 Git 설정 관련 창을 볼 수 있다.



2.1. github의 저장소 연결하기

github에 만든 저장소와 연결하기 위해 Clone Git Repository를 클릭한다.


설정 창이 출력되면 위와같이 입력하고 Next를 클릭한다.

여기서 password는 git hub에서 설정한 personal key를 이용해야 한다.

personal key 생성방법은 어렵지 않으니 구글링을 통해 알아보시길...

정상적으로 생성했으며 아래와 같이 생성된 정보가 출력된다. 물론 그 이전에 personal key가 뭐다라고 출력이 되고, 출력된 키는 잘 메모해나야 한다. 다시 정보를 볼수 없다.

잊어버렸으면 다시 생성하거나 update하게되면 새로운 키가 생성된다.


뒤 이어 나오는 그림은 Clone Git Repository 설정의 연속인다.

정상적으로 만들어진 결과가 아래 그림과 같다.

Vitis의 오른쪽 상단의 Design을 클릭하여 생성한 프로젝트를 방금 만든 저장소와 연결해주는 작업을 해야한다.

프로젝트명에서 마우스 오른쪽 버튼을 클릭하면 Team->Share Project ...을 클릭한다.

Repository를 선택하고 Finish를 클릭하면 연결 완료이다.














2022년 8월 28일 일요일

petalinux 에서 BOOT.Bin 생성방법

 petalinux 빌드 후 images/linux 위치에서 아래 명령을 이용하여 BOOT.BIN 파일을 생성할 수 있다.

petalinux-package --boot --fsbl ./zynqmp_fsbl.elf --fpga ./system.bit --u-boot --force

zynqmp 2020.x uartlite 전송속도 115200이 아닌 값 설정시 부팅 hang

 H/W 디자인시 uartlite를 추가하고, 전송 속도를 115200이 아닌값을 설정한 경우 petalinux 설정에서 아래와 같이 설정이 uartlite로 설정이 변경된다.


Subsystem AUTO Hardware Settings->Serial Settings->system stdin/stdout baudrate for psu_uart_0 (19200)  --->

여기서 uartlite의 설정은 19200으로 설정함.

build/conf/plnxtool.conf 이곳에 SERIAL_CONSOLES이 19200으로 되어있음 

 

이는 Xilinx의 버그 이며, 아래와 같이 설정으로 hang을 벗어날수있다.

vi ~/project-spec/meta-user/conf/petalinuxbsp.conf 

SERIAL_CONSOLES = "115200;ttyPS0"

설정 추가후 빌드


Xilinx 이슈 Link

https://support.xilinx.com/s/article/76468?language=en_US

https://support.xilinx.com/s/question/0D52E00006hpPSvSAM/console-ps-uart0-baud-rate-bug-when-a-different-axi-uart-lite-instantiated-in-pl-with-a-different-baud-rate?language=en_US


2022년 8월 21일 일요일

petalinux u-boot 환경변수 수정 방법 및 petalinux 2020, 2021 에서 petalinux-top.h 적용 방법

 petalinux u-boot 환경변수 수정 방법

1. u-boot 명령 프롬프트에서 플래시에 저장된 값 변경
장치의 전원을 키고 콘솔 창에 Hit any key to stop autoboot 메시지가 나오면 아무키나 눌러 u-boot 환경변수를 확인 및 수정할 수 있다.
환경변수 확인 : printenv
환경변수 설정 : setenv [환경변수 명] [설정 값]
환경변수 저장 : saveenv 
 
변경 사항이 tool에 의해 덮어쓰기 되기 때문에 해당 파일을 수정해서는 안 되며, 대신 해당 파일에 정의된 값을 수정하려면 다음 파일에 새 값을 기록 또는 수정하면 됩니다.
project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h

 

2. PetaLinux 프로젝트에서 하드 코딩 된 기본값 변경
PetaLinux 프로젝트에서 환경 변수의 기본값은 다음 파일에서 찾을 수 있으며, 이 파일은 하드웨어(Vivado) 설계 및 PetaLinux 프로젝트 설정의 세부 정보를 사용하여 PetaLinux에 의해 자동으로 생성됩니다.
project-spec/configs/u-boot-xlnx/platform-auto.h


주의 : platform-auto.h 파일의 기록된 환경값을 적용하기 위해서는 petalinux-config에서 아래 설정을 선택해지 해야합니다.

Auto Config Settings ---> [ ] u-boot autoconfig 


 



2021년 11월 30일 화요일

Mathlab 기본

 수의 표현

실수 : 1.23 -> 1.23,  4.56*107 -> 4.56e7

허수 : $\sqrt{1}$ -> 1i 또는 1j   ex> 실수가 5이고 허수가 3인 복소수 -> 5+1j*3

∞ : inf

π : pi

수가 아닌것 : NaN


행렬 혹은 배열의 형태

스칼라 : a=[3]

행 백터 : X = [1,2,3]

열 백터 : Y = [1;2;3]

행렬 : A = [1,2,3; 4,5,6]


연산자 형태

.* : 배열곱셈

' : 전치

.' : 배열 전치

./ : 배열 나눗셈

.^ : 배열 거듭제곱



2021년 11월 29일 월요일

QT5 TDD

 Unit Test

이 장에서 우리는 최근 몇 년 동안 정말로 인기를 얻은 프로세스인 단위 테스트를 살펴볼 것입니다. Qt의 고유한 단위 테스트 도구인 Qt Test를 사용하여 솔루션에 통합하는 방법을 다루기 전에 이것이 무엇이며 왜 하고 싶은지 간략하게 설명하겠습니다. 
여기서 다룰 주제는 다음과 같습니다.
  • 단위 테스트 원칙
  • 기본 Qt 접근 방식
  • 대안적 접근
  • DataDecorator 테스트
  • Entity 테스트
  • Mocking

Unit testing

단위 테스트의 핵심은 애플리케이션을 가장 작은 기능 블록(단위)으로 나눈 다음 이니셔티브 범위 내에서 실제 시나리오로 각 단위를 테스트하는 것입니다. 예를 들어, 두 개의 부호 있는 정수를 취하여 함께 더하는 간단한 방법을 취하십시오.

int add(intx, int y);
  • Adding two positive numbers
  • Adding two negative numbers
  • Adding two zeroes
  • Adding one positive and one negative number
  • Adding zero and a positive number
  • Adding zero and a negative number
이러한 각 시나리오에 대한 테스트를 작성한 다음 코드 기반이 변경될 때마다(add() 메서드뿐만 아니라 모든 코드) 이러한 테스트를 실행하여 코드가 여전히 예상대로 작동하는지 확인할 수 있습니다. 코드 변경이 기존 기능에 해로운 영향을 미치지 않는다는 확신을 줄 수 있는 정말 유용한 도구입니다.

역사적으로 이러한 테스트는 수동으로 수행되었지만 자동으로 테스트 코드에 코드를 작성할 수 있는 도구가 존재합니다. 이는 약간의 역설처럼 들리지만 실제로 작동합니다. Qt는 Qt Test라고 하는 단위 테스트 Qt 기반 응용 프로그램을 위한 맞춤형 프레임워크를 제공하며 이것이 우리가 사용할 것입니다.

Google 테스트와 같은 다른 C++ 테스트 프레임워크를 사용할 수 있습니다. 이 프레임워크는 특히 Google mock과 함께 사용할 때 더 많은 기능과 유연성을 제공하지만 설정하기가 조금 더 까다로울 수 있습니다.

테스트 주도 개발(TDD)은 단위 테스트를 한 단계 끌어올리고 실제로 코드 작성 방식을 처음부터 변경합니다. 기본적으로 테스트를 먼저 작성합니다. 구현이 없기 때문에 테스트는 처음에 실패할 것입니다(실제로 빌드되지 않을 수도 있음). 그런 다음 테스트를 통과하는 데 필요한 최소한의 코드를 작성하고 다음 테스트 작성으로 넘어갑니다. 필요한 기능 블록을 제공할 때까지 이러한 방식으로 구현을 반복적으로 구축합니다. 마지막으로, 완료된 단위 테스트를 사용하여 리팩토링된 코드가 여전히 예상대로 작동하는지 확인하여 필요한 표준으로 코드를 리팩토링합니다. 이것은 때때로 Red-Green-Refactor라고도 합니다.

이것은 단위 테스트에 관한 책이 아니며 확실히 TDD에 관한 책도 아닙니다. 따라서 우리의 접근 방식은 매우 느슨하지만 현대 응용 프로그램 개발의 핵심 부분이며 이것이 Qt 프로젝트 애플리케이션에 어떻게 맞는지 아는 것이 중요합니다. 

우리는 비즈니스 로직 프로젝트에서 UI로 간단한 데이터 조각(환영 메시지)을 전달하는 메커니즘을 시연했습니다. 따라서 항상 가능한 한 간단하게 시작하여 이 장의 첫 번째 목표는 기본적인 단위 테스트를 작성하는 것입니다. 그 행동을 위해. 완료되면 이전 장에서 구현한 데이터 클래스 테스트로 넘어갑니다.

The default Qt approach

cm-tests 프로젝트를 만들 때 Qt Creator는 testCase1이라는 단일 테스트를 포함하는 시작점을 사용할 수 있도록 ClientTests 클래스를 유용하게 만들었습니다. 바로 들어가서 이 기본 테스트를 실행하고 무슨 일이 일어나는지 봅시다. 그런 다음 코드를 살펴보고 무슨 일이 일어나고 있는지 논의할 것입니다.

실행 출력을 cm-tests로 전환하고 컴파일하고 실행합니다.

QT Project Structure


 프로젝트 구조

이 장에서는 예제 응용 프로그램의 기초가 될 새로운 다중 프로젝트 솔루션을 만들 것입니다. 사용자 인터페이스와 비즈니스 로직을 분리하여 Model View Controller 패턴을 적용할 것입니다. 또한 Qt의 단위 테스트 프레임워크인 QtTest를 소개하고 이를 솔루션에 통합하는 방법을 보여줍니다. 이 장에서는 다음 사항을 다룰 것입니다.

  • Projects, MVC, and unit testing
  • Creating a library project
  • Creating a unit tests project
  • Creating a user interface project
  • Mastering MVC
  • The QObject base class
  • QML
  • Controlling project output

프로젝트, MVC 및 단위 테스트

이전 장에서 만든 스크래치패드 응용 프로그램은 .pro 파일로 표시되는 Qt 프로젝트입니다. 비즈니스 환경에서 기술 솔루션은 일반적으로 회사 이니셔티브의 일부로 개발되며 이러한 이니셔티브는 일반적으로 프로젝트라고도 합니다. 혼란을 최소화하기 위해(그리고 프로젝트라는 단어가 나타나는 횟수!), 우리는 .pro 파일로 정의된 Qt 프로젝트를 의미하는 프로젝트와 비즈니스 의미의 프로젝트를 언급하는 이니셔티브라는 단어를 사용할 것입니다.

우리가 작업할 이니셔티브는 일반적인 클라이언트 관리 시스템이 될 것입니다. 공급업체가 고객을 관리하고 의료 서비스가 환자를 관리하는 등 여러 애플리케이션에 맞게 조정하고 용도를 ​​변경할 수 있습니다. 실제 LOB(Line of Business) 응용 프로그램에서 반복적으로 발견되는 일반적인 작업을 수행하며 주로 데이터를 추가, 편집 및 삭제합니다.

스크래치패드 애플리케이션은 단일 프로젝트 내에 완전히 캡슐화되어 있습니다. 더 작은 응용 프로그램의 경우 이것은 완벽하게 실행 가능합니다. 그러나 더 큰 코드 기반, 특히 여러 개발자가 관련된 경우에는 관리하기 쉬운 부분으로 쪼개는 것이 좋습니다.

우리는 MVC(Model View Controller) 아키텍처 패턴의 초경량 구현을 사용할 것입니다. 이전에 MVC를 접한 적이 없다면 주로 사용자 인터페이스에서 비즈니스 로직을 분리하는 데 사용됩니다. 사용자 인터페이스(보기)는 명령을 스위치보드 스타일 클래스(컨트롤러)에 전달하여 데이터를 검색하고 필요한 작업을 수행합니다. 컨트롤러는 차례로 데이터, 논리 및 규칙에 대한 책임을 데이터 개체(모델)에 위임합니다.

그림1

핵심은 컨트롤러에 명령을 보내고 모델에 저장된 데이터를 표시해야 하기 때문에 뷰가 컨트롤러와 모델에 대해 알고 있다는 것입니다. 컨트롤러는 작업을 위임해야 하므로 모델에 대해 알고 있지만 뷰에 대해서는 모릅니다. 모델은 컨트롤러나 뷰에 대해 아무것도 모릅니다.

비즈니스 환경에서 이러한 방식으로 애플리케이션을 설계하는 주요 이점은 전담 UX 전문가가 보기에 대해 작업하는 동안 프로그래머가 비즈니스 로직에 대해 작업할 수 있다는 것입니다. 두 번째 이점은 비즈니스 논리 계층이 UI에 대해 아무것도 모르기 때문에 논리 계층에 영향을 주지 않고 사용자 인터페이스를 추가, 편집 및 완전히 대체할 수 있다는 것입니다. 좋은 사용 사례는 데스크톱 애플리케이션을 위한 "풀 팻(full fat)" UI와 모바일 장치를 위한 컴패니언 "반 팻(half fat)" UI를 갖는 것입니다. 둘 다 동일한 비즈니스 로직을 사용할 수 있습니다. 이 모든 것을 염두에 두고 UI와 비즈니스 로직을 별도의 프로젝트로 물리적으로 분리할 것입니다.

또한 자동화된 단위 테스트를 솔루션에 통합하는 방법도 살펴볼 것입니다. 단위 테스트 및 테스트 주도 개발(TDD)은 최근에 인기를 얻었으며 비즈니스 환경에서 애플리케이션을 개발할 때 코드와 함께 단위 테스트를 작성하게 될 가능성이 높습니다. 그렇지 않은 경우 많은 가치가 있으므로 실제로 제안해야 합니다. 이전에 단위 테스트를 해본 적이 없다고 걱정하지 마세요. 매우 간단하며 나중에 이 책에서 더 자세히 논의할 것입니다.

마지막으로 이러한 하위 프로젝트를 함께 집계하여 개별적으로 열 필요가 없도록 하는 방법이 필요합니다. 우리는 다른 프로젝트를 하나로 묶는 것 외에는 아무것도 하지 않는 우산 솔루션 프로젝트로 이를 달성할 것입니다. 이것이 우리의 프로젝트를 배치하는 방법입니다:

그림2

프로젝트 생성

이전 장에서 몇 개의 텍스트 파일을 만드는 것만으로 새 프로젝트를 설정하는 것이 얼마나 쉬운지 살펴보았습니다. 그러나 우리는 Qt Creator를 사용하여 새로운 솔루션을 만들 것입니다. 새 프로젝트 마법사를 사용하여 최상위 솔루션과 단일 하위 프로젝트를 만드는 과정을 안내합니다.

상단 메뉴에서 File > New File or Project 또는 프로젝트를 선택한 다음 Projects > Other Project > Subdirs Project 를 선택하고 선택…을 클릭합니다.

그림3

Subdirs 프로젝트는 최상위 솔루션 프로젝트에 필요한 템플릿입니다. 이름을 cm로 지정하고 qt 프로젝트 폴더에 생성합니다.

그림4

키트 선택 창에서 설치한 Desktop Qt 5.10.0 MinGW 32비트 키트를 확인합니다. 설치되어 있는 경우 시험해보고 싶은 추가 키트를 자유롭게 선택하십시오. 그러나 필수는 아닙니다. 다음을 클릭하십시오.

그림5

논의한 바와 같이 버전 제어는 이 책의 범위를 벗어나므로 프로젝트 관리 창의 버전 제어에 추가 드롭다운에서 없음을 선택합니다. 마침 및 하위 프로젝트 추가를 클릭합니다.

그림6

사용자 인터페이스 프로젝트를 첫 번째 하위 프로젝트로 추가합니다. 마법사는 방금 수행한 단계와 거의 동일한 패턴을 따르므로 다음을 수행합니다.

  1. Projects > Application > Qt Quick Application - Empty을 선택하고 선택 합니다.
  2. 프로젝트 위치 대화 상자에서 이름을 cm-ui(클라이언트 관리 - 사용자 인터페이스용)로 지정하고 위치를 새 cm 폴더로 두고 다음을 클릭합니다.
  3. 빌드 시스템 정의 대화 상자에서 빌드 시스템 qmake를 선택하고 다음을 클릭하십시오.
  4. 프로젝트 세부 정보 정의 대화 상자에서 QT 5.9의 기본 최소 Qt 버전과 Qt 가상 키보드 사용 상자를 선택 취소한 상태로 두고 다음을 클릭합니다.
  5. Kit선택 대화 상자에서 Desktop Qt 5.10.0 MinGW 32비트 Kit와 함께 시도하려는 다른 Kit를 선택하고 다음을 클릭합니다.
  6. 마지막으로 프로젝트 관리 대화 상자에서 버전 제어를 건너뛰고(<없음>으로 유지) 마침을 클릭합니다.

이제 최상위 솔루션과 UI 프로젝트가 실행 중이므로 다른 하위 프로젝트를 추가해 보겠습니다. 다음과 같이 비즈니스 논리 프로젝트를 다음에 추가합니다.

  1. 프로젝트 창에서 최상위 cm 폴더를 마우스 오른쪽 버튼으로 클릭하고 New Subproject를 선택합니다.
  2. Projects > Library > C++ Library를 선택 합니다.
  3. 소개 및 프로젝트 위치 대화 상자에서 공유 라이브러리를 유형으로 선택하고 이름을 cm-lib로 지정하고 <Qt 프로젝트>/cm에 만들고 다음을 클릭합니다.
  4. 필수 모듈 선택 대화 상자에서 기본값인 QtCore를 그대로 사용하고 다음을 클릭합니다.
  5. 클래스 정보 대화 상자에서 새 클래스를 생성하여 시작할 수 있습니다. client.h 헤더 파일과 client.cpp 소스 파일과 함께 클래스 이름을 Client로 지정하고 다음을 클릭합니다.
  6. 마지막으로 프로젝트 관리 대화 상자에서 버전 제어를 건너뛰고(<없음>으로 유지) 마침을 클릭합니다.

마지막으로 단위 테스트 프로젝트를 만드는 프로세스를 반복합니다.

  1. New Subproject....
  2. Projects > Other Project > Qt Unit Test.
  3. 프로젝트 이름 cm-tests.
  4. QtCore 및 QtTest를 포함합니다.
  5. testCase1 테스트 슬롯과 client-tests.cpp 파일 이름으로 ClientTests 테스트 클래스를 만듭니다. Type as Test로 설정하고  Generate initialization and cleanup code을 선택하십시오.
  6. 버전 관리를 건너뛰고 마침.

통과해야 할 대화 상자가 많았지만 이제 뼈대 솔루션이 제자리에 있습니다. 프로젝트 폴더는 다음과 같아야 합니다.

그림7

이제 콘텐츠를 추가하기 전에 각 프로젝트를 차례로 살펴보고 약간의 조정을 할 것입니다.

cm-lib

먼저 파일 탐색기로 이동하여 cm-lib 아래에 source라는 새 하위 폴더를 만듭니다. cm-lib_global.h를 거기로 이동하십시오. 소스에 모델이라는 다른 하위 폴더를 만들고 두 클라이언트 클래스 파일을 모두 거기로 이동합니다.

그런 다음 Qt Creator로 돌아가 cm-lib.pro를 열고 다음과 같이 편집합니다.

QT -= gui
TARGET = cm-lib TEMPLATE = lib
CONFIG += c++14
DEFINES += CMLIB_LIBRARY
INCLUDEPATH += source
SOURCES += source/models/client.cpp
HEADERS += source/cm-lib_global.h source/models/client.h

라이브러리 프로젝트이므로 기본 GUI 모듈을 로드할 필요가 없으므로 QT 변수를 사용하여 제외합니다. TARGET 변수는 바이너리 출력을 제공하려는 이름입니다(예: cm-lib.dll). 선택 사항이며 제공하지 않으면 기본적으로 프로젝트 이름이 지정되지만 명시적으로 지정하겠습니다. 다음으로 스크래치패드 애플리케이션에서 본 것처럼 앱의 TEMPLATE를 사용하는 대신 이번에는 lib를 사용하여 라이브러리를 제공합니다. CONFIG 변수를 통해 C++14 기능을 추가합니다.

cm-lib_global.h 파일은 공유 라이브러리 기호를 내보내는 데 사용할 수 있는 유용한 전처리기 상용구이며 곧 사용하게 될 것입니다. DEFINES 변수에서 CMLIB_LIBRARY 플래그를 사용하여 이 내보내기를 트리거합니다.

마지막으로, 약간 이동한 후 새 파일 위치를 설명하기 위해 SOURCES 및 HEADERS 변수 목록을 약간 다시 작성했으며 소스 폴더(모든 코드가 있을 위치)를 INCLUDEPATH에 추가하여 경로는 #include 문을 사용할 때 검색됩니다.

프로젝트 창에서 cm-lib 폴더를 마우스 오른쪽 버튼으로 클릭하고 qmake 실행을 선택합니다. 완료되면 다시 마우스 오른쪽 버튼을 클릭하고 재구축을 선택합니다. 모든 것이 푸르고 행복해야 합니다.

cm-test

새 소스/모델 하위 폴더를 만들고 client-tests.cpp를 거기로 이동합니다. Qt Creator로 다시 전환하고 cm-tests.pro를 편집하십시오.

QT += testlib QT -= gui
TARGET = client-tests
TEMPLATE = app
CONFIG += c++14
CONFIG += console
CONFIG -= app_bundle
INCLUDEPATH += source
SOURCES += source/models/client-tests.cpp

이것은 라이브러리가 아닌 콘솔 앱을 원한다는 점을 제외하고 cm-lib와 거의 동일한 접근 방식을 따릅니다. GUI 모듈은 필요하지 않지만 Qt 테스트 기능에 액세스하기 위해 testlib 모듈을 추가합니다.

이 하위 프로젝트에는 아직 많은 것이 없지만 qmake를 실행하고 성공적으로 재구축할 수 있어야 합니다.

cm-ui

이번에는 소스와 보기라는 두 개의 하위 폴더를 만듭니다. main.cpp를 소스로 이동하고 main.qml을 보기로 이동하십시오. qml.qrc의 이름을 views.qrc로 바꾸고 cm-ui.pro를 편집합니다.

QT += qml quick
TEMPLATE = app
CONFIG += c++14
INCLUDEPATH += source
SOURCES += source/main.cpp
RESOURCES += views.qrc
# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH = $$PWD

우리의 UI는 qml과 빠른 모듈이 필요한 QML로 작성되었으므로 추가합니다. RESOURCES 변수를 편집하여 이름이 바뀐 리소스 파일을 선택하고 QML_IMPORT_PATH 변수도 편집합니다. 이 변수는 사용자 지정 QML 모듈에 들어갈 때 자세히 다룰 것입니다.

다음으로, 우리가 main.qml 파일을 views 폴더로 옮겼다는 사실을 고려하여 views.qrc를 편집하십시오. 마우스 오른쪽 버튼을 클릭하고 다음으로 열기 > 일반 텍스트 편집기를 기억하십시오.

<RCC>
    <qresource prefix="/">
        <file>views/main.qml</file>
    </qresource>
</RCC>

마지막으로 파일 이동을 설명하기 위해 main.cpp의 줄도 편집해야 합니다.
engine.load(QUrl(QStringLiteral("qrc:/views/main.qml")));

이제 qmake를 실행하고 cm-ui 프로젝트를 다시 빌드할 수 있습니다. 실행하기 전에 여러 프로젝트가 열려 있으므로 빌드 구성 버튼을 간단히 살펴보겠습니다.

그림

이제 키트 및 빌드 옵션과 함께 실행할 실행 파일도 선택해야 합니다. cm-ui가 선택되었는지 확인한 다음 응용 프로그램을 실행합니다.

그림

안녕하세요 월드입니다. 상당히 고무적이지 않은 내용이지만, 우리는 멀티 프로젝트 솔루션을 구축하고 행복하게 실행하고 있습니다. 이는 훌륭한 시작입니다. 더 이상 즐길 수 없을 때 응용 프로그램을 닫으십시오!

Mastering MVC

이제 솔루션 구조가 준비되었으므로 MVC 구현을 시작하겠습니다. 보시다시피 설정이 매우 간단하고 매우 쉽습니다.

먼저 cm-ui > Resources > views.qrc > / > views,를 확장하고 main.qml을 마우스 오른쪽 버튼으로 클릭하고 이름 바꾸기를 선택하고 파일 이름을 MasterView.qml로 바꿉니다. 프로젝트 편집에 대한 메시지가 표시되면 예를 선택하여 계속 진행합니다.

그림

오류 메시지가 표시되면 파일은 프로젝트 창에 여전히 main.qml로 표시되지만 파일 시스템에서는 파일 이름이 변경됩니다.

다음으로 views.qrc를 편집합니다(Open With > Plain Text Editor). 내용을 다음과 같이 바꿉니다.
<RCC>
    <qresource prefix="/views">
        <file alias="MasterView.qml">views/MasterView.qml</file>
    </qresource>
</RCC>

main.cpp에서 이 QML 파일을 로드하는 방법을 기억한다면 구문은 qrc:<prefix><filename>입니다. 이전에는 / 접두사와 views/main.qml 상대 파일 이름이 있었습니다. 이것은 우리에게 qrc:/views/main.qml을 제공했습니다.

/ 접두사는 그다지 설명적이지 않습니다. 점점 더 많은 QML 파일을 추가함에 따라 의미 있는 접두사가 있는 블록으로 구성하는 것이 정말 유용합니다. 비구조화된 리소스 블록을 사용하면 보기를 통해 드릴다운해야 할 때 보았듯이 프로젝트 창이 보기 흉하고 탐색하기 더 어려워집니다. view.qrc > / > 보기. 따라서 첫 번째 단계는 접두사의 이름을 /에서 /view로 바꾸는 것입니다.

그러나 접두어가 /view이고 상대 파일 이름이 views/main.qml이므로 URL은 이제 qrc:/views/views/main.qml입니다.

이것은 이전보다 더 나쁩니다. 우리는 여전히 views.qrc에 깊은 폴더 구조를 가지고 있습니다. 다행히 파일에 별칭을 추가하여 이 두 가지 문제를 모두 해결할 수 있습니다. 상대 경로 대신 리소스의 별칭을 사용할 수 있으므로 main.qml의 별칭을 할당하면 views/main.qml을 단순히 main.qml로 교체하여 qrc:/views/main.qml을 제공할 수 있습니다. .

간결하고 설명적이며 프로젝트 창도 더 깔끔해졌습니다.

따라서 업데이트된 버전의 views.qrc로 돌아가서 우리가 수행한 파일 이름 변경과 일치하도록 파일 이름을 main.qml에서 MasterView.qml로 간단히 업데이트했으며 바로 가기 별칭도 제공했기 때문에 보기를 두 번 지정할 필요가 없습니다.

이제 이러한 변경 사항을 반영하기 위해 main.cpp의 코드를 업데이트해야 합니다.
engine.load(QUrl(QStringLiteral("qrc:/views/MasterView.qml")));

qmake를 실행하고 빌드 및 실행하여 아무 것도 손상되지 않았는지 확인할 수 있어야 합니다.

다음으로, MasterController 클래스를 생성할 것이므로 cm-lib 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 Add New… > C++ > C++ Class  선택합니다.

그림

찾아보기… 버튼을 사용하여 소스/컨트롤러 하위 폴더를 만듭니다.

QObject를 기본 클래스로 선택하고 포함하면 Qt Creator가 우리를 위해 일부 상용구 코드를 작성합니다. 나중에 언제든지 직접 추가할 수 있으므로 새 클래스를 만드는 데 필요한 부분이라고 생각하지 마십시오.

버전 관리를 건너뛰고 클래스를 생성했으면 다음과 같이 선언하고 정의합니다. MasterController는 아직 특별히 흥미로운 작업을 수행하지 않으며, 단지 기초 작업을 하고 있습니다.

master-controller.h는 다음과 같습니다.
#ifndef MASTERCONTROLLER_H 
#define MASTERCONTROLLER_H
#include <QObject> 
#include <cm-lib_global.h>
namespace cm { 
  namespace controllers {
    class CMLIBSHARED_EXPORT MasterController : public QObject { 
      Q_OBJECT
        public: explicit MasterController(QObject* parent = nullptr); 
    };
  }
}
#endif
Qt Creator가 제공한 기본 구현에 실제로 추가한 것은 Qt Creator가 cm-lib_global.h에 작성한 CMLIBSHARED_EXPORT 매크로뿐입니다. 공유 라이브러리 내보내기를 처리하고 클래스를 네임스페이스에 넣습니다.

저는 항상 프로젝트 이름을 루트 네임스페이스로 사용하고 소스 디렉토리 내 클래스 파일의 물리적 위치를 반영하는 추가 네임스페이스를 사용합니다. 따라서 이 경우 클래스가 source/ 디렉토리에 있으므로 cm::controllers를 사용합니다. 컨트롤러.

mastercontroller.cpp는 아래와 같습니다.
#include "master-controller.h" 
namespace cm { 
    namespace controllers {
        MasterController::MasterController(QObject* parent) : QObject(parent) { }
    }
}

나는 구현 파일에서 약간 비정통적인 스타일을 사용합니다. 대부분의 사람들은 네임스페이스 cm::controllers를 사용하여 추가합니다. .cpp 파일의 맨 위에 있습니다. 코드는 IDE에서 접을 수 있기 때문에 종종 네임스페이스 범위 내에 코드를 넣는 것을 좋아합니다. 가장 안쪽 네임스페이스 범위(이 예제의 컨트롤러)를 반복하면 C#에서와 마찬가지로 코드를 축소 가능한 영역으로 나눌 수 있습니다. 기능적 차이는 없으므로 선호하는 스타일을 사용하십시오.

QObject

그렇다면 계속해서 나타나는 이 펑키한 QObject는 무엇입니까? 글쎄, 그것은 모든 Qt 객체의 기본 클래스이며 무료로 몇 가지 강력한 기능을 제공합니다.

QObjects는 부모 객체가 자식 객체의 소유권을 가정하는 객체 계층 구조로 스스로를 구성합니다. 즉, 메모리 관리에 대해 걱정할 필요가 없습니다. 예를 들어, QObject에서 파생된 Address의 부모이기도 한 QObject에서 파생된 Client 클래스의 인스턴스가 있는 경우 클라이언트가 소멸될 때 주소도 자동으로 소멸됩니다.

QObject는 어느 정도 유형 검사를 허용하고 QML과의 상호 작용을 위한 백본인 메타데이터를 전달합니다. 또한 이벤트가 신호로 내보내지고 구독된 대리자를 슬롯이라고 하는 이벤트 구독 메커니즘을 통해 서로 통신할 수 있습니다.

지금 기억해야 할 것은 UI에서 상호 작용하려는 위치에 작성하는 모든 사용자 정의 클래스에 대해 QObject에서 파생되는지 확인하는 것입니다. QObject에서 파생할 때마다 다른 작업을 수행하기 전에 항상 마법의 Q_OBJECT 매크로를 클래스에 추가해야 합니다. QObject를 효과적으로 사용하기 위해 이해할 필요가 없는 매우 복잡한 상용구 코드를 주입합니다.

이제 한 하위 프로젝트(cm-lib의 MasterController)에서 다른 하위 프로젝트(cm-ui)의 코드를 참조해야 하는 시점에 도달했습니다. 먼저 #include 문에 대한 선언에 액세스할 수 있어야 합니다. cm-ui.pro에서 INCLUDEPATH 변수를 다음과 같이 편집합니다.

INCLUDEPATH += source 
    ../cm-lib/source


2021년 9월 10일 금요일

Zturn VDMA를 이용한 HDMI 출력 설계이론

 Zturn 보드 HDMI 출력 설계


petalinux 2018.3 버전 기준 framebuffer와 hdmi를 사용하기 위해서 아래를 추가해 줘야 한다.
CONFIG_DRM_SII902X=y
CONFIG_DRM_XILINX_SDI=y
CONFIG_FB_SIMPLE=y
# CONFIG_MYIR_SII902X is not set
CONFIG_USB_OTG=y
CONFIG_USB_OTG_FSM=y
CONFIG_USB_ULPI_BUS=y
CONFIG_XILINX_DPDMA=y
CONFIG_XILINX_INTC=y

또한 device-tree의 아래 내용을 추가해줘야한다.
/include/ "system-conf.dtsi"
/{
    #address-cells = <1>;
    #size-cells = <1>;
    ranges;
    v_frambuf: framebuffer@43C00000 {
        compatible = "simple-framebuffer";
        reg = <0x43C00000 0x7e9000>;
        width = <0x780>;
        height = <0x438>;
        stride = <0x1e00>;
        format = "a8r8g8b8";
        status = "okay";
    };  
};

/{
    memory {
    device_type = "memory";
    reg = <0x0 0x43C00000>;
    };  
};

2021년 8월 15일 일요일

1.7 속성 및 하위 컨트롤 사용자 지정

 Qt의 스타일 시트 시스템을 사용하면 멋지고 전문적인 UI를 쉽게 만들 수 있습니다. 이 예에서는 위젯에 사용자 정의 속성을 설정하고 이를 사용하여 다른 스타일 간에 전환하는 방법을 배웁니다.

위젯 속성과 하위 컨트롤을 사용자 정의하려면 다음 단계를 따르십시오.

  1. 새로운 Qt 프로젝트를 만들어 봅시다. 이를 위해 UI를 준비했습니다. 다음 스크린샷과 같이 UI에는 왼쪽에 세 개의 버튼이 있고 오른쪽에 세 페이지가 있는 탭 위젯이 있습니다.
    1. Vertical Layout 2개, PushButton 3개, Tab widget 사용

      << code >>

      QPushButton

      {

      color: white;

      background-color: #27a9e3;

      border-width: 0px;

      border-radius: 3px;

      }


  2. 다음 스타일 시트를 기본 창(개별 버튼이 아님)에 추가했기 때문에 세 개의 버튼이 파란색입니다.
  3. 나는 당신이 익숙할 수도 있는 다음 스타일 시트를 메인 창에 추가하여 Qt에서 pseudo-states(의사 상태)가 무엇인지 설명할 것입니다.

    << code >>

    QPushButton:hover {

    color: white;

    background-color: #66c011;

    border-width: 0px;

    border-radius: 3px;

    }


  4. 이전 스타일 시트를 사용하여 로그인 화면 만들기 레시피에서 앞의 스타일 시트를 사용하여 마우스 오버 이벤트가 있을 때 버튼의 색상이 변경되도록 했습니다. 이것은 Qt 스타일 시트의 의사 상태에 의해 가능합니다. 이 경우 콜론으로 QPushButton 클래스와 분리된 단어 hover입니다. 모든 위젯에는 활성, 비활성화 및 활성화와 같은 일반 의사 상태 집합과 해당 위젯 유형에 적용할 수 있는 의사 상태 집합이 있습니다. 예를 들어 개방 및 평면과 같은 상태는 QPushButton에 대해 사용할 수 있지만 QLineEdit에는 사용할 수 없습니다. 사용자가 버튼을 클릭할 때 버튼의 색상을 노란색으로 변경하기 위해 눌린 의사 상태를 추가해 보겠습니다.

    << code >>

    QPushButton:pressed {

    color: white;

    background-color: yellow;

    border-width: 0px;

    border-radius: 3px;

    }


  5. 의사 상태를 사용하면 적용되는 조건에 따라 다른 스타일 시트 세트를 로드할 수 있습니다. Qt는 Qt 스타일 시트에서 동적 속성을 구현하여 이 개념을 더욱 발전시킵니다. 이를 통해 사용자 정의 조건이 충족되었을 때 위젯의 스타일 시트를 변경할 수 있습니다. 이 기능을 사용하여 Qt의 사용자 정의 속성을 사용하여 설정할 수 있는 사용자 정의 조건을 기반으로 버튼의 스타일 시트를 변경할 수 있습니다. 먼저 이 스타일 시트를 기본 창에 추가합니다.

    << code >>

    QPushButton[pagematches=true] {

    color: white;

    background-color: red;

    border-width: 0px;

    border-radius: 3px;

    }


  6. pagematches 속성이 true를 반환하면 푸시 버튼의 배경색이 빨간색으로 변경됩니다. 분명히 이 속성은 QPushButton 클래스에 존재하지 않습니다. 그러나 QObject::setProperty()를 사용하여 버튼에 추가할 수 있습니다.

    << code >>

    QPushButton[pagematches=true] {

    color: white;

    background-color: red;

    border-width: 0px;

    border-radius: 3px;

    }


    1. mainwindow.cpp 소스 코드에서 ui->setupUi(this) 바로 뒤에 다음 코드를 추가합니다.

    2. 앞의 코드는 pagematches라는 사용자 정의 속성을 첫 번째 버튼에 추가하고 해당 값을 true로 설정합니다. 이렇게 하면 기본적으로 첫 번째 버튼이 빨간색으로 바뀝니다.

    3. 그런 다음 탭 위젯을 마우스 오른쪽 버튼으로 클릭하고 Go to Slot...을 선택합니다. 그러면 창이 팝업됩니다. 목록에서 currentChanged(int) 옵션을 선택하고 확인을 클릭합니다. Qt는 다음과 같은 슬롯 기능을 생성합니다.
    4. 탭 위젯의 페이지를 변경할 때마다 슬롯 함수가 호출됩니다. 그런 다음 슬롯 기능에 코드를 추가하여 원하는 작업을 결정할 수 있습니다. 그렇게 하려면 mainwindow.cpp를 열면 거기에 함수 선언이 표시됩니다. 함수에 몇 가지 코드를 추가해 보겠습니다
      << code >>
      void MainWindow::on_tabWidget_currentChanged(int index)
      {
          // Set all buttons to false
          ui->Page1->setProperty("pagematches", false);
          ui->Page2->setProperty("pagematches", false);
          ui->Page3->setProperty("pagematches", false);

          // Set one of the buttons to true
          if (index == 0)
              ui->Page1->setProperty("pagematches", true);
          else if (index == 1)
              ui->Page2->setProperty("pagematches", true);
          else
              ui->Page3->setProperty("pagematches", true);

          // Update buttons style
          ui->Page1->style()->polish(ui->Page1);
          ui->Page2->style()->polish(ui->Page2);
          ui->Page3->style()->polish(ui->Page3);
      }

  7. 앞의 코드는 탭 위젯이 현재 페이지를 전환할 때 세 버튼 모두의 pagematches 속성을 false로 설정합니다. 어떤 버튼이 빨간색으로 바뀔지 결정하기 전에 모든 것을 재설정해야 합니다.
  8. 현재 페이지의 인덱스 번호를 알려주는 이벤트 신호에 의해 제공된 인덱스 변수를 확인하십시오. 인덱스 번호를 기반으로 버튼 중 하나의 pagematches 속성을 true로 설정합니다.
  9. Polish()를 호출하여 세 버튼 모두의 스타일을 새로 고칩니다. mainwindow.h에 다음 헤더를 추가할 수도 있습니다.
    << code >>
    #include <QStyle>

  10. 프로젝트를 빌드하고 실행합니다. 이제 탭 위젯을 다른 페이지로 전환할 때마다 세 개의 버튼이 빨간색으로 변경되는 것을 볼 수 있습니다. 또한 버튼은 마우스 오버 시 녹색으로 변경되고 클릭 시 노란색으로 변경됩니다.

Qt는 사용자에게 모든 유형의 위젯에 자신의 사용자 정의 속성을 추가할 수 있는 자유를 제공합니다. 사용자 정의 속성은 Qt가 기본적으로 이러한 컨텍스트를 제공하지 않는 특수 조건이 충족될 때 특정 위젯을 변경하려는 경우 매우 유용합니다. 이를 통해 사용자는 Qt의 유용성을 확장하고 맞춤형 솔루션을 위한 유연한 도구를 만들 수 있습니다. 예를 들어 기본 창에 버튼 행이 있고 탭 위젯이 현재 표시하고 있는 페이지에 따라 색상을 변경해야 하는 경우 버튼이 색상을 변경해야 할 때를 알 방법이 없습니다. Qt 자체에는 이러한 유형의 상황에 대한 기본 제공 컨텍스트가 없기 때문입니다. 이 문제를 해결하기 위해 Qt는 QObject::setProperty()라는 일반 함수를 사용하는 위젯에 자체 속성을 추가하는 방법을 제공합니다. 사용자 정의 속성을 읽기 위해 QObject::property()라는 다른 함수를 사용할 수 있습니다.

다음으로 Qt 스타일 시트의 하위 컨트롤에 대해 이야기하겠습니다. 종종 위젯은 단일 개체가 아니라 더 복잡한 위젯을 형성하는 데 사용되는 둘 이상의 개체 또는 컨트롤의 조합입니다. 이러한 개체를 하위 컨트롤이라고 합니다.

예를 들어 스핀 상자 위젯에는 입력 필드, 아래쪽 버튼, 위쪽 버튼, 위쪽 화살표 및 아래쪽 화살표가 포함되어 있으며 이는 다른 위젯에 비해 상당히 복잡합니다. 이 경우 Qt는 원하는 경우 스타일 시트를 사용하여 모든 하위 컨트롤을 변경할 수 있도록 하여 더 많은 유연성을 제공합니다. 위젯의 클래스 이름 뒤에 있는 하위 컨트롤의 이름을 이중 콜론으로 구분하여 지정하면 됩니다. 예를 들어 다운 버튼의 이미지를 스핀 상자로 변경하려면 다음과 같이 스타일 시트를 작성할 수 있습니다.

<< code >>
QSpinBox::down-button {
image: url(:/images/spindown.png);
subcontrol-origin: padding;
subcontrol-position: right bottom;
}
그러면 이미지가 내 스핀 상자의 아래쪽 버튼에만 적용되고 위젯의 다른 부분에는 적용되지 않습니다. 사용자 정의 속성, 의사 상태 및 하위 제어를 결합하여 Qt는 사용자 인터페이스를 사용자 정의할 수 있는 매우 유연한 방법을 제공합니다.


1.6 스타일 시트의 리소스 사용

 Qt는 나중에 사용할 수 있도록 프로그램 실행 파일에 모든 유형의 파일을 저장할 수 있는 플랫폼 독립적 리소스 시스템을 제공합니다. 이미지, 오디오, 비디오, HTML, XML, 텍스트 파일, 바이너리 파일 등 실행 파일에 저장할 수 있는 파일 유형에는 제한이 없습니다.

리소스 시스템은 애플리케이션에서 언제든지 액세스할 수 있도록 리소스 파일(예: 아이콘 및 번역 파일)을 실행 파일에 포함하는 데 유용합니다. 이를 달성하려면 .qrc 파일에서 리소스 시스템에 추가하려는 파일을 Qt에 알려야 하고 Qt는 빌드 프로세스 중에 나머지를 처리합니다.

프로젝트에 새 .qrc 파일을 추가하려면 File | New File or Project... 에서 File and Clsses의 Qt를 선택하고 Qt Resource File을 선택합니다. 그런 다음 이름(즉, 리소스)을 지정하고 다음 버튼을 클릭한 후 마침 버튼을 클릭합니다. 이제 .qrc 파일이 생성되고 Qt Creator에 의해 자동으로 열립니다. Qt Creator가 자원을 관리하기 위한 사용자 인터페이스를 제공하므로 XML 형식으로 .qrc 파일을 직접 편집할 필요가 없습니다.

프로젝트에 이미지와 아이콘을 추가하려면 이미지와 아이콘이 프로젝트 디렉토리에 있는지 확인해야 합니다. .qrc 파일에 마우스 오른쪽 버튼을 클릭하여 Add Prefix 선택하여 리소스를 관리할 수 있다. Prefix는 프로젝트에 많은 리소스가 있을 때 더 잘 관리할 수 있도록 리소스를 분류하는 데 사용됩니다.

  1. 방금 만든 Prefix의 이름을 /icons로 바꿉니다.
  2. Add를 클릭한 다음 Prefix 추가를 클릭하여 다른 Prefix를 생성합니다.
  3. 새 Prefix의 이름을 /images로 바꿉니다.
  4. /icons Prefix를 선택하고 Add를 클릭한 다음 파일 추가를 클릭합니다.
  5. 파일 선택 창이 나타납니다. 이것을 사용하여 모든 아이콘 파일을 선택하십시오. 키보드의 Ctrl 키를 누른 상태에서 파일을 클릭하여 선택하면 한 번에 여러 파일을 선택할 수 있습니다. 완료되면 열기를 클릭합니다.
  6. /images 접두사를 선택하고 추가 버튼을 클릭한 다음 파일 추가 버튼을 클릭합니다. 파일 선택 창이 다시 뜨는데 이번에는 배경 이미지를 선택하겠습니다.
  7. 이전 단계를 반복하되 이번에는 /images 접두사에 로고 이미지를 추가합니다. Ctrl + S를 눌러 완료하면 저장하는 것을 잊지 마십시오. .qrc 파일은 이제 다음과 같아야 합니다.

  8. mainwindow.ui 파일로 돌아가십시오. 방금 프로젝트에 추가한 리소스를 활용해 보겠습니다. 상단 패널에 있는 다시 시작 버튼을 선택합니다. 아이콘 속성이 표시될 때까지 속성 편집기를 아래로 스크롤합니다. 드롭다운 화살표 아이콘이 있는 작은 버튼을 클릭하고 메뉴에서 리소스 선택을 클릭합니다.
  9. 리소스 선택 창이 나타납니다. 왼쪽 패널에서 아이콘 접두사를 클릭하고 오른쪽 패널에서 다시 시작 아이콘을 선택합니다. 확인을 누릅니다.

  10. 버튼에 작은 아이콘이 나타납니다. 기본 아이콘 크기가 16 x 16으로 설정되어 있기 때문에 아이콘이 매우 작게 보입니다. iconSize 속성을 50 x 50으로 변경하면 아이콘이 더 크게 표시되는 것을 볼 수 있습니다. 종료 버튼에 대해 이전 단계를 반복하되 이번에는 종료 아이콘을 대신 선택합니다.
  11. 이제 두 개의 버튼이 다음과 같아야 합니다.

  12. 리소스 파일에 추가한 이미지를 로고로 사용합시다. 로고 위젯을 선택하고 앞서 추가한 스타일 시트를 제거하여 윤곽선을 렌더링합니다.
  13. pixmap속성이 보일 때까지 속성 편집기를 아래로 스크롤합니다.
  14. pixmap 속성 뒤에 있는 작은 드롭다운 버튼을 클릭하고 메뉴에서 리소스 선택을 선택합니다. 로고 이미지를 선택하고 확인을 클릭합니다. 로고 크기가 더 이상 이전에 설정한 치수를 따르지 않습니다. 대신 이미지의 실제 치수를 따릅니다. 이것이 단순히 픽스맵 속성이 작동하는 방식이기 때문에 치수를 변경할 수 없습니다.
  15. 로고의 크기를 더 많이 제어하려면 픽스맵 속성에서 이미지를 제거하고 대신 스타일 시트를 사용할 수 있습니다. 다음 코드를 사용하여 아이콘 컨테이너에 이미지를 적용할 수 있습니다.
  16. 이미지의 경로를 얻으려면 파일 목록 창에서 이미지 이름을 마우스 오른쪽 버튼으로 클릭하고 경로 복사를 선택합니다. 경로는 운영 체제의 클립보드에 저장되며 이제 이전 스타일 시트에 붙여넣을 수 있습니다. 이 방법을 사용하면 이미지가 스타일을 적용한 위젯의 크기에 맞는지 확인할 수 있습니다. 이제 로고가 다음 스크린샷과 같이 표시됩니다.

  17. 스타일 시트를 사용하여 바탕 화면 이미지를 배경에 적용합니다. 배경 크기는 창 크기에 따라 달라지므로 여기에서는 픽스맵을 사용할 수 없습니다. 대신 스타일 시트에서 border-image 속성을 사용합니다. 기본 창을 마우스 오른쪽 버튼으로 클릭하고 스타일 시트 변경...을 선택하여 스타일 시트 편집 창을 엽니다. CentralWidget의 스타일 시트 아래에 새 줄을 추가합니다.

    << code >>

    #centralwidget {

    background-color: rgba(32, 80, 96, 100);

    border-image: url(:/imses/resources/login_bg.png);

    }


  18. 정말 간단하고 쉽습니다! 이제 로그인 화면이 다음과 같아야 합니다.

1.5.5 스타일 시트를 사용하여 로그인 화면 만들기

 아직 끝나지 않았습니다! 이전 레시피(1.5.4 스타일 시트를 사용하여 로그인 화면 만들기)를 보면 로그인 양식과 로고는 그 아래의 수직 스페이서로 인해 기본 창 상단에 붙어 있습니다. 로고와 로그인 양식은 메인 창 상단이 아닌 중앙에 위치해야 합니다. 이 문제를 해결하려면 다음 단계를 따르세요.

  1. 상단 패널과 로고 레이아웃 사이에 또 ​​다른 수직 스페이서를 추가하면 정렬의 균형을 맞추는 하단의 스페이서에 대응합니다.
  2. 로고가 로그인 양식에 너무 가깝게 붙어 있다고 생각되면 로고의 레이아웃과 로그인 양식의 레이아웃 사이에 수직 스페이서를 추가할 수 있습니다. sizeType 속성을 Fixed로 설정하고 Height 속성을 10으로 설정합니다.

  3. 상단 패널의 레이아웃을 마우스 오른쪽 버튼으로 클릭하고 Morph into | QWidget 이름을 topPanel로 바꿉니다. 레이아웃에는 여백 이외의 속성이 없기 때문에 레이아웃에 스타일 시트를 적용할 수 없기 때문에 레이아웃을 QWidget으로 변환해야 합니다.

  4. main window 의 가장자리 주위에 약간의 여백이 있습니다. 여백을 제거하려면 MainWindow 패널 바로 아래에 있는 Object Inspector 창에서 centralWidget 개체를 선택하고 모든 여백 값을 0으로 설정합니다.

  5. 실행 버튼(녹색 화살표 아이콘 포함)을 클릭하여 프로젝트를 실행하여 프로그램이 어떻게 생겼는지 확인합니다. 모든 것이 잘 되었다면 다음과 같이 표시되어야 합니다.

  6. 스타일시트로 UI를 꾸며보자! 모든 중요한 위젯에 개체 이름이 지정되었기 때문에 기본 창에서 스타일 시트를 적용하는 것이 더 쉽습니다. 스타일 시트를 기본 창에만 작성하고 계층 구조 트리를 상속하도록 하기 때문입니다.
  7. Object Inspector 창에서 MainWindow를 마우스 오른쪽 버튼으로 클릭하고 Change styleSheet...를 선택합니다.
  8. 스타일 시트에 다음 코드를 추가합니다.

    << code >>

    #centralWidget {

    background: rgba(32, 80, 96, 100);

    }


  9. 기본 창의 배경색이 변경됩니다. 다음 스타일 시트에서 리소스 사용 섹션에서 배경 이미지를 사용하는 방법을 배웁니다. 따라서 색상은 일시적입니다.
  10. Qt에서 메인 윈도우 자체에 스타일을 적용하려면 윈도우가 컨테이너일 뿐이기 때문에 메인 윈도우 대신에 해당하는 centralWidget에 스타일을 적용해야 합니다.
  11. 상단 패널에 멋진 그라디언트 색상을 추가합니다.

    << code >>

    #topPanel {

    background-color: qlineargradient(spread:reflect, x1:0.5, y1:0, x2:0, y2:0, stop:0 rgba(91, 204, 233, 100), stop:1 rgba(32, 80, 96, 100));

    }


  12. 로그인 폼에 검은색을 적용하여 반투명하게 보이게 합니다. 또한 border-radius 속성을 설정하여 로그인 양식 컨테이너의 모서리를 약간 둥글게 만들 것입니다.

    << code>>

    #loginForm {

    background: rgba(0, 0, 0, 80);

    border-radius: 8px;

    }


  13. 일반 유형의 위젯에 스타일 적용:

    << code >>

    QLabel { color: white; }

    QLineEdit { border-radius: 3px; }


  14. 앞의 스타일 시트는 모든 레이블의 텍스트를 흰색으로 변경합니다. 여기에는 위젯의 텍스트도 포함됩니다. 내부적으로 Qt는 텍스트가 있는 위젯에 동일한 유형의 레이블을 사용하기 때문입니다. 또한 라인 편집 위젯의 모서리를 약간 둥글게 만들었습니다.
  15. UI의 모든 푸시 버튼에 스타일 시트를 적용합니다.

    << code >>

    QPushButton {

    color: white;

    background-color: #27a9e3;

    border-width: 0px;

    border-radius: 3px;

    }


  16. 앞의 스타일 시트는 모든 버튼의 텍스트를 흰색으로 변경한 다음 배경색을 파란색으로 설정하고 모서리도 약간 둥글게 만듭니다.
  17. 더 나아가기 위해 hover 키워드를 사용하여 마우스를 올려놓았을 때 푸시 버튼의 색상이 변경되도록 만들 것입니다.

    << code >>

    QPushButton:hover { background-color: #66c011; }


  18. 앞의 스타일 시트는 푸시 버튼 위에 마우스를 올려 놓으면 푸시 버튼의 배경색을 녹색으로 변경합니다. 이에 대해서는 다음 속성 및 하위 컨트롤 사용자 지정 섹션에서 자세히 설명합니다.
  19. 위젯의 크기와 여백을 추가로 조정하여 더 보기 좋게 만들 수 있습니다. 앞서 6단계에서 직접 적용한 스타일 시트를 제거하여 로그인 양식의 경계선을 제거하는 것을 잊지 마십시오.
  20. 로그인 화면은 다음과 같아야 합니다.

2021년 8월 14일 토요일

1.5.4 스타일 시트를 사용하여 로그인 화면 만들기

 아직 로그인 양식이 완료되지 않았습니다. 이제 로그인 양식에 대한 컨테이너를 만들었으므로 양식에 더 많은 위젯을 넣을 차례입니다.

  1. 두 개의 Horizontal Layout을 로그인 양식 컨테이너에 배치합니다. 두 개의 레이아웃은 하나는 사용자 이름 필드용이고 다른 하나는 암호 필드용입니다.
  2. 방금 추가한 각 레이아웃에 Label 및 Line Edit을 추가합니다. 위쪽 레이블의 text 속성을 Username:으로 변경하고 아래쪽 레이블을 Password:로 변경합니다. 두 줄 편집의 이름을 각각 사용자 이름과 암호로 바꿉니다.
  3. 비밀번호 레이아웃 아래에 푸시 버튼을 추가하고 텍스트 속성을 로그인으로 변경합니다. 이름을 loginButton으로 바꿉니다.
  4. 비밀번호 레이아웃과 로그인 버튼 사이에 수직 스페이서를 추가하여 약간의 거리를 둘 수 있습니다. 수직 스페이서를 배치한 후 sizeType 속성을 Fixed로 변경하고 Height를 5로 변경합니다.

  5. loginForm 컨테이너를 선택하고 모든 여백을 35로 설정합니다. 이는 모든 측면에 약간의 공간을 추가하여 로그인 양식을 더 보기 좋게 만들기 위한 것입니다.

  6. Username, Password 및 loginButton 위젯의 Height 속성을 25로 설정하여 비좁게 보이지 않도록 합니다.
  7. UI는 다음과 같아야 합니다.

1.5.3 스타일 시트를 사용하여 로그인 화면 만들기

 이제 다음 단계를 사용하여 로그인 양식을 생성해 보겠습니다.

  1. 로고 레이아웃과 수직 스페이서 사이에 수평 레이아웃을 추가합니다. layoutTopMargin 속성을 큰 수(100)로 설정하면 위젯을 더 쉽게 추가할 수 있습니다.

  2. 방금 만든 가로 레이아웃 안에 세로 레이아웃을 추가합니다. 이 레이아웃은 로그인 양식의 컨테이너로 사용됩니다. 위젯을 배치할 수 있도록 layoutTopMargin을 수평 레이아웃보다 낮은 숫자(20)로 설정합니다.

  3. 방금 만든 세로 레이아웃을 마우스 오른쪽 버튼으로 클릭하고 Morph into | QWidget을 클릭한다. 세로 레이아웃이 빈 위젯으로 변환된다. 이 단계는 로그인 양식에 대한 컨테이너의 너비와 높이를 조정할 것이기 때문에 필수적입니다. 레이아웃 위젯은 너비와 높이에 대한 속성을 포함하지 않고 여백만 포함합니다. 레이아웃이 주변의 빈 공간으로 확장된다는 사실 때문에 크기 속성이 없다는 점을 고려하면 의미가 있습니다. 레이아웃을 QWidget 객체로 변환한 후에는 자동으로 위젯 클래스의 모든 속성을 상속하므로 이제 필요에 맞게 크기를 조정할 수 있습니다.
  4. 레이아웃에서 방금 변환한 QWidget 객체의 이름을 loginForm으로 바꾸고 수평 정책 및 수직 정책 속성을 모두 고정으로 변경합니다. minimumSize 매개변수를 350 x 200으로 설정합니다.
  5. 가로 레이아웃 안에 이미 loginForm 위젯을 배치했으므로 이제 layoutTopMargin 속성을 다시 0으로 설정할 수 있습니다.

  6. 로고와 동일한 스타일 시트를 loginForm 위젯에 추가하여 일시적으로 표시되도록 합니다. 단, 이번에는 ID 선택기를 앞에 추가하여 하위 위젯이 아닌 loginForm에만 스타일을 적용해야 한다는 점을 제외하고는 다음과 같습니다.

    << code >>

    #loginForm { border: 1px solid; }


  7. UI는 다음과 같아야 합니다

VITIS Git + Doxygen Config

 Doxygen Configure 1. Vitis 메뉴의 Window->Preference의 C/C++ -> Editor의 Documentation tool comments 기본 설정값을 Doxygen으로 변경 설정 후 함수 바로 위에서 /...