최근 수정 시각 : 2024-12-05 13:31:24

Qt(프레임워크)

Qt에서 넘어옴
파일:Qt_logo_2016.svg

파일:나무위키+유도.png  
은(는) 여기로 연결됩니다.
QT를 축약어로 쓰는 다른 문서에 대한 내용은 QT 문서
번 문단을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
참고하십시오.
1. 개요2. Qt 6 지원 플랫폼
2.1. Qt 공식 지원 플랫폼2.2. 그 이외 지원 플랫폼
3. 라이선스/서포트 정책4. Qt 라이선스 비용5. The Qt Company6. Qt Creator7. QML8. 타 언어로의 바인딩
8.1. Python Binding for Qt
8.1.1. PyQt6 설치 방법8.1.2. PySide6 설치 방법
8.2. Qt binding for Go (Golang)8.3. 기타 언어
9. 문서와 커뮤니티
9.1. 공식 문서9.2. 커뮤니티
10. Qt가 사용된 애플리케이션 / 플랫폼11. 기타


* 홈페이지 : https://www.qt.io
* 페이스북 : https://www.facebook.com/qt
* 인스타그램 : https://www.instagram.com/theqtcompany
* 유튜브 : https://www.youtube.com/user/QtStudios

1. 개요

Qt 원래는 'Trolltech'라는 노르웨이 회사였으나 2008년 노키아에 인수된 이후 핀란드 국적 회사로 바뀌었다. 다시 독립된 회사가 된 지금도 본사는 핀란드 에스포에 있다. C++을 주 언어로 사용하는 GUI 프레임워크. '큐트'라고 읽는다. C++와 QML이라는 자체 스크립트 언어를 기반으로 한다. 2024년 10월 기준 현재 최신 버전은 Qt 6.8 LTS와 Qt Creator 14.0.2이다. https://download.qt.io/archive/qt

"Write once, compile anywhere"[1]를 광고 문구로 사용하고 있으나 해외에서 데스크탑 크로스플랫폼 앱 일부에서 사용하는 정도다. 임베디드 쪽에서도 일부 사용된다고 광고를 하고 있으나 반도체사에서 공급하고 있는 임베디드 솔루션 쪽에서는 사용되는 경우가 없으며 C++ 개발로 한정하지 않는다면 타사의 크로스 플랫폼 프레임워크등 경쟁 프레임워크에 밀리고 있다.

하지만 다음과 같은 특징이 있다.
  • 컴파일러 기반 프레임워크임에도 크로스 플랫폼 지원
  • C++ 기반이기에 하드웨어 접근 가능
  • C++ 기반 프레임워크 중에서는 화려한 UI 구성 용이
  • MFC등과 같은 로우레벨 프레임워크와 Java,JS,C# 기반의 하이레벨 프레임워크 사이의 절충적인 위치
  • 소스 공개 시 무료, 특히 LGPL 사용시, Qt 프레임워크에 대한 수정없이 이용만 한다면 상업적으로 클로즈드 소스 이용가능[2]
이와 같은 특징 덕분에 다양한 배포판용 리눅스 GUI 프로그램 개발 시 쓰이는 경우가 있다. 크로스플랫폼 개발을 하고싶으나, Electron 같은 웹엔진 기반 라이브러리가 싫은 사람들중 일부가 사용한다.

초기에는 크로스플랫폼 GUI 라이브러리로 시작했고 UI 개발 도구, 번역 작업을 위한 도구와 C++ 개발에 필요한 많은 기능(UI, XML, 네트워크, SVG, Animation, Container Class 등등)을 제공하는 범용적인 응용프로그램 프레임워크가 되었다. 코드 베이스가 상당히 거대해지고 복잡하고 특히 국내에서는 사용자가 거의 없어 출시된 서적도 전무하다.[3] 미리 빌드된 라이브러리를 사용하지 않고 소스코드를 직접 빌드 할 때, 별도의 옵션 없이 기본값으로 빌드하는 경우 빌드시간이 오래 걸리는 것과 타 프레임워크들에 비해 다소 큰 바이너리가 생성될 수 있다. [4]

2. Qt 6 지원 플랫폼

2.1. Qt 공식 지원 플랫폼

Qt 6.8 LTS 기준. 다른 버전, 대응 컴파일러를 비롯한 자세한 내용은 https://doc.qt.io/qt-6/supported-platforms.html를 참조.

2.2. 그 이외 지원 플랫폼

이외에도 Qt Company, 다른 개발사, 오픈 커뮤니티 등에서 공식/비공식으로 지원 가능한 플랫폼이 존재한다.
참조 https://doc.qt.io/qt-6/supported-platforms.html
  • Tizen
  • Sailfish
  • BlackBerry 10
  • VxWorks
  • Embedded Android

3. 라이선스/서포트 정책

라이선스 비교는 http://www.qt.io/licensing-comparison를 참조할 것.

