Programming 101

[Qt] Serial 통신 프로그램 제작 및 배포 (ComportFree) - github 공유

안녕하세요. Qt 프로그램을 가지고 무엇을 해볼까 하다가 장비들 제어할 때 사용하는 시리얼 프로그램을 한번 원하는 기능을 넣어서 만들어보자 생각이 들어 시작해 보았습니다. 기존에도 좋은 Serial 통신 프로그램도 많이 있지만, 개인적으로 조금 원하는 부분이 있고, 이런저런 기능을 추가해 보면 어떨까 생각했습니다. 첫 번째 버전은 간단하게 시리얼 포트를 검색하고 데이터를 받고 표시하고 오류들을 처리하는 로직, 로그를 저장, 환경설정 저장하기 기능 등을 기본 기능을 만들었습니다. 그리고 버전 체크하는 부분도 추가해서, 향후 github에서 버전업 release 될 경우 체크 버튼을 누르면 확인할 수 있습니다. 잘 만든 것은 아니지만, 소스를 오픈하고 버전을 조금씩 업데이트해 나가는 방식으로 생각..

Programming/Qt 2025.07.31

[C++] std::list 기본 사용법 알아보기

안녕하세요. C++ 표준 라이브러리의 std::list는 데이터를 유연하게 다루고 싶을 때 유용한 컨테이너입니다. std::list의 기본적인 개념과 특징, 그리고 실제 사용 예제틀 통해 알아보겠습니다. 1. std::list란 std::list는 이중 연결 리스트(Doubly-linked List)로 구현된 시퀀스 컨테이너입니다. 각 데이터 조각(노드)이 자신의 앞뒤에 어떤 노드가 있는지에 대한 정보(포인터)를 모두 들고 있는 구조입니다. 이러한 구조 덕분에 리스트의 어느 위치에서든 원소를 추가하거나 삭제하는 작업이 매우 빠르다는 핵심적인 장점을 가집니다. - std::forward_list와의 비교하자면, std::forward_list는 단일 연결 리스트로, 앞으로만 탐색할 수 있습니..

Programming/C, C++ 2025.07.29

[C++] std::vector 기본 사용법 알아보기

안녕하세요. 이전 글에서 std::array에 대해 알아보았습니다. 이번 글에서는 std::array의 단점을 보완한 새로운 컨테이너인 std::vector에 대해 자세히 알아보겠습니다. 1. std::array의 한계점 std::array는 정적 배열의 장점을 가지지만, 몇 가지 한계점을 가지고 있습니다. (1) 컴파일 시 크기 결정: std::array의 크기는 컴파일 시간에 결정되는 상수여야 합니다. 이 말은 프로그램이 실행되는 동안에는 배열의 크기를 변경할 수 없다는 의미입니다. (2) 크기 고정 및 원소 추가/삭제 불가: 크기가 고정되어 있기 때문에, std::array는 런타임에 원소를 추가하거나 삭제할 수 없습니다. 이는 유연성이 필요한 상황에서 큰 단점이 됩니다. (3) 스택 메모리 ..

Programming/Qt 2025.07.27

[Qt] QCustomPlot이용한 차트(Chart) 기본 사용법 알아보기

안녕하세요. 우리가 많은 데이터가 있다면 정리해서 표로 보곤 합니다. 그러나 한눈에 잘 들어오지는 않습니다. 그래서 시각화하는 것이 그래프 혹은 차트일 것입니다. Qt 자체에서 제공해 주는 Chart를 이용할 수 있 수 있습니다. 그러나 조금 자유도가 있고, 여러 가지 설정을 해볼 수 있는 알려준 오픈소스가 있어서 간단하게 사용하는 방법을 알아보겠습니다. 1. QCustomPlot 란 QCustomPlot 사이트에 있는 정보를 조금 가져왔습니다. QCustomPlot은 플로팅 및 데이터 시각화를 위한 Qt C++ 위젯입니다. 추가 종속성이 없으며 문서화가 잘 되어 있습니다. 이 플로팅 라이브러리는 보기 좋고 출판 품질이 높은 2D 플롯, 그래프 및 차트를 만드는 데 중점을 두고 있으며, 실시간 ..