Qt 6.2 현재
  • 오픈 소스 라이선스
    • LGPLv3
    • GPLv3
    • 일부 모듈은 LGPLv3을 지원하지 않으며 GPL/상용 라이선스만 지원한다.
  • 상용 라이선스
    • Seat별 라이선스 계약이 필요하며, Embedded의 경우 디바이스 탑재 러닝 로열티가 추가로 부과된다. 특히 GUI framework인점을 감안한다면 러닝 로열티는 QNX와 같은 OS 라이센스에 맞먹는 수준으로 상당히 비싸다.
  • LGPL v3 도입에 따른 영향
    • Qt 5.7부터 LGPL v2.1이 폐지되었다. LGPL v3 상에서 개발할 경우 디바이스에 탑재되는 Qt Framework는 반드시 유저가 기기를 해킹할 수 있도록 만들어야 하는 조건이 생겼다.(Tivoization 방지) 이로 인해 인포매틱스 업체 등 디바이스에 Qt를 넣는 기업들은 유저의 해킹을 허용하는 방안을 생각하기가 힘드므로 Qt 5.6을 쓰던가 상용 라이선스를 구매해야 한다.
  • iOS의 동적 링크 라이브러리 미지원
    • iOS가 dylib을 지원한 건 8.0 버전부터이다. 아직 iOS 플랫폼용 Qt는 정적 링크 라이브러리만 지원하므로 LGPL 상에서는 Qt 사용자도 오브젝트 코드를 공개해야 한다. IP를 보호하고 싶으면 iOS에서는 상용 라이선스를 이용할 수밖에 없다.
  • 오픈소스 지원 축소
    • 5.15 부터 적용된 정책이며 Qt6 또한 포함된다.
    • 클로즈드 라이선스의 경우 이전과 동일하게 미리 컴파일된 바이너리가 제공되지만 LGPL/GPL의 경우 바이너리가 제공되지 않으며 직접 컴파일해서 사용해야 한다.
    • 소스코드 또한 LTS 부분은 공개되지 않으며 상업용 라이선스를 계약한 고객에 한해서만 제공된다.

4. Qt 라이선스 비용

공식 기술지원이 없는 커뮤니티 라이센스의 경우 무료로 사용가능하나 Qt 라이브러리의 대부분이 LGPLv3이고 Qt Charts와 같은 모듈은 소스코드를 공개해야하는 GPLv3 라이센스를 사용한다. LGPL 및 GPL에 해당되는 모듈은 해당 라이센스 의무사항이 있으므로 반드시 검토 후에 사용하자. 오픈소스 라이센스 조항을 지키고 싶지 않거나 기술지원을 받으려면 상업용 Qt 라이센스를 구입하여야 하며 회사의 사업(매출, 직원 수)규모에 따라 다를 수 있으므로 직접 문의해보거나 마켓플레이스에서 견적을 내볼 수 있다. 국내 대부분 기업의 경우 이러한 LGPL/GPLv3의 사용을 엄격하게 금지하고 있다.

2020년 3월 26일부터 Qt 스몰 비즈니스 라이센스는 데스크톱/임베디드/모바일 불문하고 연간 499달러이며 스몰 비즈니스 책정 한계는 10만 달러에서 25만 달러로 변경되었다.

5. The Qt Company

원래 트롤텍이라는 회사에서 개발했으나 노키아가 트롤텍을 인수한 이후에는 노키아에서 관리하였으며, 2012년 8월 9일 Digia에게 넘어갔다. 2016년 The Qt Company라는 이름으로 Digia 자회사로 독립하였다.

==# Qt 4 vs Qt 5 #==
2022년 6월 기준 공식적으로 지원하는 메이저 버전은 Qt 5, 6이다. Qt 4는 2015년 12월 이후 신규 클라이언트를 받지 않고 있으며 고객 지원도 종료되었다.

Qt 4와 Qt 5는 개발 이념에 상당한 차이가 있다.

Qt 4
  • 개요
    최신 버전은 4.8.7. 2015년 상반기에 릴리즈 후 더이상의 추가 개발은 이루어지지 않고 있다. 2015년 12월 19일을 기점으로 더이상의 서포트 계약을 받지 않고 있다. 다만 기존에 서포트를 받았던 고객은 4년간 더 계약연장이 가능하다고 공표하였으며, 이는 어디까지나 Qt 5에 대한 마이그레이션에 시간이 필요한 고객을 위한 조치라고 한다.
  • 개발 이념
    • 어플리케이션 프레임워크
      단순히 GUI 프레임워크가 아닌, DB, XML, Script, Network, Web, 멀티미디어 등 어플리케이션 개발에 필요한 모든 기능을 넣은, '어플리케이션 프레임워크'를 표방한 것을 알 수 있다. 이로 인해 다른 라이브러리의 이용을 최소한으로 줄이고 Qt만으로 상당한 부분을 개발 가능하게 되었다.
    • 데스크탑 OS 지원이 메인, 이후 모바일 플랫폼에 이식
      데스크탑용 어플리케이션 개발에 최적화되어 있다. 기본적으로 C++ API를 제공하며, 공식적으로 자바스크립트 바인딩을 제공한다. 최신 버전의 Qt Creator에서도 Qt 4 개발을 지원한다. 이후 Qtopia, Windows Embedded, Symbian, Meego 등의 모바일 플랫폼에 이식되었으나, 모바일용으로 쓰이기에는 한계가 많았기에 아키텍처를 대대적으로 변경할 필요성이 대두된다.
    • 그래픽 백엔드
      플랫폼의 네이티브 그래픽 프레임워크를 사용하나, 플랫폼의 위젯관련 API는 거의 사용하지 않는다. 예를 들어, Windows의 경우 GDI+를 기반으로 하나, MFC를 이용하지 않으며, 버튼 등의 위젯도 Win32 API를 이용하지 않고, 자체적으로 Windows의 룩앤필을 그대로 모방하였다. 자세히 보면 버튼이나 메뉴 등의 디자인이 Win32/MFC 어플리케이션과 약간씩 다른 것을 알 수 있다.

Qt 4.5 이후
Qt 개발사였던 트롤텍이 노키아에 합병된 이후 노키아의 플랫폼에 Qt를 전면으로 내세움에 따라 개발 전략이 급격히 바뀌게 된다.
* 전면적인 LGPL의 도입
* 심비안 / 미고의 플랫폼용 API로 완전 커버
* 모바일에 최적화된 UI 개발
* Python Binding인 PySide
* IDE인 QtCreator 개발 전폭 지원
하지만 3년도 되지 않아 노키아가 Qt 중심의 플랫폼 전략을 철회하고 Qt 개발팀을 Digia사에 매각한다. 이에 따라 모든 개발 로드맵은 취소 혹은 전면 수정된다. 유일한 이득은 LGPL 라이선스와 Qt Creator(IDE 기반의 개발 환경) 그리고 QML.

Qt 5
  • 개요
    최신 버전은 5.15. Qt 5는 초기 개발 이념이 Qt 4와 상당히 다른데다가, 초기 악평이 많아서 많은 어플리케이션 개발자들은 Qt 5로의 개발을 보류중이다. Qt 5.0, 5.1, 5.2까지는 Qt 컨설턴트들도 사용을 극구 말릴 정도.
  • 개발 이념
    • QML(Qt Quick Markup Language)의 전면 부상
      Qt 5 프레임워크 자체는 C++로 개발되어 있고 C++ API를 제공하나, 핵심 기능은 전부 QML + JavaScript API를 통해 개발이 가능하도록 한다. Qt 5의 가장 중요한 이념이라 할 수 있다. QML은 Qt에서 제공하는 독자적 개발 언어로, 문법은 CSS와 닮았으며 JavaScript를 섞어서 사용한다. 참고로, QML이 무엇의 약자인지는 Qt 개발자들도 모른다고 한다. 공식적으로도 Qt에서는 QML이 무슨 약자인지를 설명하고 있지 않다. 하지만 윈도우 탐색기의 확장자 설명에 적혀 있는 바에 따르면 Qt Quick Markup Language를 의미하는 것으로 보인다.
    • 그래픽용 백엔드
      그래픽용 백엔드는 더 이상 GDI+ CoreGraphics등의 플랫폼의 네이티브 API를 사용하지 않고 OpenGL / OpenGL ES / DirectX / Vulkan를 사용한다. 이로 인해 플랫폼에서의 OpenGL API 제공이 필수가 되었지만, 반대로 별도의 그래픽용 API를 제공하지 않아도 간단히 Qt를 포팅할 수 있게 되었다.
    • 메이저 모바일 플랫폼 지원
      안드로이드와 iOS를 전폭적으로 지원한다. (노키아가 Qt를 버리지 않았으면 불가능했을 수도...)
      특히 iOS의 경우 앱 배포시 문제가 되었던 자바스크립트 엔진 V8의 runtime compile과 Native WebView 문제가 Qt 5.4, 5.5에서 해결되면서, iOS용 앱 개발에 대한 제한이 상당부분 사라지게 되었다.
    • UI를 비롯하여, 모바일 플랫폼에 최적화된 기능을 QML로 제공하는 것을 우선 → 이후 데스크탑용 UI를 QML로 제공
      QML용 UI 모듈은 Qt Quick 라이브러리를 통해 가변 화면, 플리킹, 멀티터치 등 모바일에 최적화된 UI를 제공한다. 한동안은 Qt Quick의 기능/성능이 어떻게 평가되느냐에 따라 Qt 5의 운명이 결정될 듯. Qt 5.3부터는 데스크탑용 UI인 Qt Quick Control도 제공한다.
    • QWidget
      기존의 데스크탑용 C++ UI 모듈은 Qt 4에서는 기본으로 포함되어 있었으나 이제는 반드시 다른 라이브러리처럼 직접 프로젝트 파일에서 설정해 주어야 한다.
  • 전망
    • 모바일 플랫폼
      Qt 5.5부터 안드로이드, iOS 지원이 상당한 완성도를 보여주고 있기 때문에 다른 크로스 플랫폼 개발환경 (HTML5, Corona 등)과 경쟁이 이루어질 듯하다.
    • 데스크탑 플랫폼
      C++ API에서는 이미 크로스 플랫폼의 최강자. C++용 QWidget 모듈을 이용하여 기존의 Qt4 식으로 데스크탑용 어플을 개발하기에 큰 부족함이 없다. 데스크탑용 QML 라이브러리인 Qt Quick Control은 C++ QWidget에 비해 완성도가 많이 떨어지므로 간단한 어플 / 프로토타입 개발에만 사용하는 것이 좋다. 다만, 크로스 플랫폼의 최강자이기는 하나 최신의 닷넷 UI에 비해서는 확실히 구식이기 때문에 C++/크로스 플랫폼이 필수가 아닌 프로젝트라면 닷넷이 더 사용하기 편하다.
    • 임베디드 플랫폼
      Qt에서 요새 밀고 있는 분야로, Qt 5에서 그래픽 부분을 떼어 놓고도 작동 가능하기 때문에 IoT 기기에 포팅하기에 최적화 되었다는 것에 중점을 두고 마케팅 중이다.
    • Ubuntu가 Qt4/QML 때문에 한 번 욕을 단단히 먹고 나서 현재는 다른 UI를 사용중이나 향후 (버전 14 이후)에는 Qt5/QML2을 사용하는 것을 긍정적으로 검토중이다.
      https://wiki.ubuntu.com/UnityNextSpec
      다만 Ubuntu는 자체 DE 개발을 버리고 GNOME/GTK를 사용하는 것으로 선회한 상태라 아무 의미 없어진 상태다.