Programming/Qt 2025.07.25

[C++] std::array 기본 사용법 알아보기

안녕하세요. C언어 스타일로 C++을 사용하다 보면 배열을 동적으로 할당하고 해제하는 코드를 지속적으로 사용하는 경우가 있습니다. C++로 넘어오면 자유도와 속도가 조금 느릴 수 있지만, 편리하게 사용할 수 있는 STL을 제공해주고 있습니다. 그래서 std::array를 사용하는 방법을 조금 알아보려고 합니다. 1. std::array 기본 사용법 std::array는 원소의 타입과 배열 크기를 매개변수로 사용하는 클래스 탬플릿입니다. 그리고 중요한 메모리를 자동으로 할당하고 해제하는 기능이 있습니다. int형 타입의 크기가 5인 배열을 선언은 아래와 같이할 수 있습니다.std::array arrData; std:array는 C 스타일 배열과 동일한 방식의 배열 원소 접근 [] ..

Programming/C, C++ 2025.07.22

Qt에서 응용 애플리케이션(실행 프로그램) 아이콘 추가하는 방법 알아보기

안녕하세요. Qt로 프로그램을 만들 후에 배포하려고 할 때, 프로그램의 고유의 아이콘도 있으면 추가하면 좋다고 생각할 것입니다. 프로그램을 빌드하면 디폴트(기본)로 생성되는 아이콘이 생성됩니다. 이번에는 프로그램에 특징에 맞는 아이콘이 적용해 보겠습니다. 아이콘을 적용 방법을 알고자 하는 내용이기 때문에 ChatGPT를 이용해서 샘플 멀티 이미지를 생성했습니다. 1. 테스트 환경 (1) Windows11 환경, 빌드 환경은 Qt6.8.3, CMake 사용 (2) 아이콘을 위한 디자인 요청 및 멀티 아이콘 파일 생성은 ChatGPT 사용 아이콘을 위해 만든 이미지가 있다면 ChatGPT에 윈도우 실행파일(. exe)을 위한 멀티 아이콘을 생성해 달라고 하면 Python 코드가 나오면서 파일을 만..

Programming/Qt 2025.07.20

[Qt] 애플리케이션을 windeployqt.exe 이용해 배포버전 버전 만들기

안녕하세요. Qt로 개발된 애플리케이션을 배포하려면, 앱이 실행되는 데 필요한 모든 Qt 라이브러리 및 종속성 파일을 함께 제공해야 합니다. 여러 dll 파일을 매번 복사하고 또 어떤 dll 파일이 필요한 찾아내는 것도 귀찮은 일입니다. 이 과정을 windeployqt.exe 도구를 사용하면 효율적으로 수고를 줄일 수 있습니다. 1. windeployqt.exe란 무엇인가? windeployqt.exe는 Qt 설치 시 함께 제공되는 유틸리티입니다. Windows 환경에서 Qt 애플리케이션을 배포할 때 필요한 모든 Qt 관련 DLL 파일, 플러그인, 번역 파일 등을 자동으로 수집하여 애플리케이션 실행 파일과 동일한 디렉터리 또는 지정된 디렉터리에 복사해 주는 도구입니다. 수동으로 이 모든 파일들을..

Programming/Qt 2025.07.19

[C++] const 객체를 선언 시 멤버 함수 에러 상황과 this 포인터 이해하기