Qt 5.5
2015년 7월 1일 릴리스 되었다.
  • 3D & OpenGL
    Qt Canvas 3D, Qt 3D 두 개의 모듈이 추가
    • Qt Canvas 3D는 Qt 5.4 버전에서 테크놀로지 프리뷰로 발표된 모듈. 이번 버전에서 정식판으로 편입됨.
      • WebGL과 같은 API를 QtQuick에서 사용가능
      • 저수준의 API이나 three.js같은 WebGL용 라이브러리를 사용 가능
    • Qt 3D는 5.5에서 테크놀로지 프리뷰로 발표 (아직 정식판 아님). 5.6에서 정식판 편입 예정
  • Qt Quick & Multimedia
    • QML Engine의 버그 수정, 성능 향상 이루어짐
    • JavaScript의 array를 지원.
    • new 메소드로 유저 독자 타입을 작성하기 위한 인터페이스가 추가.
    • 기존의 사용 버전에서만 사용가능했던 Qt Quick Enterprise Controls가 오픈소스 버전의 Qt Quick Controls에 통합됨.
    • TreeView 추가
    • Qt Quick Controls의 라이선스가 LGPLv3으로 변경
  • Qt WebEngine & WebView
    • Qt WebEngine은 Chromium 40을 기반
    • 파일 다운로드, 캐싱, 쿠키, 설정에 관한 API가 추가
    • Qt WebChannel 기능 탑재. 보다 편리하게 WebChannel을 사용 가능.
  • Qt WebView 모듈 ( 네이티브의 WebView 래퍼)
    • 지원 플랫폼이 iOS, Android, OSX로 확대
    • API 추가
  • Qt Location
    • 맵의 패스파인딩을 제공하는 Qt Location 모듈이 테크놀로지 프리뷰 버전으로 등장
    • Qt 5.6에서 정식 버전에 포함될 듯
    • 매핑 프로바이더를 선택가능 - Nokia Here, Mapboc, Openstreet map
  • 그외
    • RedHat Enterprise Linux의 지원이 개선됨
    • OS X 10.8, 10.9, 10.10을 지원
    • Windows 10은 5.5.x에서 지원할 계획
  • 개발 종료된 모듈
    • Qt Webkit, Qt Declarative(Qt Quick1), Qt Script 모듈은 종료.
      Qt5.5에서도 사용은 가능하나, 대체 모듈이 이미 있으므로 개발 종료.

Qt 5.6
2016년 3월 16일 릴리스 되었다.
  • Qt Core, Qt Network 등
    • 성능 향상, 메모리 최적화, 편의를 위한 API 추가
  • Qt GUI
    • OpenGL ES 3.0 / 3.1 대응 개선
    • high-dpi 지원 개선
    • 16bit Rendering 지원
  • Qt Widget
    • Dock 관련 기능 대폭 개선
  • Qt 3D
    • 아직까지도 정식판 발매되지 않음 (Technology Preview)
  • Qt Quick Controls 2.0
    • 임베디드/모바일에서 동작하기 위한 경량 컨트롤 제공
    • 템플릿 시스템 기반 커스텀 스타일 기능
    • 기본 제공 스타일 (기본, 매터리얼, 유니버설)
  • LTS (Long-term support)
    • 3년간 지원을 보장

Qt 5.7
2016년 6월 16일 정식 릴리스 되었다. 5.6이 나온지 3개월밖에 안됐는데 벌써 나왔다.
  • C++11을 지원하는 컴파일러에서만 동작
    • 반대로 말하면 C++11을 지원하지 않는 환경을 더이상 지원하지 않는다.
  • 라이선스
    • LGPL v3
      • Qt 기본 프레임워크는 LGPL v3를 지원한다.
    • GPL v3, 상용 라이선스
      • Qt Creator, Qt Charts, Qt Data Visualization, Qt Virtual Keyboard등은 LGPL 대상에서 빠졌다.
    • 이전과 달리 Qt는 LGPL v2.1을 더이상 적용하지 않는다.
  • Qt 3D
    • Technical Preview라는 딱지를 떼고 정식으로 지원하는 모듈이 되었다.
  • Qt Quick Controls 2 완벽지원
    • 처음부터 데스크탑용으로 나온 1과 달리 이번 2는 모바일/임베디드에서의 사용을 고려하여 빠른 성능을 목표로 개발되었다.
  • Qt Creator 4.0
    • Qt Quick Designer를 대대적으로 업그레이드하였다.

Qt 5.8
2017년 1월 23일 정식 릴리즈 되었다.
  • QtQuick 렌더링이 OpenGL 의존에서 벗어나 Vulkan이나 Direct3D 등의 백엔드에서 렌더링 가능하도록 개선되었다.
  • 새 모듈의 등장
    • Qt Wayland Compositor
    • Qt SCXML
    • Qt Serial Bus
  • 새 플랫폼 지원
    • Apple tvOS (technology preview)
    • Apple watchOS (technology preview)

Qt 6.0
2020년 12월 8일 정식 릴리즈 되었다.
자세한 내용은 https://www.qt.io/blog/qt-6.0-released를 참조할 것

Qt 4에서 Qt 5로 이전
Qt 5는 Qt 4와의 바이너리 호환성, 소스 호환성 모두 공식적으로 지원하지 않는다. 하지만 몇몇 코드를 수정함으로써 간단히 Qt 5로 이전 가능하다. 자세한 내용은 https://wiki.qt.io/Transition_from_Qt_4.x_to_Qt5를 참조할 것.
주로 변경할 6가지 사항은 https://qiita.com/yasumodev/items/b304966f6999fbea920d를 참조하며, 이는 리눅스 / 윈도우 공통 사항이다. 특히, Qt4 프로젝트를 연동할 때, greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 이 부분은 잊지 말고 꼭 넣어주도록 하자.
==# Qt 5 모듈 구성 #==
Qt 5는 개발 정책, 라이선스에 따라 몇 가지 카테고리로 나누어져 있다.

Qt Essentials
위 항목의 공식 지원 플랫폼을 모두 지원하는 표준 모듈
  • Qt Core
    모든 모듈에서 사용하는 코어 클래스들을 제공하는 모듈. 그래픽 관련 기능은 들어있지 않음.
  • Qt GUI
    GUI 관련 기능을 제공하는 기본 클래스들. OpenGL을 포함하고 있음.
  • Qt Multimedia
    오디오, 비디오, 라디오, 카메라 기능을 가진 클래스들.
  • Qt Multimedia Widgets
    멀티미디어 기능을 위젯 기반으로 제공하는 클래스들.
  • Qt Network
    보다 편리하게 네트워크 기능을 사용하기 위한 클래스들.
  • Qt QML
    QML과 자바스크립트 언어를 지원하는 클래스들.
  • Qt Quick
    커스텀 유저 인터페이스를 비롯한 고수준의 동적 어플리케이션을 개발 가능한 프레임워크
  • Qt Quick Control
    기존의 데스크탑 스타일의 유저 인터페이스를 개발하기 위한 Qt Quick 기반의 UI 컨트롤을 제공
  • Qt Quick Dialog
    Qt Quick 어플리케이션에 시스템 다이얼로그를 제공
  • Qt Quick Layouts
    Qt Quick2상에서 아이템의 레이아웃 기능을 제공
  • Qt SQL
    SQL 기능을 Qt에 통합
  • Qt Webkit
    Webkit2 기반의 클래스와 QML용 API를 제공
  • Qt Webkit Widgets
    Webkit1과 QWidget 기반의 클래스들
  • Qt Widgets
    Qt4에서 사용되었던 C++ Qt GUI 클래스들

Qt Add-Ons
지원하는 플랫폼에 제한이 있음. 향후 공식 플랫폼을 모두 지원할 경우 Qt Essential이 될 수 있음.

Value-Add 모듈
상용 라이선스에서 사용하는 추가 모듈들. 오픈소스가 아님.

Technology Preview 모듈
현재 개발 / 리뷰 중인 모듈. 오픈소스로 개발이 진행됨.

Qt Tools
Qt 개발 생산성을 높이기 위한 툴들

6. Qt Creator

Qt 프레임워크 개발을 위한 통합 개발 환경.

Visual Studio(2022)용 플러그인도 존재하는데, 이 플러그인은 그저 Visual Studio에서 Qt를 쓸 수 있게 환경을 만들어주는 것이고 기본적으로는 Qt 자체가 미리 설치되어 있어야 한다. 여기에서 official_releases/ → online_installers/ → 각 OS에 맞는 실행 파일을 클릭해 통합 인스톨러를 다운받고 상용 라이선스를 사용하고 싶다면 해당 라이선스가 활성화된 계정으로, LGPL 라이선스를 사용하고 싶다면 무료 계정으로 로그인하거나 비로그인 상태로 진행하면 된다.

설치가 끝나면 Qt를 Visual Studio와 연동시켜야 한다. 우선 Qt를 설치할 때 같이 깔리는 Qt Creator를 실행한 후, Tools → Options → Build & Run → Qt Versions 탭으로 들어간다. 'Auto-Detected' 항목 아래의 Qt 버전을 클릭하면 밑에 버전의 이름 및 qmake의 경로가 표시된다. 그리고 Visual Studio 2022에서 Qt 플러그인을 설치한 뒤 상단의 Qt VS Tools → Qt Options → Qt Versions로 들어간 다음, 'Add'를 누르고 방금 Qt Creator에서 확인한 버전 이름과 qmake 경로의 \\bin 이전까지를 입력하면 연동이 완료된다.

7. QML

QML (Quick Markup Language)은 JavaScript 엔진 위에서 돌아가며, GUI 디자인에 특화된 배우기도 쉽고 사용하기도 쉬운 선언형 언어이다. 기본적으로 문법은 JSON과 유사하며 동적인 요소는 JavaScript로 작성하게된다. 또한 C++ 컴포넌트와 긴밀한 통합 및 확장이 가능하다. 예를들어, QML에서 선언된 객체의 함수를 C++에서 호출할 수 도 있고 C++로 작성한 객체를 QML에서 선언할 수도 있다. QML만으로 전체 애플리케이션을 작성할 수 도있지만 UI과 직접적인 관련이 없는 기능들[5]은 C++에서만 구현이 가능한 경우가 많기 때문에 일반적으로 웹으로 비유할때 백엔드는 C++에서 프론트엔드는 QML이 담당하게된다. QT(QML)로 래핑되지 않은 모듈은 해당 플랫폼의 네이티브 코드로 직접 플러그인을 만들 수 도 있다.

QML의 큰 특징중 하나는 바인딩 이다. C++ 또는 QML에서 선언된 Property는 QML에서 바인딩이 가능하다 [6] 바인딩이되면 Property의 값이 바뀔때마다 해당 블럭이 리프레쉬 되어 복잡한 코드 없이 값을 최신 상태로 유지가 간편하다. 다만, 블럭 내부의 Property가 하나만 바뀌어도 블럭의 전체 문단이 리프레쉬 되는데, 이는 C++ 이점을 버리는 것 이상의 성능 저하가 발생한다. 또한 무한루프도 발생시킬 수 있다.