안녕하세요. C/C++에서 const 키워드는 "이 변수는 절대 변경되지 않는다"는 의미입니다. 하지만 이 의미는 객체에 적용하면 조금 특별한 상황이 발생합니다. const로 선언된 객체는 내부 데이터를 바꿀 수 없어야 하는데, 컴파일러는 어떤 멤버 함수가 데이터를 바꾸고 어떤 함수가 바꾸지 않는지 알 수가 없습니다. const객체가 멤버 함수를 호출할 때 발생하는 문제와 해결책인 this포인터에 대해서 알아보겠습니다. 객체에 const를 붙이면 이렇게 해주어야 하는구나 참고하면 좋을 듯합니다. 1. const객체는 멤버 함수의 에러 발생 상황 const로 선언한 객체에서 일반 멤버 함수를 호출했을 때 어떤 문제가 발생하는지 코드를 통해 살펴보겠습니다. #include class ..

Programming/C, C++ 2025.07.18

[C/C++] 구조체(struct) 기초 확인하기

안녕하세요 C/C++ 언어를 배우면서 클래스로 넘어가기 전에 struct 자료형에 대해 알고 있으면 도움이 될 것 같아서 내용을 정리해 보았습니다. struct가 이런 내용이었지 확인 차 혹은 기초를 알고자 하는 분들에게 도움이 되었으면 합니다. 1. 구조체(struct)란? 구조체란 이름, 나이, 주소처럼 서로 관련 있는 여러 타입의 변수들을 하나의 그룹으로 묶어 새로운 자료형을 만드는 기능입니다. 마치 여러 정보를 담고 있는 학생증처럼, 데이터들을 하나로 묶어 편리하게 다룰 수 있게 해주는 유용한 도구입니다. 2. 구조체 정의하고 변수 선언하기 1) 구조체 정의하고 변수 선언 구조체를 사용하는 일반적인 방법은 태그(Tag) 이름을 지정하여 틀을 만드는 것입니다. struct Student..

Programming/C, C++ 2025.07.12

[C++] 람다(Lambda)가 없던 시절 사용했던 방법 알아보기

안녕하세요. 오늘날 C++ 개발에서 람다(Lambda) 표현식을 알게 모르게 사용하고 있습니다. 코드를 간결하게 만들고 알고리즘과 함께 사용할 때 가독성을 크게 높여줍니다. 하지만 람다가 표준으로 채택된 것은 C++11부터입니다. 그렇다면 람다가 없던 C++03 시절에는 비슷한 작업을 어떻게 처리했는지 알아보겠습니다. count_if 알고리즘을 예제로 C++ 프로그래밍 기법으로 확인해 보겠습니다. 1. 가장 전통적인 방식: 함수 포인터 (Function Pointer) 가장 고전적인 방법은 함수 포인터를 알고리즘에 직접 전달하는 것입니다. 특정 조건을 검사하는 전역 함수를 만들고, 이 함수의 주소를 넘겨주는 방식입니다. #include #include #include // 1. 조건 검사를 위한..

Programming/C, C++ 2025.07.11

[C++] 스마트 포인터 weak_ptr에 대해서 알아보기

안녕하세요. 조금은 흥미 없어 할 수 있는 내용인데 스마트 포인터 중 하나인 weak_ptr이라는 것이 있구나 차원에서 보면 어떨까 합니다. 1. 컨트롤 블록과 shared_ptr의 원리 weak_ptr를 이해하려면, 먼저 그 기반이 되는 shared_ptr과 컨트롤 블록(Control Block)의 관계를 조금 알아야 합니다. shared_ptr이 객체를 관리할 때, 힙 메모리에 컨트롤 블록이라는 별도의 관리용 데이터 구조를 생성합니다. 이 컨트롤 블록은 객체의 생명주기를 결정하는 핵심 정보를 담고 있습니다. 1) 컨트롤 블록의 내용 (1) Strong Reference Count (강한 참조 카운트) : 객체를 '소유'하는 shared_ptr의 개수입니다. 이 카운트가 0이 되면 객체는 ..

Programming/C, C++ 2025.07.05

[Qt] fritzing (회로설계) Open Source 빌드해보기 (실패담)