여담으로 QML은 배우기도 쉽고 쓰기도 쉽고 가독성도 좋고 생산성도 좋은건 사실이지만, 유지보수는 상당히 좋지 않다. 코드 자동 완성기능 수준도 매우 낮고 일정 규모의 프로젝트가 되면 QML만으로 전체 프로그램을 작성하는것은 어려워서 C++을 같이 사용할 수 밖에없는데 코드 리팩토링이 필요할 경우가되면 C++과 QML를 따로 리팩토링 해야한다... 심지어 QML의 리팩토링 자체도 메모장으로 리팩토링 하는것과 크게 다르지 않는 수준이고 핫 리로드도 지원히지 않고 디버깅도 처참해 개발자 편의성이 최악이라 봐도 무방한 수준이다.

결국 이와 같은 단점을 극복하지 못하고 처참하게 실패했다. 사실상 QML을 사용하는 Qt 개발자는 없을 정도.

8. 타 언어로의 바인딩

8.1. Python Binding for Qt

파이썬 바인딩으로 PyQt와 PySide가 주로 사용된다.

PyQt는 GPL과 동시에 상업적 사용 혹은 GPL을 벗어난 사용을 원하는 사람을 위한 상용 라이선스를 판매하고 있으며, PySide는 LGPL, GPLv2, 상용 라이선스를 복수 사용하고 있다. 사실 초기에는 PySide가 없었고 PyQt만이 존재했었다. 그래서 당시 Qt의 저작권자였던 노키아가 PyQt의 개발사인 Riverbank Computing에게 자사와의 제휴와 더불어 PyQt의 저작권을 Qt 원본처럼 LGPL로 변경할 것을 제안했으나 거절당했고[7] 이에 노키아가 직접 Python용 Binding을 하나 더 제작하기로 결정해서 탄생한 것이 PySide다. 이후 Qt Company가 노키아로부터 분리될 때 PySide에 대한 권리까지 같이 승계되어서 지금까지 내려오고 있다.

Qt Company가 2016년 4월 부로 PySide 프로젝트를 공식 지원하겠다고 발표했다.
프로젝트의 목표는 PySide2가 Qt5 프레임워크의 일부로서 동시에 릴리즈되는 것이라고 한다.[8] Python으로 Qt 개발한다고 하면 PyQt부터 시작하는 편이어도, 차후에는 PySide가 메인이 될거라고 전망했지만[9], 2022년 현재까지도 PyQt 쪽이 구글에서 얻을 수 있는 정보가 압도적으로 많다. pip로 설치된 패키지의 바이너리의 크기도 PyQt 쪽이 작아, 배포판의 크기를 줄여야 한다면 GPL 라이센스의 압박만 아니면 이쪽이 더 유리하다.[10]

8.1.1. PyQt6 설치 방법

PyPI로 설치하는 방법
pip install PyQt6

그런데 브라우저를 구현하기 위해서는 pyqtwebengine을 따로 설치해야 한다. 반드시 PyQt6를 설치한 이후 pyqtwebengine을 설치해야만 한다. 방법은 다음과 같다.
pip install pyqt6
pip install pyqtwebengine

이미 한 번 다운로드했으면 uninstall하여 지우고 다시 설치할 때 뒤에 --upgrade 옵션을 붙여주면 된다.
anaconda를 사용할 시 다운방법은 다음과 같다.
conda install pyqt6

그런데 anaconda를 사용해도 pip로 설치하는 것이 좋다. 왜냐하면 일단 anaconda에서는 pip보다 훨씬 버전이 낮은 pyqt를 지원하는데다가 호환성문제 검사한다고 다운로드 시간이 길다. 그리고 pyqtwebengine이 실행이 되지 않는다.

8.1.2. PySide6 설치 방법

PyPI로 설치하는 방법
pip install PySide6 # For the latest version on PyPi

8.2. Qt binding for Go (Golang)

8.3. 기타 언어

Node.js용 바인딩으로 nodegui가 있다. React를 UI 제작에 사용할 수도 있다. 다만 2019년에 시작된 프로젝트라서 지원되지 않는 컴포넌트도 많고, Node.js를 커스텀한 빌드를 사용하기 때문에 원래는 없는 문제가 생길 여지도 있다.

9. 문서와 커뮤니티

9.1. 공식 문서

API 레퍼런스, 튜토리얼 등의 문서가 아주 잘 구비되어 있다. (영어)
참고로 이렇게 잘 설명된 문서는 거의 찾아보기 힘들다. 상당히 직관적이어서 조금만 익숙해지면 상당히 깔끔하게 프로그래밍이 가능하다.
참고: 유튜브에는 VoidRealms이라는 아이디를 가진 개발자가 가장 기초가 되는 QT의 각 클래스들을 하나씩 하나씩 약 10분 내외의 짧은 영상으로 설명해 둔 것이 있다. 물론 영어로 되어 있지만 처음부터 코딩을 해나가면서 진행하기 때문에 영어가 조금만 되면 문제없이 이해할 수 있을 정도이다.

9.2. 커뮤니티

http://forum.qt.io/에서 Qt 관련 지식을 질의응답 가능하며 Stack Overflow에서도 질의응답이 활발히 이루어지고 있다.
한국어 커뮤니티는 https://wiki.qt.io/Main/ko http://qt-dev.com, http://korone.net이 있다.

10. Qt가 사용된 애플리케이션 / 플랫폼

찾기 쉽게 알파벳 / 가나다순으로 정리했다.

11. 기타

2015년 5월 20일자로 Qt 20 주년을 맞이하였다. https://blog.qt.io/blog/2015/05/20/happy-20th-anniversary-qt

Qt Company 서울 오피스가 있다. 일본의 경우 Qt Company Japan 이 업무를 담당하고있으며, 2002년부터 파트너사였던 SRA가 최근 일방적 계약해지를 당하면서 Qt 업무분담을 줄여나가고 있다.

초보자들을 위해 Qt Designer라는 위지위그 방식 툴이 있다. 저장될 때는 .ui 방식으로 저장되며, 이 .ui 방식을 소스 파일에서 loadUi하며 실행하는 방식이다.

파이썬으로 GUI를 짜는데 외부 라이브러리들[13]이 사용감이 후지다면 그냥 PyQt로 UI를 드래그 앤 드롭으로 배치하고 소스를 파이썬 연동으로 출력한 다음, 본래 기능이랑 이어주면 끝이다. 그래서 C++ 오픈소스지만 파이썬으로도 많이 쓰는 편이며, 파이썬 사용자가 늘어나면서 PyQt를 이용하는 사람도 점점 늘어나고 있다. 그리고 윈도우, 리눅스, MacOS 등 OS에 구애받지 않기 때문에 여러 곳에서 사용이 가능하다. 또한 유서깊은 툴킷이므로 커뮤니티가 매우 잘 발달되어 있어 유튜브, Qt 커뮤니티, 스택 오버플로우에서 관련 정보를 획득하는 것이 쉽다.

이외에도 다른 언어를 활용하기가 쉬운데 QWidget을 상속한 모든 클래스에서 setStyleSheet를 이용해서 css 파일을 사용하여 편집할 수 있다는 강력한 장점이 있다. 또한 웹엔진을 깔았을 때 자바스크립트와도 연동이 가능하다.

단점이 있다면 프레임리스 윈도우(self.setWindowFlags(Qt.FramelessWindowsHint)로 구현 가능) 관련해서 지원을 잘 못해준다. 특히 윈도우즈 환경에서 그렇다. 크롬이나 에지, 스팀과 같은 프로그램을 보면 메모장처럼 기본적인 타이틀바를 지원해주지 않고 커스터마이징 된 타이틀바를 지원해주는데 이 타이틀바를 이동하거나 리사이즈할 경우 프레임이 생긴다. 그런데, Qt 프레임리스 윈도우는 기본적으로 리사이즈 불가능, 이동 불가능이다.

이동은 프레임 유무 따지지 않고 mousePressEvent 등의 마우스 이벤트를 적절히 활용하면 구현이 그렇게 어렵지 않고, 커서 모양 변경 또한 어렵지 않으나 문제는 리사이즈이다. Qt에서 제공하는 QMainWindow 혹은 QDialog 전용 사이즈 조절 기능을 지닌 QSizeGrip은 오른쪽 아래 방향으로만 조절 가능한데다가 워낙 올드해서 요즘은 사용하지 않기 때문에, 직접 리사이즈 기능을 만드는 수밖에 없다. 오른쪽, 아래쪽 사이즈 조절은 self.rect().setRight()나 setBottom()을 이용하면 그렇게 어렵진 않으나 문제는 왼쪽 혹은 위쪽이다. 왼쪽 혹은 위쪽으로 사이즈 조절 시 윈도우가 오차로 인해 조금씩 덜덜 떨리는 현상이 관측된다. 이것은 서양 Qt 커뮤니티에서 상당한 화두이다. qrc로 이것을 해소할 수 있기는 하나 qrc가 아니라 qt만으로 이것을 해소하는 것은 아직은 요원해 보인다.

프레임리스 타이틀바가 아니라 커스텀 타이틀바 힌트를 줄 수도 있지만 이같은 경우 윈도우에서 꼭 위에 하얀색 띠가 나온다. 이 타이틀바는 스타일을 전혀 바꿀 수 없다. 타이틀바 기능 지원이 윈도우 OS에 대해서는 macOS나 리눅스에 비해서 매우 조악한 편이며 Qt Documentation에도 윈도우 환경이 Qt를 잘 지원해주고 있지 않다고 설명되어 있다.

Qt 5.15 부터는 이 기능을 OS에 맞는 스타일로 제공해주는 startSystemMove와 startSystemResize 함수가 추가되어 이 부분을 어느 정도 해결하였다. Qt5의 5.15 미만에서는 이 기능을 지원해주지 않기에 업데이트가 필요하다. 커서 모양 바꾸기는 여전히 스스로 작업해야 한다.

또다른 단점은 다른 신형 소프트웨어 개발 툴킷에 비해서 UI가 현대화되어 있지 않다는 점이 있을 것이다. Qt 자체적으로는 윈도우 XP/7 시절의 디자인이 디폴트인 상태로 머물러 있다. QML/CSS/QGraphicsEffect/QPaintEvent 등 다양한 방식의 스타일링을 활용할 수 있다면 이 부분은 해결할 수 있지만 많은 것을 공부해야 하므로 Qt 스타일링은 진입장벽이 높다.