안녕하세요. OR CAD처럼 전문적인 회로도 구성은 아니지만, 조금 쉽게 회로도를 만들고, PCB까지 만들 수 있는 제작할 수 있는 프로그램입니다. fritzing은 Qt로 오픈소스로 되어 있어 참여도 해볼까 생각도 들어 빌드해 보았는데 될 듯 말 듯하다가 결국 실패한 내용 공유드립니다. 프로젝트가 중간에 한번 중지되었다가 다시 진행되는 것 같은데, 유료 버전과 빌드해서 사용하는 사람들에게는 무료다 보니 빌드 자료는 업데이트가 되지 않는 듯합니다. 실패한 것을 왜 올리느냐 할 수 있는데, Gemini와 GPT에게 물어 가면서 했지만, 사람을 실험시키는 아직 미완성 AI 내용을 따라 했기 때문에 아마 시도한다면 비슷하게 할 것이라 생각되어 미리 프롬프트 등을 입력해서 작업을 하는 것에 도움이 될..

Programming/Qt 2025.07.03

[Qt] Qt Creator에서 생성한 python 가상환경에서 PySide6 작업하기

안녕하세요. Qt Creator 툴을 사용하면서 Python도 가능하다는 것을 알고 있을 것입니다. PySide6을 사용하면서 코딩하면 되는 것 아니냐고 할 수 있는데, 가상환경을 이용한다면 라이브러리도 설치하고 배포할 리스트화 할 수 있습니다. 간단하게 사용하는 방법을 알아보겠습니다. 프로젝트 환경은 Windows11, Qt 6.8.3에서 진행했습니다. 1. Qt for Python 프로젝트 생성 기본적인 프로젝트 방법은 동일합니다. 선택을 Qt for Python으로 합니다. 그리고 UI도 가능한 것을 확인하기 위해서 Window UI를 선택합니다. Project Location, Name과 Define Class Name은 원하는 것으로 하면 됩니다. 여기서는 Name을 Qt_f..

Programming/Qt 2025.06.28

[C++] if 조건문과 암시적 bool 형변환에 대해 이해하기

안녕하세요. C++에서 if(expression) 문은 가장 기본적인 제어문 하나입니다. 우리는 보통 표현식(expression) 자리에 true 또는 false를 반환하는 비교 연산(i > j 등)이 알고 있습니다. 하지만 C++의 if문은 생각보다 훨씬 유연하게 동작합니다. 그리고 바로 그 부분이 미묘한 버그의 원인이 되기도 합니다. 이번 글에서는 if문의 조건식이 어떻게 평가되는지, 그리고 C++11의 explicit 키워드가 사용하기 전에 개발자들이 bool 타입에 대한 내용에 대해 재미 삼아 알아보겠습니다. 1. 숫자와 포인터도 받아주는 if문 C++의 if문은 조건식의 결과가 꼭 bool 타입일 필요가 없습니다. 0이 아닌 숫자나 null이 아닌 포인터 등 참(true)으로 평가될 ..

Programming/C, C++ 2025.06.26

[Qt for Android] 카메라 영상 확인을 위한 yuv raw 데이터 저장 및 프레임 확인하기