CSS 또한 전부 지원해주지 않는데, 애니메이션이나 함수를 지원해주지 않는다. 그러나 애니메이션 같은 경우는 QAbstractAnimation 등 자체 Qt 함수를 이용하여 대처할 수 있으나, CSS 리소스 파일과 스크립트 파일을 동시에 관리해야 하므로 혼란스러울 수 있다. 그리고 동적 CSS라 불리는 SASS와 같은 경우는 qtsass 등 다양한 패키지들을 이용하여 qt에 적절히 이용할 수 있다.
외국에서는 임베디드 분야에서 매우 각광받고 있고 데스크톱 소프트웨어에서도 여전히 굳건한 위치를 고수 중이다.[14] 소스코드를 몽땅 공개해야하는 GPL 프로그램에서도 GPL의 소스 공개 조항에 거리낌이 없다 보니 주로 쓰인다. 기본적으로 Qt는 데스크탑용 라이브러리로 시작했다 보니 모바일과 같은 플랫폼에 대한 지원은 상대적으로 좋은 편은 아니지만 Qt를 다루는 실력이 좋다면 사용해 볼 만하며, 웹과 연동된 소프트웨어도 잘 지원하는 편이나 Qt 전용 웹뷰 패키지를 따로 깔아야 한다는 것이 단점이기는 하다. 일단 한국의 SI시장의 경우 대부분 데스크탑용 프로그램 조차도 웹으로 개발하거나 아예 스탠드얼론이어도 일렉트론같은 사실상 별도의 브라우저를 띄우는 방식이고 네이티브 데스크탑 용으로 만드는 업체가 MFC로 만들어진 레거시 프로그램들의 유지보수를 제외하면 거의 없다 보니 Qt를 사용하는 업체가 외국에 비해서 상당히 희소한 편이다.

PyQt 생활코딩 페이지
PySide
PySide 한국어 번역(일부)


[1] Java의 메인 슬로건인 "Write once, run anywhere"를 비튼 것이다. [2] 대부분의 컴파일러 기반 프레임워크들은 상업용 유료, 개인용 무료 방식을 취하는것에 비해 매우 특이한 방식이다. 즉 GPL/LGPL 만 준수한다면 기업도 무료로 사용가능하다. [3] 한국 특유의 한쪽으로만 쏠리는 점은 Qt에만 국한되는 문제가 아니긴 하지만... [4] wxWidgets이 Shared에서 15MB, Static에서 4MB이하, Nana가 3.4MB, JUCE가 10MB 이하인 것에 비하면 Qt는 126MB의 의존성이 필요하며 그에 따른 기본적인 메모리 점유율이 높은 편이다. 물론 C++가 아닌 프레임워크들이 브라우저 + Node.js들을 주렁주렁 달고 다니는 무거운 Electron.js React Native, Flutter들과 같이 웹 기술을 기반으로 하고 있는 프레임워크들에 비하면 훨씬 가벼운 편. Qt를 사용해서 가볍게 프로그램만 배포하려면 Qt에서 가장 큰 부분을 차지하고 있는 QtWebEngine을 제외하고 빌드하면 된다. [5] 예를들어 TCP/IP 또는 클라이언트에 연결된 하드웨어들을 제어하는 모듈은 QML에서 바로 사용할 수는 없고, C++ 객체를 만들어서 QML에서 Invoke를 하거나 QML 플러그인을 직접 만들어야한다. [6] Qt 6 부터는 C++에서도 바인딩을 사용할 수 있다. [7] 여기서 Riverbank사의 공식 입장을 확인할 수 있는데, GPL 라이선스를 고집하는 이유는 자유 소프트웨어 재단에서 주장하는 자유 소프트웨어 공동체로부터의 독점 소프트웨어 개발자들에 대한 압박 같은 것과는 관계 없이 오로지 현재로서는 PyQt 이외의 수익 모델이 없기 때문에 PyQt 상용 라이선스의 판매를 위해서라고 한다. [8] *nix 계열에서 데스크탑 앱을 개발하기가 한결 쉬워질 듯. [9] Christian Tismer( PyPy 개발자 중 한 명) : Well, PyQt is a different thing from Riverbank Computing and not connected to TQC. PySide will become the real thing. At least that is the plan ;-) [10] 예를 들어 PyQt6.2.3 및 PySide6.2.3에 포함되는 바이너리 중 QtGui.pyd, QtCore.pyd, QtWidgets.pyd의 크기의 합은 각각 7,415,680 bytes와 15,039,816 bytes이다. [11] 럼버야드가 먼저 MFC를 Qt로 대체해서 한달 먼저 공개됐는데 크라이엔진 5가 럼버야드를 보고 따라서 바꾼 것인지 원래 바꾸려고 했던 것인지는 알 수 없으나 Qt로 변경한 시점인 2016년을 생각하면 2015년에 업데이트를 중단한 MFC를 대체해야하는 일은 필수 불가결했을 것이다. [12] 원래 wxWidgets를 사용하였으나, Qt로 이전하였다. [13] Tkinter, PyGTK, wxPython 등이 있지만 PyQt, PySide가 가장 세련된 결과물을 보여준다고 평가받고 있다. Tkinter는 Python Foundation 공식 기본 라이브러리인데도 플랫폼에 따라서 레이아웃이 조금씩 변형되고, 그나마 멀쩡하게 출력되어도 모습이 투박한 등 못써먹을 물건 취급이다. [14] 크로스 플랫폼으로 제작해야 하는데, C++ 을 사용한 최적화가 필수적인 경우에 대해서 매우 유리한 위치에 있는 프레임워크이다. 다른 C++ 프레임워크들에 비하면 다루기 쉬운편이며, 소스를 공개한다면 무료라는점도 한 몫 한다. 소스를 공개하지 않는다고 해도 다른 프레임워크보다 크게 비싸다고 보기 어렵다.