안녕하세요. 안드로이드 카메라 영상(yuv) 프레임 데이터를 출력하면서 저장된 프레임이 잘 나오지 않아서 확인해 보았습니다. 테스트 환경은 Qt Creator와 Qt for Android(6.8.3), galaxy S20을 이용했습니다. 1. yuv Raw 데이터 저장 카메라 영상을 가지고 오는 로직은 제외했습니다. 영상 데이터가 전달되었다고 생각이 드는데, 영상이 나오지 않는다면, 간단하게 첫 프레임을 저장해서 확인해 보는 것입니다. void VideoWidget::slotImageReady(uint8 * data, int size, int width, int height, int format, int bpl){ QMutexLocker locker(&m_mutex); if (!i..

Programming/Qt 2025.06.22

[C++] shared_ptr (1) - 필요성에 대해 알아보기

안녕하세요. C++에서 메모리 관리는 중요한 요소 중 하나입니다. 특히 new와 delete를 사용하여 직접 메모리를 할당하고 해제하는 방식은 유연성을 제공하지만, 동시에 다양한 문제점을 야기할 수 있습니다. 이번 글에서는 이러한 문제를 해결하기 위한 방법 중 std::shared_ptr에 대해 알아보겠습니다. 1. shared_ptr란 무엇일까요? std::shared_ptr는 C++11부터 표준 라이브러리에 포함된 스마트 포인터(Smart Pointer)의 한 종류입니다. 스마트 포인터는 이름 그대로 일반적인 "날 것의 포인터(raw pointer)"가 가지고 있는 단점을 보완하기 위해 만들어진 객체 래퍼(object wrapper)입니다. shared_ptr의 핵심은 참조 횟수(refer..

Programming/C, C++ 2025.06.20

[C++] Thread Local Storage (TLS)인 thread_local 대해 알아보기

안녕하세요. C++ 프로젝트를 진행하시면서 스레드별로 독립적인 데이터를 관리해야 할 때가 있습니다. 바로 그럴 때 사용할 수 있는 Thread Local Storage (TLS) 방법이 있어, 간단하게 알아보겠습니다. 1. Thread Local Storage (TLS)란? Thread Local Storage (TLS), 우리말로는 스레드 지역 저장소라고 부릅니다. 이름에서 알 수 있듯이, 각 스레드(Thread)가 독립적인 저장 공간을 갖는 기능입니다. 일반적으로 전역 변수나 정적(static) 변수는 프로세스 내의 모든 스레드가 공유합니다. 이 때문에 여러 스레드가 동시에 공유 변수에 접근하여 값을 변경하면, 의도치 않게 경쟁 상태(Race Condition)가 발생할 수 있습니다. 물..

Programming/C, C++ 2025.06.12

[Qt] github에 push 하기 위한 win-ssh-askpass 대안 qtc-askpass

안녕하세요. github에 push 하기 위해 ssh-key 생성 시 암호를 설정했다면, Qt에서 원격지로 전송할 때 암호창이 나타나지 않아서 bash에서 수동으로 passphrase(암호)를 입력하는 경우 있을 겁니다. 설정창에는 기본으로 win-ssh-askpass 실행파일로 되어 있는데, 파일이 다운로드하거나 찾을 수 없어서 bash로 하는 경우가 있는데, qt에서 지원해 주는 ssh 암호창이 있어 공유해 봅니다. 1. github에 push 할 경우 문제 상황 로컬에서 git을 사용할 때는 원격지 전송이 필요하지 않기 때문에 문제가 없지만, 원격지로 push 하면 아래와 에러가 발생합니다. 특별한 설정을 하지 않았다면, win-ssh-askpass를 찾아 시도하지만, 파일이 없다고..

Programming/Qt 2025.06.08

[Qt] gRPC, Protocol Buffers 사용 시 라이브러리 추가 방법

안녕하세요. 두 개 이상의 프로그램 상에서 구조화된 데이터를 보낼 때 Serialized 해서 네트워크로 보냅니다. 최근에 구글에서 효율적인 데이터를 직렬화와 서비스 간 통신을 가능하게 해주는 기술(gRPC, Protocol Buffers)이 있다고 해서 확인해 보았습니다. 간단하게 내용을 확인하고 Qt에서 라이브러리 추가하는 방법 알아보겠습니다. 1. gRPC와 Protocol Buffers 간략한 개념 1) gRPC 란 gRPC는 Google이 개발한 고성능 오픈소스 원격 프로시저 호출(Remote Procedure Call, RPC) 프레임워크입니다. 서비스 간의 통신을 마치 로컬 함수 호출처럼 수행할 수 있도록 설계했고, 몇 가지 특징이 있습니다. HTTP/2 기반의 고속 전송..

Programming/Qt 2025.05.29